2

我有一个程序意外使用大量堆(大约 3GB)。我通过 valgrind memcheck 运行它,报告没有泄漏,声称所有堆内存仍然可以访问。

所以我用调试选项重建了我所有的库,并通过 valgrind massif 运行了 prog。我正在使用我今天刚刚下载并在我的盒子上构建的 Valgrind-3.8.1。命令行是:

valgrind --tool=massif myprog

Valgrind 没有产生任何错误或警告。生成的输出文件报告所有分配的内存,但大型分配的所有堆栈跟踪都无法识别函数名称或代码位置,例如:

97.34% (2,595,141,447B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->88.67% (2,363,882,948B) 0xCA6ACC0: ???
| ->88.67% (2,363,882,948B) 0xC7D7A71: ???
|   ->88.67% (2,363,882,948B) 0xC7D705E: ???
|     ->88.67% (2,363,882,948B) 0xA6ACB65: ???
|       ->59.01% (1,573,247,120B) 0xA6AC9BA: ???
|       | ->59.01% (1,573,247,120B) 0x9410C08: ???
|       |   ->59.01% (1,573,247,120B) 0x94123E2: ???
|       |     ->59.01% (1,573,247,120B) 0x940B3E9: ???
|       |       ->59.01% (1,573,247,120B) 0x9428BC0: ???
|       |         ->59.01% (1,573,247,120B) 0x98B0564: ???
|       |           ->59.01% (1,573,247,120B) 0x9AF0DA0: ???
|       |             ->59.01% (1,573,247,120B) 0x9AF09BE: ???
|       |               ->59.01% (1,573,247,120B) 0x9AF0E6C: ???
|       |                 ->59.01% (1,573,247,120B) 0x4CE6438: run_S (Thread.cpp:98)
|       |                   ->59.01% (1,573,247,120B) 0x3A9A40683B: start_thread (in /lib64/libpthread-2.5.so)
|       |                     ->59.01% (1,573,247,120B) 0x3A994D503B: clone (in /lib64/libc 2.5.so)

我现在有点卡住了。我想知道我构建的库是否实际上没有启用调试 - 但是当我在 gdb 中运行我的代码时,它似乎确实具有所有调试信息。此外,massif 输出中还有一些其他(小得多的)内存分配结果,它们从我的代码中识别出函数名称和位置。

这些结果是否表明系统或外部库中的堆栈跟踪?这就是没有信息的原因吗?谁能建议我如何跟踪这些分配?

4

1 回答 1

3

认为答案是 RTFM ......请参阅 valgrind常见问题解答第 4.2 节:

另外,对于涉及共享对象的泄漏报告,如果共享对象在程序终止之前被卸载,Valgrind 将丢弃调试信息,错误信息将充满??? 条目。这里的解决方法是避免对这些共享对象调用 dlclose。

我的代码确实在退出之前明确卸载了它的共享库。我正在重建库卸载抑制 - 希望有更好的结果:)

于 2013-09-03T07:43:11.450 回答