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)
GDB 可以跟踪内存地址何时被释放吗?
一般来说,没有。但是,如果您了解有关malloc和free正在使用的情况,那么是的。
在地址上放置监视并没有帮助,因为当释放该地址处的内存时它不会中断,而仅在触摸该地址时才中断。
那是对的。
我认为通过使用 free(),只有指向内存的指针被释放,
无法释放指针。指针指向的内存块被释放。
但内容仍然可以存在,直到它被另一个内存分配函数使用。
正确的。
因此,如果您想知道何时0xee20229c被释放,并且您对 malloc 实现一无所知,那么解决此问题的唯一方法是在 上设置条件断点free。
但对于条件,我需要指定传递给 free() 的确切参数,该参数在函数之间可能不相同。
我不确定你的意思。你想要的条件是:被释放的地址是0xee20229c
设置此条件可能需要您具有可用于您的 的调试信息libc,或者通过寄存器指定它(您需要知道您平台的 ABI)。
如果你确实知道一些事情怎么办malloc?
许多 malloc 实现在堆块之前保留“内务管理”信息。如果您的实现确实如此,那么在address-of-interest - 4或上设置一个观察点- 8可能会得到您想要的结果。