Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get notified in gdb when memory is freed?

I'm debugging a memory issue in C. The piece of memory I'm accessing has been accidentally free():d by somebody else's module. Is there a way in gdb to get notified when a piece of memory is free():d?

like image 822
H_J Avatar asked Dec 21 '22 15:12

H_J


1 Answers

Suppose your libc's free's argument is called mem.

Then, you can print out everything that is freed:

(gdb) break __GI___libc_free # this is what my libc's free is actually called
Breakpoint 2 at 0x7ffff7af38e0: file malloc.c, line 3698.
(gdb) commands 2
Type commands for when breakpoint 2 is hit, one per line.
End with a line saying just "end".
>print mem
>c
>end

Now, every time anyone frees anything, you will get a little printout (you can omit c if you want it to stop every time free occurs):

Breakpoint 2, *__GI___libc_free (mem=0x601010) at malloc.c:3698
3698    malloc.c: No such file or directory.
    in malloc.c
$1 = (void *) 0x601010

Or, if you already know what memory address you are interested in, use cond to break when someone tries to free that address:

(gdb) cond 2 (mem==0x601010)
(gdb) c
Breakpoint 3, *__GI___libc_free (mem=0x601010) at malloc.c:3698
3698    malloc.c: No such file or directory.
    in malloc.c
(gdb) 
like image 138
nneonneo Avatar answered Dec 24 '22 01:12

nneonneo