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.发布于 2014-05-07 12:36:47
可以跟踪内存地址何时被释放吗?
一般来说,不是。但是,如果您对正在使用的malloc和free有所了解,那么可以。
将手表放在地址上没有帮助,因为它不会在地址处的内存被释放时中断,而是只有在被触摸时才会中断。
这是正确的。
我认为通过使用free(),只有指向内存的指针会被释放,
指针不能被释放。指针所指向的内存块将被释放。
,但内容仍然可以存在,直到它被另一个内存分配函数使用。
对,是这样。
因此,如果您想知道0xee20229c何时被释放,并且对您的malloc实现一无所知,那么解决此问题的唯一方法就是在free上使用条件断点。
对于条件,我需要指定传递给
()的确切参数,该参数在不同的函数中可能名称不同。
我不明白你的意思。您想要的条件是:空闲的地址是0xee20229c
设置这个条件可能需要你有libc可用的调试信息,或者你通过寄存器指定它(你需要知道你的平台的ABI值)。
如果您确实对malloc有所了解,该怎么办呢?
许多malloc实现将“内务”信息保存在堆块之前。如果您的实现是这样做的,那么在address-of-interest - 4或- 8上设置一个观察点可能会得到您想要的结果。
发布于 2021-01-17 07:22:30
俄罗斯人的回答不是错误的,但如果您愿意多次运行程序,您可以做一些事情来确定gdb中的内存是否被释放。
由于您使用的是gdb,因此可以简单地第二次释放有问题的内存。如果程序在第二次释放时出现分段错误,则说明您试图释放已经释放的内存。
在另一种方法中,您还可以在释放内存指针时将其设置为NULL。然后你只需要检查空指针。虽然这可能看起来更干净,但您将擦除一些在查找内存问题时可能有用的信息。
Valgrind和"g++ -g -fsanitize=address yourProgram.cpp -o yourProgram -lasan“也会提供一些信息,可以用来缩小搜索范围。然而,它们并非万无一失。
https://stackoverflow.com/questions/23506577
复制相似问题