使用MinGW/MSYS进行Win32 API堆栈跟踪?

8
我需要开发一个堆栈跟踪程序来支持我们的win32 API平台,以捕获任何异常并表现出类似JAVA堆栈跟踪的行为。实际上,我们已经在Linux平台上拥有完全功能的实现。
首先,我尝试使用win32 CaptureStackBackTrace API机制实现堆栈跟踪。但是,这种方法没有集成在mingw的实际winbase头文件中(使用MSYS/MinGW 5.1.x)...
因此,我决定尝试使用dbgheader机制,按照这个链接的说明进行操作: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32 但我又失败了,并遇到了无法解决的链接器错误。我认为MinGW无法解析dbgheader库...
DrMinGW对我来说不是一个选择,因为它是一个JIT调试器,我必须实现一个堆栈跟踪机制,以便在运行时出现任何异常时具有可自定义的日志文件追踪性,就像我们从JAVA中所知道的那样...
有人能够让MSYS/MinGW与win32 API协同运行吗?我不想改用丑陋的MVC编译器,而是继续使用MSYS/MinGW...
感谢任何提示。 最好的问候, Christian

堆栈跟踪只是你的次优选择。如果你想收集真正有用的诊断信息,最好写一个迷你转储文件。 - IInspectable
3个回答

7
请查看以下链接中的 Mr. Edd 的堆栈跟踪库。它将生成漂亮的堆栈帧列表,并具有支持 MinGW 的特定代码。

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

他的库使用dbghelp.dll,但是如果您尝试编译它,可能会遇到一些问题。据我所知,MinGW没有包含此DLL的导入库(请参见旧功能请求这里)。然而,我成功地创建了一个导入库。您可以使用Wine项目中的.def文件(检查前面链接的附加文件)并运行MingW实用程序dlltool来做同样的事情。
dlltool -k -d dbghelp.def -l dbghelp.a

您可以将生成的dbghelp.a文件包含在您的项目中。您可能不希望在发布版本中存在对dbghelp.dll的依赖,因为该DLL本身肯定不可再分发。

3

1
我用Edd's dbg库在MingGW中实现了堆栈跟踪,这是他的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接