如何释放内存时在gdb中得到通知?

时间:2012-10-06 06:59:41

标签: c debugging memory gdb

我正在调试C中的内存问题。我正在访问的内存偶然是free():d由其他人的模块执行。当gdb内存为free()时,{{1}}是否有办法获得通知:

2 个答案:

答案 0 :(得分:9)

假设您的libc free的参数被称为mem

然后,您可以打印出所有已释放的内容:

(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

现在,每次任何人释放任何内容时,您都会获得一些打印输出(如果您希望每次c发生时都停止,则可以省略free):< / p>

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

或者,如果您已经知道自己感兴趣的内存地址,请在有人尝试cond地址时使用free来解决:

(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) 

答案 1 :(得分:2)

为了获取有关内存泄漏的信息,以下工具将非常有用。

  1. Valgrind

  2. Google Perf Tools

  3. 习惯使用它们并不需要很长时间 - 绝对值得一试。

    或者使用硬件监视点来跟踪某些地址可能会有所帮助 - 只要对您正在观看的地址进行读取或写入,调试器就会获得控制权 - 但我不确定这是否能为您的问题提供准确的解决方案