C++ 使用MinGW/MSYS进行Win32 API堆栈漫游?

C++ 使用MinGW/MSYS进行Win32 API堆栈漫游?,c++,winapi,mingw,C++,Winapi,Mingw,我必须开发一个到win32 API平台支持的堆栈跟踪遍历,以捕获JAVA堆栈跟踪行为的任何异常。实际上,我们为Linux平台提供了一个完整的功能实现 首先,我尝试使用win32 CaptureStackBackTrace API实现stackwalk 机制。但是这个方法并没有集成在mingw的winbase头中(使用MSYS/mingw5.1.x) 因此,我决定按照此链接的说明尝试使用dbgheader机制: 但我又失败了,遇到了无法解决的链接器故障。我认为MinGW无法解决dbgheader

我必须开发一个到win32 API平台支持的堆栈跟踪遍历,以捕获JAVA堆栈跟踪行为的任何异常。实际上,我们为Linux平台提供了一个完整的功能实现

首先,我尝试使用win32 CaptureStackBackTrace API实现stackwalk 机制。但是这个方法并没有集成在mingw的winbase头中(使用MSYS/mingw5.1.x)

因此,我决定按照此链接的说明尝试使用dbgheader机制:

但我又失败了,遇到了无法解决的链接器故障。我认为MinGW无法解决dbgheader库

DrMinGW对我来说不是一个选项,虽然它是一个JIT调试器,但我必须实现一个堆栈跟踪机制,以应对运行时出现的任何异常,并具有可自定义的日志文件跟踪能力,就像我们从JAVA中了解到的那样

有没有人可以通过握手方式使用win32 API运行MSYS/MinGW?我不会将编译器更改为丑陋的MVC编译器,而是使用MSYS/MinGW

谢谢你的提示。 致以最良好的祝愿


Christian

下面是一个使用Win32 API遍历调用堆栈的方法,您可以从MinGW调用它


在以下链接检查Edd先生的堆栈跟踪库。它将生成一个很好的堆栈框架列表,并具有支持MinGW的特定代码

但是,他的库使用dbghelp.dll,因此在编译时可能会遇到一些问题。据我所知,MinGW不包含此DLL的导入库(请参阅旧功能请求)。然而,我成功地创建了一个导入库。您只需使用Wine项目中的.def文件(查看上一个链接的附加文件)并运行MingW实用程序dlltool即可执行相同的操作:

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

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

我在MingGW with library中获得了堆栈跟踪,它是他的最小库的继承者:

使用,这将获得堆栈跟踪:

$ pacman -S mingw-w64-x86_64-edd-dbg
//main.cpp
#包括
#包括
#包括
int main()
{
dbg::symdb;
dbg::调用_堆栈回溯;
回溯收集(0);
traceback.log(db,std::cout);
返回0;
}
$g++-ggdb main.cpp-ldbg
$./a.exe
0x0000000000402ee9:dbg::C:\msys64\home\phil\stacktrace example\a.exe中的call_stack::collect(unsigned int)
0x00000000004015f2:C:\msys64\home\phil\stacktrace example\a.exe中的main
0x00000000004013f8:\uuu tmainCRTStartup在C:\msys64\home\phil\stacktrace example\a.exe中
0x00000000004011B:mainCRTStartup在C:\msys64\home\phil\stacktrace example\a.exe中
0x00007ffbb0838102:C:\WINDOWS\system32\KERNEL32.DLL中的BaseThreadInitThunk
0x00007ffbb27cc5b4:RtlUserThreadStart在C:\WINDOWS\SYSTEM32\ntdll.dll中

有关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;
}