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

时间:2014-05-07 00:08:15

标签: c gdb

GDB可以跟踪何时释放内存地址?在地址上放置watch没有用,因为当地址中的内存被释放时它不会中断,但只有当它被触摸时才会中断。

我认为通过使用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.

2 个答案:

答案 0 :(得分:3)

  

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

一般来说,没有。但是,如果您对所使用的mallocfree有所了解,那么是。

  

对地址进行监视没有帮助,因为当地址处的内存被释放时它不会中断,但仅在触摸时才会中断。

这是正确的。

  

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

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

  

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

正确。

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

  

但是对于条件,我需要指定传递给free()的确切参数,它可能不是函数中的相同名称。

我不确定你的意思。您想要的条件是:免费的地址是0xee20229c

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

如果您 了解malloc

的内容,该怎么办?

许多malloc实现在堆块之前保留“内务”信息。如果您的实施方式有效,那么在address-of-interest - 4- 8上设置观察点可能会获得所需的结果。

答案 1 :(得分:0)

俄罗斯人的回答没有错,但是如果你愿意多次运行程序,你可以做一些事情来确定gdb中的内存是否被释放。

由于您使用的是 gdb,您可以简单地再次释放有问题的内存。如果程序在第二次释放时出现分段错误,则您尝试释放已经释放的内存。

在另一种方法中,您还可以在释放内存时将内存指针设置为 NULL。然后你只需要检查 NULL 指针。虽然这看起来更简洁,但您将删除一些可能对您寻找内存问题有用的信息。

Valgrind 和“g++ -g -fsanitize=address yourProgram.cpp -o yourProgram -lasan”也会提供一些可用于缩小搜索范围的信息。不过,它们并非万无一失。