我正在对一个崩溃的程序进行事后分析。我在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 modules
1可能应该告诉您基地址,而静态分配的instance
应该在某种objdump
/nm
报告中可见。是的,数学很难。
另一种选择是反汇编SingletonType::getInstance()
,看看在初始化/返回路径中加载了什么有效地址。
1Mmm找不到我记忆中的完全匹配。info sharedlibrary
将为您提供最多信息。
这就是我所做的,而在核心中使用gdb:
(gdb) info var instance
这将列出所有singletons实例的所有地址,您将在其中找到SingletonType
0x86aa960 SingletonType::getInstance()::instance
现在我有了地址,你可以打印你的实例的指向内存:
(gdb) p *((SingletonType*)0x86aa960)