2010-07-23 74 views
8

我必须开发一个堆栈跟踪步行到我们的win32 API plattform支持,以捕获任何异常与JAVA stacktrace的行为。实际上,我们为Linux平台提供了一个完整的功能实现。Win32 API堆栈走MinGW/MSYS?

首先,我试图使用win32 CaptureStackBackTrace API 机制实现stackwalk。但是这种方法没有集成在MinGW的(使用MSYS/MinGW的5.1.x版)的实际胜基头......

,所以我决定尝试使用dbgheader机制follwoing该链接的说明: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

但我再次失败,并遇到我无法解决的链接器故障。我认为MinGW无法解决dbgheader库....

DrMinGW不是我的选择,虽然它是一个JIT调试器,我必须实现一个堆栈跟踪mechansim,任何发生在运行时的异常与一个可定制的日志文件可追溯性,就像我们从JAVA知道的那样...

有没有人在握手过程中获得MSYS/MinGW可与win32 API一起运行?我不会将编译器更改为丑陋的MVC编译器,而不是使用MSYS/MinGW ...

感谢您的任何提示。 最好的问候,

基督教

+0

堆栈跟踪只是您的第二好选择。如果您想收集真正有用的诊断信息,请改为[写一个小型转储程序](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx)。 – IInspectable 2015-08-27 14:55:52

回答

7

检查埃德先生的堆栈跟踪库。它将产生一个不错的堆栈框架列表并且具有支持MinGW的特定代码。

http://www.mr-edd.co.uk/code/stack_trace

他的库使用dbghelp.dll,然而,你可能会遇到一些问题试图进行编译。据我所知,MinGW不包含此DLL的导入库(请参阅旧功能请求here)。但是,我成功了,自己创建了一个导入库。

dlltool -k -d dbghelp.def -l dbghelp.a 

然后,您可以在结果dbghelp.a文件:您可以只使用在葡萄酒项目.def文件(检查前一个环节的附加文件一)和运行MinGW的工具dlltool做同样的你的项目。您可能不希望在发布版本中对dbghelp.dll有依赖关系,因为DLL本身肯定不是可再发行的。

+1

Edd先生有一个更新的库,dbg,http://www.mr-edd.co.uk/code/dbg。 – yrnkrn 2013-12-22 16:27:21

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