GDB 可以帮助找出内存地址何时被释放吗?

adi*_*one 5 c gdb

GDB 可以跟踪内存地址何时被释放吗?在地址上放置 awatch没有帮助,因为当释放地址处的内存时它不会中断,而仅在触摸它时才中断。

我认为通过使用free(),仅释放指向内存的指针,但内容仍然可以存在,直到被另一个内存分配函数使用。

(gdb) p (char *)0xee20229c
$2 = 0xee20229c "XYZ"
(gdb) watch *(char *)0xee20229c
Hardware watchpoint 3: *(char *) 3995083420
(gdb) c
Continuing.
...
...
Hardware watchpoint 3: *(char *) 3995083420

Old value = 88 'X'    // Changes only when the contents are overwritten,
New value = 0 '\0'    // but not when the memory location '0xee20229c' is freed.
Run Code Online (Sandbox Code Playgroud)

Emp*_*ian 4

GDB 可以跟踪内存地址何时被释放吗?

一般来说,没有。但是,如果您了解有关mallocfree正在使用的情况,那么是的。

在地址上放置监视并没有帮助,因为当释放该地址处的内存时它不会中断,而仅在触摸该地址时才中断。

那是对的。

我认为通过使用 free(),只有指向内存的指针被释放,

无法释放指针。指针指向的内存块被释放。

但内容仍然可以存在,直到它被另一个内存分配函数使用。

正确的。

因此,如果您想知道何时0xee20229c被释放,并且您对 malloc 实现一无所知,那么解决此问题的唯一方法是在 上设置条件断点free

但对于条件,我需要指定传递给 free() 的确切参数,该参数在函数之间可能不相同。

我不确定你的意思。你想要的条件是:被释放的地址是0xee20229c

设置此条件可能需要您具有可用于您的 的调试信息libc,或者通过寄存器指定它(您需要知道您平台的 ABI)。

如果你确实知道一些事情怎么办malloc

许多 malloc 实现在堆块之前保留“内务管理”信息。如果您的实现确实如此,那么在address-of-interest - 4或上设置一个观察点- 8可能会得到您想要的结果。