C ++中的Stackdump没有显示堆栈跟踪

时间:2011-08-02 10:50:44

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

我有一个应用程序有时会崩溃并创建下一个文件:(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);

但我仍然没有stacktrace信息。

2 个答案:

答案 0 :(得分:1)

为什么堆栈跟踪不可用有几种可能性:

  1. 你编译了没有堆栈帧的代码(据我记得这是gcc / g ++生成的x86_64代码的默认行为)
  2. 你损坏了你的堆栈(堆栈溢出;))
  3. 没有什么可追查的;)(你在主要之前或之后执行的代码,你还没有输入任何功能或已经从他们返回)
  4. 从EBP = FFFFFFFF的事实来看,除非问题存在于接触EBP的低级别C或汇编程序代码中,否则我会选择#2。你能从转储中提供反汇编吗?

答案 1 :(得分:1)

  

或任何额外信息?

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