在Windows上使用gcc崩溃后转储堆栈
Dumping stack after crash with gcc on Windows
我想为我的应用程序编写一个(或使用现有的)崩溃处理程序。我遇到的问题是,我希望它适用于Windows和gcc。
我深入搜索了这样的解决方案,但只有VS解决方案。
到目前为止,我已经在SetUnhandledExceptionFilter
注册了一个handler
。根据我的观察,当调用handler
时,堆栈"仅限于"我的handler
函数+一些额外的系统函数。
原始堆栈似乎在它上面(根据传递给我的handler
的EXCEPTION_POINTERS
中存储的原始esp
和ebp
)。
我试图将当前的esp
和ebp
切换为已保存的,但通常以崩溃告终。
我也尝试过使用posix‘signal
,但堆栈也受到同样的限制。
我一直在寻找答案,下面是我得到的:
在windows下应用程序崩溃的情况下,(至少)有两种方法可以找到真正的堆栈。
- 堆栈可以通过这里描述的简单技巧进行回溯。需要使用
EXCEPTION_POINTERS
中的ebp
成员,而不是真正的ebp
寄存器 - 此处的
STACKFRAME64
示例用法
然后有必要将地址转换为函数名。在这里,我发现了3种方法:
addr2line
SymFromAddr
bfd
有问题的是,所有这些都在处理特定的可执行文件。有必要单独处理额外的dll文件。
在我的程序中,我将尝试使用KDE5的KCrash
+drkonqi
。顺便说一句,这两个项目都是有价值的信息来源。
相关文章:
- 在Windows上调试linux崩溃转储
- 如何从核心转储文件中识别导致崩溃的完整命令
- 是否可以以编程方式创建迷你转储文件而不会崩溃?
- 故障转储文件是否需要崩溃时正在运行的本地文件
- QNX - 崩溃时未生成核心转储
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- pthread_join崩溃与核心转储段错误
- 我应该通过单独的过程编写自己的崩溃转储还是依赖WER
- 如何在c++中用程序禁用崩溃转储
- 有没有为mac和win应用程序创建和上传崩溃转储的服务
- 使用fopen for file时,matlab在没有转储文件的情况下崩溃
- 使用小型转储和 GDB 分析崩溃,以便 mingw 编译的可执行文件
- 在Android NDK中捕获C++信号,并且仍然打印崩溃转储
- 为c++应用程序创建崩溃转储报告
- 如何从启用了优化(发布模式)的二进制文件中分析崩溃转储
- 分段错误-POSIX上的C++崩溃转储
- 崩溃转储分析:CxxUnhandledExceptionFilter
- 如何在Android的崩溃转储中获得更多的调用堆栈深度?
- 以编程方式分析崩溃转储
- 如何在CrashRpt中配置电子邮件设置以发送崩溃转储