Durring my work I regulary face rather common programming error - using some object which has already been freed. This invokes UB in C++. On linux, this kind of problems are usually resolved by using Valgrind tool Memcheck. From Memcheck manual:
Memcheck tries to establish what the illegal address might relate to,
since that's often useful. So, if it points into a block of memory
which has already been freed, you'll be informed of this, and also
where the block was freed.
According to Dr. Memory documentation, there is
-delay_frees_stack option with exactly the same Valgrind functionality. From Option Reference:
-delay_frees_stack default: false Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications.
Also here is an example of error reported by Dr. Memory:
Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory: Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s) # 0 unaddr_test1 [e:\derek\drmemory\git\src\tests\suppress.c:110] # 1 test [e:\derek\drmemory\git\src\tests\suppress.c:269] # 2 main [e:\derek\drmemory\git\src\tests\suppress.c:297] Note: @0:00:02.141 in thread 3024 Note: next higher malloc: 0x001338e8-0x00133938 Note: prev lower malloc: 0x001337e8-0x00133820 Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here: Note: # 0 test [e:\derek\drmemory\git\src\tests\suppress.c:269] Note: # 1 main [e:\derek\drmemory\git\src\tests\suppress.c:297] Note: instruction: mov (%eax) -> %eax