【问题标题】:Stackdump in C++ not showing the stack traceC++ 中的 Stackdump 不显示堆栈跟踪
【发布时间】:2011-10-18 03:51:56
【问题描述】:

我有一个应用程序有时会崩溃并创建下一个文件:(APP.exe.stackdump)

Exception: STATUS_ACCESS_VIOLATION at eip=6BA4B246
eax=67452301 ebx=EFCDAB89 ecx=98BADCFE edx=10325476 esi=FFFFFFFF edi=98BADCFE
ebp=FFFFFFFF esp=01A2C928 program=C:\APP.exe, pid 168, thread unknown (0x13E8)
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame     Function  Args
End of stack trace

我在 Windows、Ubuntu 和 Centos 中使用 g++ 进行编译。错误有时只发生在一个线程内,无论如何都可以获取堆栈跟踪发生在哪里?或者任何额外的信息?

更新 1:

我可以用:

signal(SIGSEGV, sigHandler);

但我仍然没有堆栈跟踪信息。

【问题讨论】:

  • 您正在 Windows、Ubuntu 和 Centos 中编译。您是全部 3 个错误还是只有 1 个错误?
  • 我可能弄错了,但esp 看起来很合理。你看过那里吗?缺少堆栈跟踪仅意味着无法自动找到顶级返回值,但这只需要非常小的堆栈损坏(一个指针)
  • 似乎是堆栈损坏。如果用-g 编译,你能在gdb 中重现它吗?
  • @yi_H,我正在使用 -g 在调试模式下编译。我不知道如何找到错误在哪里,我需要调试信息,例如最后执行的函数的堆栈跟踪。 Vjo,这个错误有时会在 Centos 中发生,但我在 Windows XP 中看到的更多。
  • @yi_H 在 gdb 中有时会中断一个没有堆栈信息的未知信号,只有 asm 代码 (md5_block_asm_data_order+38: mov (%esi),%ebp)。

标签: c++ exception gcc stack stack-trace


【解决方案1】:

或者任何额外的信息?

使用 valgrind 或 efence。两者都非常擅长在取消引用时查找野指针的使用情况,而不是稍后使用损坏的数据时。

【讨论】:

  • 我过去曾用这个应用程序尝试过 valgrind,但在这个应用程序的某些地方中断了。我会试试efence。谢谢
【解决方案2】:

堆栈跟踪不可用的原因有几种:

  1. 您在没有堆栈帧的情况下编译了代码(据我所知,这是 gcc/g++ 生成的 x86_64 代码的默认行为)
  2. 您损坏了堆栈(堆栈溢出;))
  3. 没有什么可追踪的;)(您在 main 之前或之后执行的代码中,您还没有输入任何函数或已经从它们返回)

从 EBP=FFFFFFFF 的事实来看,除非问题存在于低级 C 或涉及 EBP 的汇编代码中,否则我会选择 #2。你能提供从转储中反汇编吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2016-10-05
    相关资源
    最近更新 更多