2010-07-23 76 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