【问题标题】:How to find the call stack when there is just a corrupt stack corefile?当只有损坏的堆栈核心文件时如何找到调用堆栈?
【发布时间】:2013-07-25 04:05:32
【问题描述】:

一个带有损坏堆栈的 coredump 文件,没有任何有用的信息。我怎样才能找到调用堆栈? 堆栈显示:

#0  0x04229c7a in ?? ()
#1  0x00921fa7 in ?? ()
#2  0xbfc17e04 in ?? ()

回溯停止:此帧内部的前一帧(损坏的堆栈?)

并且eip的地址显示“无法访问内存”! 想!

【问题讨论】:

  • 您有任何其他类型的日志文件可以帮助您吗?它可能有助于为您提供有关问题大致位置的线索。或者一路走下去,使用函数跟踪,这样你就可以exaclty看到发生了什么。
  • 无法从日志中找到任何有用的信息!
  • 如果您的代码不包含任何动态库,您可以尝试通过映射文件将此地址映射到函数。
  • 如果可以重现,请使用调试器,不要尝试使用核心文件。如果不是,那么首先要意识到的是,几乎每个函数都会在入口处创建一个堆栈帧。这会创建一个指针链,这些指针不断地指向堆栈的更高位置。使用调试器并尝试了解您的堆栈帧通常看起来像什么。弄清楚如何识别堆栈帧元素和堆栈上的返回指令指针,然后返回您的核心文件并找到堆栈帧。堆栈的较高部分很可能仍然可以。

标签: c gcc gdb core


【解决方案1】:

显示调用堆栈需要正确的指令指针(eip)、堆栈指针(esp)和有效的堆栈内容。

从您的输出看来,堆栈已损坏,之前的函数返回到某个随机地址 (eip=0x04229c7a)。

所以,你运气不好。

尝试在 valgrind 下运行您的程序。

【讨论】:

  • 尝试在 valgrind 下运行您的应用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2015-07-03
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多