Valgrind是x86架构Linux上的多重用途代码剖析和内存调试工具。但它的主要功能还是对内存的调试,默认工具也是启动memcheck。用户可以在它的环境中运行程序来监视内存的使用情况,比如C语言中的malloc和free或者C++中的new和delete。
gdb主要用于调试,valgrind 则注重于检测内存,典型用法如下:
valgrind --tool=memcheck --leak-check=yes ./myprogram
Valgrind主要检测如下内存问题:
(1)使用未初始化的内存。
(2)使用已经释放了的内存。
(3)使用超过malloc分配的内存空间。
(4)对堆栈的非法访问。
(5)内存泄漏。
(6)malloc/free/new/delete非匹配的使用内存申请和释放函数。
(7)使用memcpy等函数时源地址和目的地址的重叠错误。
其使用方法如下:
// valgrind 参数 程序及选项 |
1.Valgrind常用选项
表3-1~表3-4列出了Valgrind工具的常用选项。如表3-1所示为Valgrind工具所有经常使用的公共选项说明。
表3-1 Valgrind公共选项
参 数 | 说 明 | 默 认 设 置 |
--tool=<name> | 使用名为<name>Valgrind工具 | [memcheck] |
--version | 显示版本信息 |
|
-q --quiet | 只打印错误信息 |
|
-v --verbose | 显示详细信息 |
|
--trace-children=no|yes | 跟踪子进程 | [no] |
--track-fds=no|yes | 跟踪文件描述符 | [no] |
--time-stamp=no|yes | 添加时间戳到日志文件 | [no] |
--log-fd=<number> | 日志信息写入到文件描述符 | [2=stderr] |
--log-file=<file> | 日志信息写入到文件 |
|
--log-file-exactly=<file> | 日志信息写入到外部文件 | <file> |
表3-2 Valgrind选项
参 数 | 说 明 | 默 认 设置 |
--run-libc-freeres=no|yes | 在退出时清除glibc内存 | [yes] |
--sim-hints=hint1,hint2,... | lax-ioctls, enable-outer | [none] |
--show-emwarns=no|yes | 显示仿真限制的警告 | [no] |
--smc-check=none|stack|all | 自修改代码检查、不检查、仅检查栈中的代码 | [stack] |
--kernel-variant=variant1,... | 处理非标准内核变量 | [none] |
表3-3 报告错误工具选项
参 数 | 说 明 | 默 认 设 置 |
--xml=yes | 所有输出为XML |
|
--xml-user-comment=STR | 逐字拷贝STR到XML |
|
--demangle=no|yes | 是否自动解除C++名称修饰 | [yes] |
--num-callers=<number> | 显示栈跟踪器中的number号调用者 | [12] |
--error-limit=no|yes | 如果错误太多停止显示新错误 | [yes] |
--error-exitcode=<number> | 如果发现错误返回exit代码 | [0=disable] |
--show-below-main=no|yes | 在main后继续跟踪栈 | [no] |
--suppressions=<filename> | 抑制文件中的错误描述 |
|
--gen-suppressions=no|yes|all | 打印错误的抑制信息 | [no] |
--db-attach=no|yes | 发现错误时调试 | [no] |
--db-command=<command> | 开始调试命令 | [gdb -nw %f %p] |
--input-fd=<number> | 用于输入的文件描述符 | [0=stdin] |
--max-stackframe=<number> | 假设因sp变化大于number字节而引起堆转变 | [2000000] |
表3-4 Memcheck工具
参 数 | 说 明 | 默 认 设置 |
--leak-check=no|summary|full | 在exit处查找内存泄漏 | [summary] |
--leak-resolution=low|med|high | 在内存泄漏检查出多少字节 | [low] |
--show-reachable=no|yes | 显示泄露检查中的块 | [no] |
--undef-value-errors=no|yes | 检查未定义变量错误 | [yes] |
--partial-loads-ok=no|yes | 请参阅手册 | [no] |
--freelist-vol=<number> | 释放块队列的序号 | [5000000] |
--workaround-gcc296-bugs=no|yes | 自解释 | [no] |
--alignment=<number> | 设置分配的最小对齐大小 | [8] |