查找双重自由错误的分配站点(使用valgrind)

时间:2011-04-14 14:42:48

标签: linux valgrind

鉴于双重自由错误(由valgrind报告),有没有办法找出内存的分配位置? Valgrind只告诉我释放站点的位置(即对free()的调用),但我想知道内存已分配的位置。

2 个答案:

答案 0 :(得分:9)

要让Valgrind跟踪分配堆栈跟踪,您必须使用选项:

--track-origins=yes --keep-stacktraces=alloc-and-free

Valgrind将在Block was alloc'd at警告之后的Address ... inside a block of size x free'd部分报告分配堆栈。

如果您的应用程序很大,--error-limit=no --num-callers=40选项也可能有用。

答案 1 :(得分:0)

我要做的第一项检查是验证错误确实是由于双重释放错误引起的。有时,运行程序(包括valgrind)可能会显示出双重释放错误,而实际上这是内存损坏问题(例如内存溢出)。

最好的检查方法是应用答案中详述的建议:How to track down a double free or corruption error in C++ with gdb

首先,您可以尝试使用标志fsanitize=address -g编译程序。这将在运行时检测程序的内存,以跟踪所有分配,检测溢出等。

无论如何,如果问题确实是双重解决,则错误消息应包含所有必要的信息以供您调试问题。