valgrind的内存泄漏使用
1. valgrind [valgrind options] your-program your-program-options
2. valgrind --tool=memcheck
3. --gen-suppressions=[no,yes,all], 在结果里输出suppressions信息,可以直接copy到supp文件,这里注意,实际使用时如果参数为yes,好像每次输出都要确认,all的话就不需要确认了
4. 在编译文件时,最好能带-g,-fno-inline选项,可以带上-O优化选项,最好不要使用-O2及以上优化选项
5. -v可以打印更多信息,-v -v可以打印更详细信息
6. --log-file=filename 可使输出到文件里,--log-socket=192.168.0.1/123456 (valgrind-listener -e portnumber)
7. suppression文件的编写
每个suppression以{}开始结束,并由以下行组成:
第一行:这个suppression的name,valgrind以后就会以这个name代表这个suppression
第二行:这个suppression suppress的tool及它的类型,如memcheck:value1
第三行:如果第二行需要参数(一般系统调用的suppression需要这一行),则在这行指定
剩余行:这个suppression的context,相当于调用栈。可以指定函数function或者share object
1)函数格式:func:function-name,注意如果是c++,只能用mangled name,如果是手动写,可以用--demangle-no在错误信息里获取mangled name
2)share object: obj:objname-path-name
3)函数名和share object名可以用*和?匹配任意字符,可以用...匹配context链路的一条
4)一个suppression的例子:
{
g_type_register_static
Memcheck:Leak
match-leak-kinds: possible
...
fun:g_type_register_static
...
}
{
g_type_register_fundamental
Memcheck:Leak
match-leak-kinds: possible
...
fun:g_type_register_fundamental
...
}
8. memcheck的suppression关键字
1)Value1, Value2, Value4, Value8, Value16:代表1-16字节的未初始化变量的使用
2)Cond (or its old name, Value0):表示未初始化的cpu条件变量
3)Addr1, Addr2, Addr4, Addr8, Addr16:表示1-16字节的不可addressable的内存访问
4)Jump:表示跳转到一个不可addressable的地方
5)Param:表示系统调用syscall的参数错误,这个类型需要另外一行指定syscall的那个参数
6)Free:表示不匹配的内存释放
7)Overlap:表示在memcpy时source和destination有重叠
8)Leak:表示内存泄漏