开发者

Finding allocation site for double-free errors (with valgrind)

开发者 https://www.devze.com 2023-02-24 10:56 出处:网络
Given a double-free error (reported by valgrind), is there a way to find out where the memory was allocated? Valgrind only tells me the location of the deallocation site (i.e. the call to free()), but

Given a double-free error (reported by valgrind), is there a way to find out where the memory was allocated? Valgrind only tells me the location of the deallocation site (i.e. the call to free()), but I would like to know where the memory was allo开发者_运维问答cated.


To get Valgrind keep tracks of allocation stack traces, you have to use options:

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

Valgrind will then report allocation stack under Block was alloc'd at section, just after Address ... inside a block of size x free'd alert.

In case your application is large, --error-limit=no --num-callers=40 options may be useful too.


The first check I would do is verifying that the error is indeed due to a double-free error. Sometimes, running a program (including with valgrind) can show a double-free error while in reality, it's a memory corruption problem (for example a memory overflow).

The best way to check is to apply the advice detailed in the answers : How to track down a double free or corruption error in C++ with gdb.

First of all, you can try to compile your program with flags fsanitize=address -g. This will instrument the memory of the program at runtime to keep track of all allocations, detect overflows, etc.

In any case, if the problem is indeed a double-free, the error message should contain all the necessary information for you to debug the problem.

0

精彩评论

暂无评论...
验证码 换一张
取 消