memory-leaks - 如何从Valgrind获取完整的调用堆栈?

标签 memory-leaks valgrind callstack

我使用以下参数运行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标志(或在任何其他编译器中指定相关标志)。

请注意,并非万无一失,并且有时可能会漏漏或无法提供完整的堆栈跟踪(尤其是在使用线程或复杂的class实现的情况下)。

对于没有调试信息的库,堆栈跟踪将在该库处停止。

对于免费工具来说,非常擅长于其功能,但是有一个原因,例如IBM可以大笔出售内存配置文件。

关于memory-leaks - 如何从Valgrind获取完整的调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11242795/

相关文章:

visual-c++ - 将可视泄漏检测器附加到作为 Windows 服务运行的进程

memory-leaks - Valgrind vs Purify

python - 为什么 objgraph 不能捕获 np.array() 的增长?

c++ - 使用托管 C++ 的 PIN 或 Valgrind?

c++ - valgrind 在 std::map 中显示无效读取错误

java - 减少java中的内存使用

c - 找出 valgrind 提出的问题

c++ - 如何从二进制文件中的给定符号获取调用者图

javascript - JavaScript 中的 Tic tac toe 与 minimax 算法给出错误最大调用堆栈大小超过

java - 为什么这个程序的空间复杂度是O(h)?其中 h 是 btree 的高度