Valgrind工具套件提供了一整套的调试和配置工具,其能帮助使你的程序可以运行更快以及更正确.Memcheck是该套件中最为著名一个.它能探测到很多导致C/C++应用程序崩溃和不能定位的crash的内存相关的问题.
选项说明:
–tool=memcheck:该选项为valgrind最为重要的选项,其默认使用的工具为memcheck
–leak-check=yes:打开详细的内存泄露探测器.
–log-file=file :将valgrind的输出重定向到文件
prog:待检测的应用程序
var0 var1:prog程序的参数
#include <stdlib.h>
void f(void)
{
int* x = malloc(10 * sizeof(int));//测试内存泄露问题
x[10] = 0;//测试内存越界写问题
}
int main(void)
{
f();
return 0;
}
程序编译注意事项:
1. 注意程序编译的时候需要开启-g选项,这样valgrind的Memcheck工具输出的内存错误日志会携带具体的错误代码的位置
2. 如果你能忍受较低的程序运行速度,最好使用-O0选项.其他的-O1 -O2选项都会降低错误的定位准确度
Invalid write of size 4
==27316== at 0x108364: f (mem_leak.c:6)
==27316== by 0x10837B: main (mem_leak.c:12)
==27316== Address 0x48ce050 is 0 bytes after a block of size 40 alloc'd
==27316== at 0x481EFEC: malloc (vg_replace_malloc.c:298)
==27316== by 0x10834F: f (mem_leak.c:5)
==27316== by 0x10837B: main (mem_leak.c:12)
上面输出信息对应于内存越界写的问题,同时指定了发生问题的代码位置为mem_leak.c的第6行
==27316== HEAP SUMMARY:
==27316== in use at exit: 40 bytes in 1 blocks
==27316== total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==27316==
==27316== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==27316== at 0x481EFEC: malloc (vg_replace_malloc.c:298)
==27316== by 0x10834F: f (mem_leak.c:5)
==27316== by 0x10837B: main (mem_leak.c:12)
上面的输出信息对应与内存泄露问题,同时指定了内存分配的位置为mem_leak.c:5
==27316== LEAK SUMMARY:
==27316== definitely lost: 40 bytes in 1 blocks
==27316== indirectly lost: 0 bytes in 0 blocks
==27316== possibly lost: 0 bytes in 0 blocks
==27316== still reachable: 0 bytes in 0 blocks
==27316== suppressed: 0 bytes in 0 blocks
上面为该程序运行完成后的内存问题的总体情况,可以看到"definitely lost: 40 bytes in 1 blocks"表示内存肯定泄露了40个字节
Valgrind的error-checking工具会检测很多关于系统库的问题,例如安装在OS中的C库.我们一般不能轻易修改C库的代码,但是你又不想看到这些错误信息.所以Valgrind提供了一种错误过滤的机制(suppressing errors).在使用./configure配置Valgrind时会生成一个默认的suppressing文件(default.supp).该文件过滤了很多系统库,我们可以定制该文件,这样就能过滤掉与自己程序不相关的错误提示.
在启动valgrind时,我们可以使用--suppressions=/path/to/file.supp指定自己的配置文件.Valgrind提供了一种手动配置suppressions的方式,当启动valgrind时使用--gen-suppressions=yes选项,可以手动配置suppressions的过滤规则.
{
Android5.1 carekitgwd-libcrypto-func-Value4
Memcheck:Value4
fun:OPENSSL_cleanse
lib:/lib/libgcc.so
}
上面为一个过滤规则的一般格式,其中
第一行:该规则的名字
第二行:Memcheck的suppressions类型,一般有这几个类型
```
1. Value1, Value2, Value4, Value8, Value16:代表未知(可能未初始化)的变量(1byte 2bytes 4 byes 8 bytes 16bytes)
2.Cond:使用了未知的CPU Condition code(不知道如何翻译)
3.Addr1, Addr2, Addr4, Addr8, Addr16:表示访问了无效的内存地址(1byte 2bytes 4 byes 8 bytes 16bytes)
4.Jump:表示一个不可寻址的跳转
5.Param:表示一个无效系统调用参数
6.Overlap:表示内存拷贝越界,例如mmcpy中src/dst中地址越界
7.Leak:表示内存泄露
```
第三行:fun表示需屏蔽错误的函数
第四行:lib表示需要屏蔽错误的库文件
其中,前两行必须有,第三四行至少配置一项.