2010-07-23 12 views
8

Ich muss einen Stack-Trace zu unserer win32-API-Plattform-Unterstützung entwickeln, um jede Ausnahme mit dem Verhalten eines JAVA-Stacktrace zu erfassen. Tatsächlich haben wir eine voll funktionsfähige Implementierung für Linux-Plattformen erhalten.Win32-API-Stack mit MinGW/MSYS laufen?

Zuerst habe ich versucht, einen StackWalk mit dem Win32 CaptureStackBackTrace API Mechanismus zu implementieren. Aber diese Methode ist in der tatsächlich winbase Header mingw (mit MSYS/MinGW 5.1.x) nicht integriert ...

Also habe ich beschlossen, versuchte Nutzung der dbgheader Mechanismus follwoing die Anweisungen dieser Link: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

Aber ich scheitere wieder und stoße auf Linker-Fehler, die ich nicht lösen konnte. Ich denke MinGW konnte die dbgheader Bibliothek nicht auflösen ....

DrMinGW ist keine Option für mich, während es ein JIT Debugger ist, muss ich einen Stack-Trace-Mechanismus implementieren, für jede Ausnahme, die während der Laufzeit mit einem auftritt anpassbare Protokolldatei Tracefulness wie wir von JAVA wissen ...

Hat jemand MSYS/MinGW Runable mit der win32 API in Handshake? Ich ändere den Compiler nicht zum hässlichen MVC-Compiler anstatt MSYS/MinGW ...

Danke für jeden Hinweis. Mit freundlichen Grüßen,

Christian

+0

Ein Stack-Trace ist nur Ihre zweitbeste Option. Wenn Sie wirklich hilfreiche Diagnosen sammeln möchten, [schreiben Sie stattdessen einen Minidump] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx). – IInspectable

Antwort

7

überprüfen Mr. Edd der Stack-Trace-Bibliothek unter folgendem Link. Es wird eine schöne Stapelrahmenliste erzeugen und einen spezifischen Code zur Unterstützung von MinGW haben.

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

Seine Bibliothek verwendet dbghelp.dll jedoch, so dass Sie in einige Probleme bekommen kann versuchen, es zu kompilieren. Soweit ich weiß, enthält MinGW keine Import-Bibliothek für diese DLL (siehe eine alte Feature-Anfrage here). Ich hatte jedoch Erfolg, indem ich selbst eine Importbibliothek erstellte. Sie können das gleiche tun, nur eine DEF-Datei aus dem Wine-Projekt mit (überprüfen Sie den angehängten Dateien des vorherigen Link für eine Person) und den Betrieb des MingW Dienstprogramm dlltool:

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

Sie können dann die resultierende dbghelp.a Datei enthalten in dein Projekt. Sie werden wahrscheinlich keine Abhängigkeiten gegenüber dbghelp.dll in Ihren Release-Builds haben, da die DLL selbst nicht weiterverbreitbar ist.

+1

Herr Edd hat eine neuere Bibliothek, dbg, http://www.mr-edd.co.uk/code/dbg. – yrnkrn

1

Ich habe stapeln Spuren in MingGW mit Edd's dbg Bibliothek arbeiten, die ein Nachfolger seines minimalen stack_trace Bibliothek ist:

Mit msys2, dies sollten Sie einen Stack-Trace erhalten:

$ 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 

Weitere Informationen über dbg finden Sie in der Wiki.Der Code ist hier verfügbar: https://bitbucket.org/edd/dbg/src