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

Dumping stack after crash with gcc on Windows

本文关键字:崩溃 转储 堆栈 gcc Windows      更新时间:2023-10-16

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

我深入搜索了这样的解决方案,但只有VS解决方案。

到目前为止,我已经在SetUnhandledExceptionFilter注册了一个handler。根据我的观察,当调用handler时,堆栈"仅限于"我的handler函数+一些额外的系统函数。

原始堆栈似乎在它上面(根据传递给我的handlerEXCEPTION_POINTERS中存储的原始espebp)。

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

我也尝试过使用posix‘signal,但堆栈也受到同样的限制。

我一直在寻找答案,下面是我得到的:

在windows下应用程序崩溃的情况下,(至少)有两种方法可以找到真正的堆栈。

  1. 堆栈可以通过这里描述的简单技巧进行回溯。需要使用EXCEPTION_POINTERS中的ebp成员,而不是真正的ebp寄存器
  2. 此处的STACKFRAME64示例用法

然后有必要将地址转换为函数名。在这里,我发现了3种方法:

  1. addr2line
  2. SymFromAddr
  3. bfd

有问题的是,所有这些都在处理特定的可执行文件。有必要单独处理额外的dll文件。

在我的程序中,我将尝试使用KDE5的KCrash+drkonqi。顺便说一句,这两个项目都是有价值的信息来源。