我正在调试C中的内存问题。我正在访问的内存偶然是free()
:d由其他人的模块执行。当gdb
内存为free()
时,{{1}}是否有办法获得通知:
答案 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)
为了获取有关内存泄漏的信息,以下工具将非常有用。
习惯使用它们并不需要很长时间 - 绝对值得一试。
或者使用硬件监视点来跟踪某些地址可能会有所帮助 - 只要对您正在观看的地址进行读取或写入,调试器就会获得控制权 - 但我不确定这是否能为您的问题提供准确的解决方案