答案 0 :(得分:7)
在以下链接中查看Edd先生的堆栈跟踪库。它将产生一个很好的堆栈框架列表,并具有支持MinGW的特定代码。
http://www.mr-edd.co.uk/code/stack_trace
他的库使用dbghelp.dll,因此您可能会遇到一些尝试编译它的问题。据我所知,MinGW不包含此DLL的导入库(请参阅旧功能请求here)。但是,我成功了,自己创建了一个导入库。您可以使用Wine项目中的.def文件(检查上一个链接的附加文件)并运行MingW实用程序dlltool来执行相同操作:
dlltool -k -d dbghelp.def -l dbghelp.a
然后,您可以在项目中包含生成的dbghelp.a文件。您可能不希望在发布版本中依赖于dbghelp.dll,因为DLL本身肯定不可再发行。
答案 1 :(得分:3)
答案 2 :(得分:1)
我在MingGW中使用Edd's dbg库获得了堆栈跟踪,这是他的最小stack_trace库的继承者:
使用msys2,这可以为您提供堆栈跟踪:
$ pacman -S mingw-w64-x86_64-edd-dbg
// main.cpp
#include <dbg/frames.hpp>
#include <dbg/symbols.hpp>
#include <iostream>
int main()
{
dbg::symdb db;
dbg::call_stack<64> traceback;
traceback.collect(0);
traceback.log(db, std::cout);
return 0;
}
$ g++ -ggdb main.cpp -ldbg
$ ./a.exe
0x0000000000402ee9: dbg::call_stack<64u>::collect(unsigned int) in C:\msys64\home\phil\stacktrace-example\a.exe
0x00000000004015f2: main in C:\msys64\home\phil\stacktrace-example\a.exe
0x00000000004013f8: __tmainCRTStartup in C:\msys64\home\phil\stacktrace-example\a.exe
0x000000000040151b: mainCRTStartup in C:\msys64\home\phil\stacktrace-example\a.exe
0x00007ffbb0838102: BaseThreadInitThunk in C:\WINDOWS\system32\KERNEL32.DLL
0x00007ffbb27cc5b4: RtlUserThreadStart in C:\WINDOWS\SYSTEM32\ntdll.dll
有关dbg的更多信息,请参见Wiki。代码可在此处获取:https://bitbucket.org/edd/dbg/src