5.3. 使用 Valgrind 简要描述内存使用
Valgrind 是为用户空间二进制提供检测的框架。它与大量用于简要描述和分析程序性能的工具一同发布。本小节提供的工具可用于探测内存错误,比如使用未初始化内存以及不正确地分配或者取消分配内存。这些工具都包含在 valgrind 软件包中,并可使用以下命令运行:
valgrind --tool=toolname program
使用您要使用的工具名称替换 toolname(要对内存进行简要概述,请使用
memcheck
, massif
或者 cachegrind
),同时使用您要使用 Valgrind 进行简要概述的程序替换 program。请注意 Valgrind 的检测可能造成程序比正常情况运行更缓慢。
Valgrind 的功能概述请参考 第 3.5.3 节 “Valgrind”。详情,包括用于 Eclipse 的插件请参考《开发者指南》,其链接为 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。您还可以在安装 valgrind 软件包后使用
man valgrind
命令查看相关文档,或者在以下位置查找这些文档:
/usr/share/doc/valgrind-version/valgrind_manual.pdf
以及/usr/share/doc/valgrind-version/html/index.html
。
5.3.1. 使用 Memcheck 简要概述内存使用
Memcheck 是默认 Valgrind 工具,且可以与
valgrind program
一同运行,而无需指定 --tool=memcheck
。它可探测和报告大量很难探测和诊断的内存错误,比如不应该发生的内存访问,使用未定义或者未初始化值,错误释放的堆内存,重叠的光标以及内存泄漏。运行 Memcheck 时程序运行速度要比正常运行时慢 10-30 倍。
Memcheck 根据探测的问题类型返回具体错误。这些错误在 Valgrind 文档中有具体论述,文档位置为
/usr/share/doc/valgrind-version/valgrind_manual.pdf
。
注:Memcheck 只能报告这些错误 — 它不能放置这些错误发生。如果您的程序采用一般会造成片段失败的的方法访问内存,片段失败仍会发生。但 Memcheck 将在失败前记录出错信息。
Memcheck 提供可用来着重检查进程的命令行选项。有些可用的选项为:
--leak-check
- 启用后,Memcheck 会在客户端程序完成后搜索内存泄漏。其默认值为
summary
,它输出找到的泄漏数。其他可能的值为yes
和full
,这两个选项都会给出每个泄漏的详细情况,且no
会禁用内存泄漏检查。 --undef-value-errors
- 启用后(将其设定为
yes
),Memcheck 会报告使用未定义值报告的错误。禁用时(将其设定为no
),则不会报告未定义值错误。默认启用这个选项。禁用该选项会稍稍提高 Memcheck 速度。 --ignore-ranges
- 可让用户指定一个或者多个 Memcheck 检查可寻址能力时应该忽略的范围。多个范围使用逗号分开,例如:
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
。
选项完整列表请参考
/usr/share/doc/valgrind-version/valgrind_manual.pdf
中的文档。