内存检查工具memcheck
valgrind --tool=memcheck yourprogram
多线程工具helgrind
valgrind --tool=helgrind yourprogram
其他常用选项
指定log输出文件,有时候不想程序的打印输出和valgrind的报告信息混杂在一起输出,指定该文件就可以得到仅包含valgrind报告信息的文件
--log-file=you_log_file_path
屏蔽指定规则的输出,有时候程序引用了第三方的库,而自己仅仅关注自己写的模块,不关心第三方库的valgrind信息,则需要指定规则屏蔽第三方库的
输出
--suppressions=you_rules_file_path
每个suppression以{}开始结束,并由以下行组成:
- 第一行:这个suppression的name,valgrind以后就会以这个name代表这个suppression
- 第二行:这个suppression suppress的tool及它的类型,如memcheck:type
- 第三行:如果第二行需要参数(一般系统调用的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链路的一条
示例:
{
hello
helgrind:race
obj:/usr/lib/x86_64-linux-gnu/libmosquitto.so.1
}
{
world
helgrind:race
fun:cjson_parsewithlengthopts
}
memcheck的suppression关键字
- value1, value2, value4, value8, value16:代表1-16字节的未初始化变量的使用
- cond (or its old name, value0):表示未初始化的cpu条件变量
- addr1, addr2, addr4, addr8, addr16:表示1-16字节的不可addressable的内存访问
- jump:表示跳转到一个不可addressable的地方
- param:表示系统调用syscall的参数错误,这个类型需要另外一行指定syscall的那个参数
- free:表示不匹配的内存释放
- overlap:表示在memcpy时source和destination有重叠
- leak:表示内存泄漏
helgrind的关键字目前未找到相关文档,不过可以通过
--gen-suppressions=all
在探测到错误时,生成对应的suppression语句。然后根据需要拷贝至文件,然后以此文件屏蔽指定的错误。