【问题标题】:Finding the pointer to a singleton postmortem in GDB (C++)在 GDB (C++) 中查找指向单例事后分析的指针
【发布时间】:2013-07-16 14:43:39
【问题描述】:

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

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

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

【问题讨论】:

  • p/x &SingletonType::getInstance()?
  • 不,很遗憾,如果没有正在运行的进程,您无法执行此操作。

标签: c++ linux gdb postmortem-debugging


【解决方案1】:

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

disassemble  SingletonType::getInstance

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

【讨论】:

  • 不知道你为什么不直接dissassemble SingletonType::getInstance?一方面,根据基地址,disassemble <address_from_objdump> 甚至可能不会做正确的事情。
  • 你是对的。给定的过程给了我想要的东西,但绝对可以通过使用函数的名称来反汇编,而且它也更优雅:)
  • 好点。我删除了 objdump 部分并在我的答案中更新了反汇编命令。
【解决方案2】:

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

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


1 嗯,找不到我记得的完全匹配。 info sharedlibrary 将为您提供最多信息。

【讨论】:

    【解决方案3】:

    这就是我在使用 gdb 的核心时所做的:

    (gdb) info var instance
    

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

    0x86aa960 SingletonType::getInstance()::instance
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2023-04-02
      相关资源
      最近更新 更多