linu下的调试工具valgrind.docxVIP

  • 2
  • 0
  • 约6.65千字
  • 约 6页
  • 2023-04-26 发布于上海
  • 举报
用 C/C++开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事情就好了,valgrind 正好就是这样的一款工具。 Valgrind 是一款基于模拟 linux 下的程序调试器和剖析器的软件套件,可以运行于 x86, amd64 和 ppc32 架构上。valgrind 包含一个核心,它提供一个虚拟的CPU 运行程序,还有一系列的工具,它们完成调试,剖析和一些类似的任务。valgrind 是高度模块化的,所以开发人员或者用户可以给它添加新的工具而不会损坏己有的结构。 valgrind 的官方网址是: 你可以在它的网站上下载到最新的valgrind,它是开放源码和免费的。一、介绍 valgrind 包含几个标准的工具,它们是: 1、memcheck memcheck 探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的 malloc/new/free/delete 调用。因此 memcheck 工具能够探测到以下问题: 使用未初始化的内存 读/写已经被释放的内存 读/写内存越界 读/写不恰当的内存栈空间 内存泄漏 使用 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 将会给你的个详细的报告,比如哪一行代码出现了内存泄漏。 当检查的是 C++程序的时候,还应该考虑另一个选项 -fno-inline。它使得函数调用链很清晰, 这样可以减少你在浏览大型 C++程序时的混乱。比如在使用这个选项的时候,用 memcheck 检查 openoffice 就很容易。当然,你可能不会做这项工作,但是使用这一选项使得valgrind 生成更精确的错误报告和减少混乱。 一些编译优化选项(比如-O2 或者更高的优化选项),可能会使得 memcheck 提交错误的未初始化报告,因此,为了使得 valgrind 的报告

文档评论(0)

1亿VIP精品文档

相关文档