首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDB可以帮助找出内存地址何时被释放吗?

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

Stack Overflow用户
提问于 2014-05-07 08:08:15
回答 2查看 2.9K关注 0票数 4

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

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

代码语言:javascript
复制
(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.
EN

回答 2

Stack Overflow用户

发布于 2014-05-07 12:36:47

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

一般来说,不是。但是,如果您对正在使用的mallocfree有所了解,那么可以。

将手表放在地址上没有帮助,因为它不会在地址处的内存被释放时中断,而是只有在被触摸时才会中断。

这是正确的。

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

指针不能被释放。指针所指向的内存块将被释放。

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

对,是这样。

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

对于条件,我需要指定传递给

()的确切参数,该参数在不同的函数中可能名称不同。

我不明白你的意思。您想要的条件是:空闲的地址是0xee20229c

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

如果您确实对malloc有所了解,该怎么办呢?

许多malloc实现将“内务”信息保存在堆块之前。如果您的实现是这样做的,那么在address-of-interest - 4- 8上设置一个观察点可能会得到您想要的结果。

票数 4
EN

Stack Overflow用户

发布于 2021-01-17 07:22:30

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

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

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

Valgrind和"g++ -g -fsanitize=address yourProgram.cpp -o yourProgram -lasan“也会提供一些信息,可以用来缩小搜索范围。然而,它们并非万无一失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23506577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档