5

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

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

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

4

3 回答 3

4

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

disassemble  SingletonType::getInstance

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

于 2013-07-16T15:41:03.617 回答
3

show modules1可能应该告诉您基址,并且instance静态分配的,应该在某种objdump/nm报告中可见。是的,毛茸茸的数学。

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


1嗯,找不到我记得的完全匹配。info sharedlibrary会得到你最多的信息。

于 2013-07-16T14:52:29.300 回答
1

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

(gdb) info var instance

这将列出所有单例实例的所有地址,其中您将找到 SingletonType 之一

0x86aa960 SingletonType::getInstance()::instance

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

(gdb) p *((SingletonType*)0x86aa960)
于 2017-05-09T09:13:35.370 回答