在Windows上使用gcc崩溃后转储堆栈

时间:2015-12-29 20:31:36

标签: c++ windows gcc

我想为我的应用编写一个(或使用现有的)崩溃处理程序。 我遇到的问题是我想要它用于Windows和gcc。

我深深地寻找了这样的解决方案,但只有VS。

到目前为止,我已handler注册了SetUnhandledExceptionFilter。 根据我在调用handler时的观察结果,堆栈是有限的'到我的handler函数+一些额外的系统函数。

原始堆栈似乎位于其上方(根据原始espebp存储在EXCEPTION_POINTERS传递给我的handler)。

我试图将当前espebp切换为已保存的,但我通常以崩溃结束。

我也试过使用posix' signal但堆栈的限制方式相同。

1 个答案:

答案 0 :(得分:0)

我一直在寻找答案,这就是我所拥有的:

在Windows下应用程序崩溃的情况下,有(至少)两种查找实际堆栈的方法。

  1. 堆栈可以使用描述here的简单技巧进行回溯。有必要使用ebp中的EXCEPTION_POINTERS成员而不是真正的ebp注册。
  2. STACKFRAME64示例用法here
  3. 然后有必要将地址转换为函数名称。在这里,我找到了3种方法:

    1. addr2line
    2. SymFromAddr
    3. bfd
    4. 有什么问题 - 所有这些都与特定的可执行文件一起使用。有必要单独处理额外的dll文件。

      在我的计划中,我会尝试使用KDE5 KCrash + drkonqi。顺便提一下,这两个项目都是有价值的信息来源。