valgrind

来源:互联网 发布:四九算法准吗 编辑:程序博客网 时间:2024/06/06 17:52

本文在学习过程中简单摘抄,如果冒犯,请谅解!

valgrind memcheck 输出信息

  1. Memcheck,a memory error detector
  2. LibVEX、Valgrind版权
  3. 命令行
  4. Valgrind启动参数
  5. content of /proc/version (Linux下/proc目录简介)
  6. 系统架构 x86
  7. valgrind library directory
  8. 读一些系统文件,列出读取地址
  9. 错误信息
  10. 检查内存错误要在上面的输出中看两个关键字ERROR SUMMARY 和 LEAK SUMMARY

Valgrind包含的几个标准的工具

一、介绍
1. memcheck
memcheck探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用。因此memcheck工具能够探测到以下问题:
1)使用未初始化的内存
2)读/写已经被释放的内存
3)读/写内存越界
4)读/写不恰当的内存栈空间
5)内存泄漏
6)使用malloc/new/new[]和free/delete/delete[]不匹配。
2. cachegrind
cachegrind是一个cache剖析器。它模拟执行CPU中的L1, D1和L2 cache,因此它能很精确的指出代码中的cache未命中。如果你需要,它可以打印出cache未命中的次数,内存引用和发生cache未命中的每一行代码,每一个函数,每一个模块和整个程序的摘要。如果你要求更细致的信息,它可以打印出每一行机器码的未命中次数。在x86和amd64上,cachegrind通过CPUID自动探测机器的cache配置,所以在多数情况下它不再需要更多的配置信息了。
3. helgrind
helgrind查找多线程程序中的竞争数据。helgrind查找内存地址,那些被多于一条线程访问的内存地址,但是没有使用一致的锁就会被查出。这表示这些地址在多线程间访问的时候没有进行同步,很可能会引起很难查找的时序问题。

二、valgrind对你的程序都做了些什么

valgrind被设计成非侵入式的,它直接工作于可执行文件上,因此在检查前不需要重新编译、连接和修改你的程序。要检查一个程序很简单,只需要执行下面的命令就可以了

 valgrind --tool=tool_name  program_name

比如我们要对ls -l命令做内存检查,只需要执行下面的命令就可以了

 valgrind --tool=memcheck ls -l

不管是使用哪个工具,valgrind在开始之前总会先取得对你的程序的控制权,从可执行关联库里读取调试信息。然后在valgrind核心提供的虚拟CPU上运行程序,valgrind会根据选择的工具来处理代码,该工具会向代码中加入检测代码,并把这些代码作为最终代码返回给valgrind核心,最后valgrind核心运行这些代码。

如果要检查内存泄漏,只需要增加–leak-check=yes就可以了,命令如下

 valgrind --tool=memcheck --leak-check=yes ls -l

不同工具间加入的代码变化非常的大。在每个作用域的末尾,memcheck加入代码检查每一片内存的访问和进行值计算,代码大小至少增加12倍,运行速度要比平时慢25到50倍。
valgrind模拟程序中的每一条指令执行,因此,检查工具和剖析工具不仅仅是对你的应用程序,还有对共享库,GNU C库,X的客户端库都起作用。
三、调试
在编译程序的时候打开调试模式(gcc编译器的-g选项)。如果没有调试信息,即使最好的valgrind工具也将很难猜测特定的代码是属于哪一个函数。打开调试选项进行编译后再用valgrind检查,valgrind将会给你的个详细的报告,比如哪一行代码出现了内存泄漏。

==4187== To see them, rerun with: –show-reachable=yes

这里的“4187”指的是执行ls -l的进程ID,这有利于区别不同进程的报告。memcheck会给出报告,分配置和释放了多少内存,有多少内存泄漏了,还有多少内存的访问是可达的,检查了多少字节的内存。

许多有用的工具被作为标准而提供。

  1. Memcheck是一个内存错误检测器。它有助于使你的程序,尤其是那些用C和C++写的程序,更加准确。
  2. Cachegrind是一个缓存和分支预测分析器。它有助于使你的程序运行更快。
  3. Callgrind是一个调用图缓存生成分析器。它与Cachegrind的功能有重叠,但也收集Cachegrind不收集的一些信息。
  4. Helgrind是一个线程错误检测器。它有助于使你的多线程程序更加准确。
  5. DRD也是一个线程错误检测器。它和Helgrind相似,但使用不同的分析技术,所以可能找到不同的问题。
  6. Massif是一个堆分析器。它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
  7. DHAT是另一种不同的堆分析器。它有助于理解块的生命期、块的使用和布局的低效等问题。
  8. SGcheck是一个实验工具,用来检测堆和全局数组的溢出。它的功能和Memcheck互补:SGcheck找到Memcheck无法找到的问题,反之亦然。
  9. BBV是个实验性质的SimPoint基本块矢量生成器。它对于进行计算机架构的研究和开发很有用处。
  10. 也有一些对大多数用户没有用的小工具:Lackey是演示仪器基础的示例工具;Nulgrind是一个最小化的Valgrind工具,不做分析或者操作,仅用于测试目的。

Valgrind学习资料

  1. 应用Valgrind发现Linux程序的内存问题 讲解的简单,各类例子均有。(官方手册可能更好)
  2. Valgrind, an open-source memory debugger (Sourceforge)
  3. 一点Valgrind工具心得(讲了一点大家不太关注的点,如生成supp文件;多进程追踪;报告结果显示)
  4. 《valgrind之内存调试》 感觉内容还可以,里面有个错误信息分析模块,针对反馈信息对各类错误进行了简单分析。

多进程追踪:
如果你只是一个单一的小程序,不用开子进程,valgrind挺好用的。如果你要用valgrind去追踪多进程程序中的内存泄露,就有点繁琐了。有几个选项要特别注意。

--trace-children=yes 这个是必须的,打开追踪子进程
--log-file=<filename> --xml-file=<filename> 文本格式报告和xml格式报告的报告名称,推荐使用%p_log.memcheck之类的名字,%p会被valgrind转义成进程号,这样每一个进程都拥有一份独立的报告。
--child-silent-after-fork=yes 这个看情况,如果不打开的话,报告会更详细,错误定位可能会更精准,但是多份报告会混杂在一起,会直接破坏xml格式的报告 
--trace-children-skip=patt1,patt2,... --trace-children-skip-by-arg=patt1,patt2,...如果不使用这个,valgrind会追踪所有子进程,哪怕这个进程是java的。所以对应的,你需要让valgrind过滤一些子进程,--trace-children-skip是根据exec的file/path中的字符串匹配来过滤,--trace-children-skip-by-arg是根据exec的argv参数来过滤。没有正则表达式,只有*,?匹配两个符号可用。
另外,对于被执行程序而言,valgrind是other权限组的,所以记得更改执行权限。然后valgrind的报告会生成在,启动valgrind时用户所在的目录处。子进程的报告会生成在子进程程序所在目录。例如如果java在/bin/下,这报告会生成在/bin/里。但如果valgrind没有su权限,则报告会无法生成。

Valgrind相关链接

Valgrind官方网站

0 0
原创粉丝点击