在GDB(C++)中查找指向单例死后的指针



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

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

如果可能的话,在GDB中是如何实现的?

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

disassemble  SingletonType::getInstance

在我的测试程序中,我在方法的末尾发现了一条mov 0x<addr>, %eax指令。print *(*(SingletonType**) <0xaddr>)应该打印您的singleton结构的内容。

show modules1可能应该告诉您基地址,而静态分配的instance应该在某种objdump/nm报告中可见。是的,数学很难。

另一种选择是反汇编SingletonType::getInstance(),看看在初始化/返回路径中加载了什么有效地址。


1Mmm找不到我记忆中的完全匹配。info sharedlibrary将为您提供最多信息。

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

(gdb) info var instance

这将列出所有singletons实例的所有地址,您将在其中找到SingletonType

0x86aa960 SingletonType::getInstance()::instance

现在我有了地址,你可以打印你的实例的指向内存:

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

相关内容

  • 没有找到相关文章

最新更新