在GDB中找到指向单例事件的指针(C ++)

时间:2013-07-16 14:43:40

标签: c++ linux gdb postmortem-debugging

我正在对一个崩溃的程序进行事后分析。我在Linux(Ubuntu 12.04,x86)上,代码是用C ++编写的。该计划正在使用一些可能包含有价值信息的单身人士。是否有可能找到指向单例实例的指针,如果它是这样创建的:

SingletonType& SingletonType::getInstance(){
    static SingletonType* instance = new SingletonType();
    return *instance;
}

如果它可能,它是如何在GDB中完成的?

3 个答案:

答案 0 :(得分:3)

show modules 1 应该告诉你基本地址,并且instance被静态分配,应该在某种objdump / {{nm中可见1}}报告。是的毛茸茸的数学。

另一种方法是反汇编SingletonType::getInstance()并查看在初始化/返回路径中加载的有效地址。


1 嗯,我找不到我记得的确切匹配。 info sharedlibrary会为您提供最多信息。

答案 1 :(得分:3)

使用核心文件运行gdb,然后运行命令

disassemble  SingletonType::getInstance

在我的测试程序中,我在方法结束时发现了mov 0x<addr>, %eax指令。 print *(*(SingletonType**) <0xaddr>)应该打印单例结构的内容。

答案 2 :(得分:0)

这就是我所做的,而在核心内部使用gdb:

(gdb) info var instance

这将列出所有单例实例的所有地址,其中你会找到SingletonType的一个

0x86aa960 SingletonType::getInstance()::instance

现在我有了地址,您可以打印您的实例&#39;尖锐的记忆:

(gdb) p *((SingletonType*)0x86aa960)