mingw 下的 stack backtrace
我们的项目的 Windows 版本是用 MinGW 开发的。当程序在 Windows 下挂掉后,固然可以用 gdb 调试,看到调用栈。但有些时候还是不够方便。
比如说今天,我们写的模型编辑器发到广州美术同事使用时,就出了问题。3d 程序在不同显卡环境下的确容易出故障,异地调试程序非常困难。这个时候,多么想看看调用栈啊。
The GNU C Library 是提供了 Backtraces 的,可惜 MinGW 不支持 :( 。最后打算自己写一个。
获取 stack backtrace 调试信息的基本原理就是利用 windows 的 imagehlp.dll 取得正在运行的 exe 或 dll 被系统加载到内存后的镜像信息(可能被重定位了)。然后利用 libbfd 按偏移量取得源码的相关信息。
在崩溃时获取调用栈信息使用的是 SetUnhandledExceptionFilter ,可以注册一个函数拿到 context 继续处理。
搜索一番后,发现其实有个哥们实现了个 C++ 版本 。不过我还是用我自己写的 C 版本吧。
使用非常简单,只需要把事先编译好的 backtrace.dll 在需要追踪的程序前面加载一下即可,然后在 crash 时就会向 strerr 输出详细的堆栈信息。
有兴趣的同学可以看这里:我把它在 code.google.com 上开源了。
Comments
Posted by: dhqcl | (22) July 15, 2022 12:44 AM
Posted by: zhaoyun | (21) May 18, 2017 04:10 PM
Posted by: Anonymous | (20) June 17, 2016 02:44 PM
Posted by: wosinwu | (19) December 5, 2010 10:42 AM
Posted by: Cloud | (18) November 29, 2010 11:47 AM
Posted by: wosinwu | (17) November 26, 2010 06:16 PM
Posted by: Cloud | (16) September 2, 2010 07:20 PM
Posted by: Anonymous | (15) August 23, 2010 04:59 PM
Posted by: Anonymous | (14) August 23, 2010 04:39 PM
Posted by: Cloud | (13) August 19, 2010 05:12 PM
Posted by: jobasic | (12) August 4, 2010 11:08 PM
Posted by: 夏天 | (11) July 31, 2010 08:47 AM
Posted by: qvod | (10) July 29, 2010 09:07 PM
Posted by: Cloud | (9) July 29, 2010 03:26 PM
Posted by: missdeer | (8) July 29, 2010 02:25 PM
Posted by: Anonymous | (7) July 29, 2010 01:18 PM
Posted by: Cloud | (6) July 29, 2010 11:03 AM
Posted by: cloud | (5) July 29, 2010 11:02 AM
Posted by: fseraph | (4) July 29, 2010 09:07 AM
Posted by: Anonymous | (3) July 28, 2010 10:44 PM
Posted by: halida | (2) July 28, 2010 06:54 PM
Posted by: Anonymous | (1) July 28, 2010 06:53 PM