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] |