我正在对一个崩溃的程序进行事后分析。我在Linux(Ubuntu 12.04,x86)上,代码是用C ++编写的。该计划正在使用一些可能包含有价值信息的单身人士。是否有可能找到指向单例实例的指针,如果它是这样创建的:
SingletonType& SingletonType::getInstance(){
static SingletonType* instance = new SingletonType();
return *instance;
}
如果它可能,它是如何在GDB中完成的?
答案 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)