4

我正在调试 C 中的内存问题。我正在访问的内存块被free()其他人的模块意外 :d 。有没有办法在gdb一段内存为free():d 时得到通知?

4

2 回答 2

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

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) 
于 2012-10-06T07:20:42.340 回答
2

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

  1. 瓦尔格林德

  2. 谷歌性能工具

并且很快就会习惯使用这些 - 绝对值得一试。

或者使用硬件观察点来跟踪某些地址可能会有所帮助 - 每当您正在观察的地址发生读取或写入时,调试器就会获得控制 - 但我不确定这是否为您的问题提供了确切的解决方案。

于 2012-10-06T07:03:43.483 回答