Valgrind 学习篇 – memcheck
瓦尔格隆德
本文只是对memcheck进行学习
学习资料:
官网主页: http://valgrind.org/
Valgrind用户手册 : http://valgrind.org/docs/manual/manual.html
CSDN 博文 :
https://blog.csdn.net/andylauren/article/details/93189740
https://blog.csdn.net/u010122972/article/details/78214174
一、Valgrind
Valgrind是GPL的系统,用于调试和分析Linux程序。
- 自动检测许多内存管理和线程错误;
- 执行非常详细的性能分析;
- 可以在没有源代码的程序上使用Valgrind
- Valgrind可在几种流行的平台上运行,例如 x86/Linux, AMD64/Linux and PPC32/Linux
二、Valgrind的工具套件 (Tool Suite)
2.1 Memcheck
内存检查
Memcheck可检测内存管理问题,并且主要针对C和C++程序。在Memcheck的监视下运行程序时,将检查所有内存读取和写入,并拦截对malloc / new / free / delete的调用。
- 访问它不应该访问的内存(尚未分配的区域,已释放的区域,堆块末尾的区域,堆栈的不可访问区域)。
- 以危险的方式使用未初始化的值。
- 泄漏内存。
- 释放堆块的不良释放(两次释放,不匹配的释放)。
- 将重叠的源和目标内存块传递给memcpy()和相关函数。
重叠src和 dst指针 memcpy以及相关功能。
Memcheck会在发生这些错误时立即报告这些错误,并给出发生错误的源代码行号,以及为达到该行而调用的函数的堆栈跟踪。
- Memcheck运行的程序比正常运行慢大约10–30倍。
- Memcheck不对全局数组或堆栈数组进行边界检查。
- 检查所有支持的动态链接库(包括C库,图形库等)中的代码。
2.2 Cachegrind
Cachegrind是一个缓存分析器。它可以对CPU中的I1,D1和L2缓存进行详细的仿真,因此可以准确地指出代码中的缓存未命中源。
2.3 Callgrind
它提供了Cachegrind所做的所有信息,以及有关调用图的其他信息。
2.4 Massif
Massif是堆分析器。包括有关程序的哪些部分负责最多内存分配的信息。
2.5 Helgrind
Helgrind是一个线程调试器,可在多线程程序中查找数据竞争。
2.6 等等其他tool
三、文档
http://valgrind.org/docs/manual/QuickStart.html
用户文档: http://valgrind.org/docs/manual/manual-core.html
四、一个运行示例 (An Example Run)
4.1 安装
安装包网址 : http://www.valgrind.org/downloads/current.html
或者
git clone git://sourceware.org/git/valgrind.git
下载源码、下载文档
tar jxvf valgrind-3.15.0.tar.bz2
cd valgrind-3.15.0/
./configure
make
make install
//验证是否安装成功
valgrind --version
4.2 写源码
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[]){
// int x = 1;
int x;
printf("x [%d]\n\n", x); //1、使用未初始化的变量
char * str1 = malloc(10); //2、未释放的内存、内存泄漏
char * str2 = malloc(sizeof(int));
free(str2);
// free(str2); //3、非法释放
return 0