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.
答案 0 :(得分:3)
GDB可以跟踪何时释放内存地址?
一般来说,没有。但是,如果您对所使用的malloc
和free
有所了解,那么是。
对地址进行监视没有帮助,因为当地址处的内存被释放时它不会中断,但仅在触摸时才会中断。
这是正确的。
我认为通过使用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”也会提供一些可用于缩小搜索范围的信息。不过,它们并非万无一失。