linux valgrind Memcheck–内存检查工具
使用方法:
注意,这里要用debug版本,如果是release的运行文件,则用debug编译出来的可执行文件替换
输出到终端:
valgrind --tool=memcheck --leak-check=full ./test.out
输出到文件:
valgrind --tool=memcheck --leak-check=full --log-file=test.log ./test.out
报错如下图所示:
这里显示的是报错时候的函数调用堆栈,默认显示12层,所以这里的最底层的函数并不一定是你的调用函数,而可能是由于限制显示不出来而已,
可以有参数指定可显示的堆栈层数,自行百度
忽略指定错误(例如第三方库的报错)
比如glibc就会报一堆的错误,然而我们并不关心,所以我们可以选择忽略这个错误,
1、先加 --gen-suppressions=all 参数运行一遍 ,
valgrind --tool=memcheck --gen-suppressions=all --log-file=test.log ./test.out
在日志文件test.log 中就会看到每一个报错上面都会紧接着一个规则块,这个规则块用于忽略这个错误,
如图:
然后把想忽略的错误的规则块,复制一下,新建一个valgrind.supp的文件(后缀是.supp就行,名称其实没关系),
把复制的规则块拷贝进去,规则块可以有多个,如下:
2、当然这里显示的很详细,这个块里有动态库的信息,有函数的信息,这个块我们可以做一个扩展,
比如我想屏蔽这个函数的所有错误,如下, 我想renderScene 这个函数相关的所有报错,就在它下面加上三个点 (…)
{
<insert_a_suppression_name_here>
Memcheck:Addr4
obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so
obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so
obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so
fun:_ZN16QSGBatchRenderer8Renderer17renderMergedBatchEPKNS_5BatchE
fun:_ZN16QSGBatchRenderer8Renderer13renderBatchesEv
fun:_ZN16QSGBatchRenderer8Renderer6renderEv
fun:_ZN11QSGRenderer11renderSceneERK11QSGBindable
fun:_ZN11QSGRenderer11renderSceneEj
…
}
3、屏蔽整个动态库的所有报错, 在这个库的前后都加三个点,一般还需要加上addr8的一个块(这里就不展开来讲了,照写就行)
{
<insert_a_suppression_name_here>
Memcheck:Addr4
…
obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so
…
}
{
<insert_a_suppression_name_here>
Memcheck:Addr8
…
obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so
…
}
4、使用.supp文件运行valgrind,忽略指定错误
valgrind --tool=memcheck --suppressions=valgrind.supp --log-file=test.log ./test.out