我使用以下参数运行Valgrind:
--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes
在内存泄漏日志中,我看到一些错误消息,其中有完整堆栈跟踪到主消息,但有些消息如下所示:
==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845
==3956== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==3956==
如何获得这些错误的完整堆栈跟踪?
最佳答案
获取完整的堆栈跟踪信息将需要所有可能与泄漏有关的库/可执行文件的调试符号(并在--num-callers
设置的限制内)。
如果您自己构建它们中的任何一个,则需要在gcc中指定-g
标志(或在任何其他编译器中指定相关标志)。
请注意,valgrind并非万无一失,并且有时可能会漏漏或无法提供完整的堆栈跟踪(尤其是在使用线程或复杂的class
实现的情况下)。
对于没有调试信息的库,堆栈跟踪将在该库处停止。
对于免费工具来说,valgrind非常擅长于其功能,但是有一个原因,例如IBM可以大笔出售内存配置文件。
关于memory-leaks - 如何从Valgrind获取完整的调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11242795/