在c ++ gdb核心转储中,我是否可以看到指针是否仍然被分配?

时间:2009-05-22 15:55:25

标签: c++ gdb

我有一个核心转储坐在磁盘上,由一个断言失败的应用程序创建并中止。该应用程序是在Linux / g ++上以调试模式编译的。我怀疑在堆栈顶部的堆栈框架中,我的this对象已经delete'd(我认为this不再是有效的ptr)。但是,重现此中止可能需要数天或更长时间。

有没有办法让我从gdb(或其他地方)查询新的/免费的实现,并验证给定的内存地址是否是有效的分配内存?换句话说,我是否可以查看我的this是否仍然已分配,或者它是否可能已deleted'?它必须是静态的,因为我只有一个核心转储而不是正在运行的可执行文件。

2 个答案:

答案 0 :(得分:1)

这并非不可能,但如果您使用标准的malloc / free / new / delete调用,那就非常接近了。如果您认为可以在几天内再次重现问题,那可能是更快的路线。

在此期间您可以做的是为下一个事件做好准备,以便您更好地分析它。

Dmalloc是一个免费的实用工具,可以使用可以执行额外检查和簿记的版本替换默认的C / C ++内存函数。

LD_PRELOAD=libdmalloc.so your_program_here将使用dmalloc运行该程序,您可以设置标记来擦除内存,这样您就可以知道是否已删除任何内存。

答案 1 :(得分:0)

核心转储包含退出时程序的完整状态(包括进程内存分配的状态)。但是,您必须深入了解内存分配如何确定对象是否仍然有效。但是,检查调试器中的程序状态可能会导致发现问题,即使不知道确切的内存分配策略。您是否检查了所有线程的堆栈是否存在明显的“坏”值?他们可能会给你非常有价值的提示。

另一个非常好的主意是在valgrind中运行您的应用。