【问题标题】:gdb interpret memory address as an objectgdb 将内存地址解释为对象
【发布时间】:2011-03-21 18:17:59
【问题描述】:

我正在根据可用的核心转储调查一次崩溃。崩溃的应用程序是一个 C++ 程序,使用 gcc 构建并在 RH5 上运行。回溯似乎在#1 帧之前有效。那里试图打印我得到的对象 <invalid address>, <error reading variable> 由于我从#2 帧中获得了对象的地址,因此我可以以某种方式“转储”分配对象的内存并仍然收集一些信息,这是一个有效的假设。此外,我可以强制 gdb 将地址作为对象打印,而不是试图猜测对象是如何对齐的,即使它检测到一些错误。我的想法是,也许该对象已经被删除,但也许内存仍然存在,我可以打印一些成员变量。

请评论这是否可能,如果是,应该如何在 gdb 术语中完成。 10 倍。

【问题讨论】:

  • 不确定它是否有效,但您可以尝试print *((Obj*)address)。它有时对我有用。

标签: c++ linux gdb


【解决方案1】:

好吧,如果你有地址,你总是可以这样做的:

print *(class MyClass*)pointer_var

【讨论】:

  • 好吧,我尝试以这种方式打印它(gdb) p (class MyClass *)m_pointer 但我得到了No struct type named MyClass 似乎 gdb 不知道我的班级。
  • @Yordan 你当然需要转换成你想要打印的结构。
  • @Let_Me_Be 你是什么意思?不是(class MyClass *) 部分所做的。
  • @Let_Me_Be 现在我明白了你的想法。好吧,我当然使用了我班级的正确名称。 :) 我只是坚持你的 MyClass 例子。 gdb 仍然找不到我的课程,很可能是因为它来自共享库。对那个有什么想法吗?
  • 晚了 7 年但是 - 尝试不使用 class - 例如p *(MyClass *) <value>
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2018-09-08
相关资源
最近更新 更多