2010-07-23 14 views
8

Devo sviluppare una traccia di stack trace al nostro supporto per plattform API win32 per rilevare qualsiasi eccezione con un comportamento di uno stacktrace JAVA. In realtà abbiamo ottenuto un'implementazione funzionale completa per piattaforme Linux.Lo stack dell'API Win32 cammina con MinGW/MSYS?

Per prima cosa ho provato a implementare uno stackwalk utilizzando il meccanismo win32 CaptureStackBackTrace API . Ma questo metodo non è integrato nella testata in realtà winbase di mingw (usando MSYS/MinGW 5.1.x) ...

così ho deciso provato l'uso del meccanismo dbgheader follwoing le istruzioni di questo link: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

Ma fallisco di nuovo e mi imbatto in errori di linker che non ho potuto risolvere. Penso che MinGW non possa risolvere la libreria dbgheader ....

DrMinGW non è un'opzione per me, mentre è un debugger JIT, devo implementare un meccanismo di stack trace, per qualsiasi eccezione che si verifica in runtime con un tracciabilità del file di registro personalizzabile come sappiamo da JAVA ...

Qualcuno ha ottenuto MSYS/MinGW eseguibile con l'API win32 in stretta di mano? Non cambierò il compilatore nel brutto compilatore MVC invece di usare MSYS/MinGW ...

Grazie per qualsiasi suggerimento. i migliori saluti,

cristiane

+0

Una traccia dello stack è davvero la tua seconda opzione. Se si desidera raccogliere una diagnostica veramente utile, [scrivere un minidump] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx). – IInspectable

risposta

7

check signor Edd al seguente link. Produrrà un bel elenco di frame stack e ha un codice specifico per supportare MinGW.

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

La sua biblioteca utilizza dbghelp.dll, tuttavia, così si può ottenere in alcuni problemi cercando di compilarlo. Per quanto ne so, MinGW non include una libreria di importazione per questa DLL (vedere una vecchia richiesta di funzionalità here). Ho avuto successo, tuttavia, creando una libreria di importazione da solo. Si può fare lo stesso, ma utilizzando un file .def dal progetto Wine (controllare i file allegati del link precedente per uno) e l'esecuzione dell'utilità MingW dlltool:

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

È quindi possibile includere il file dbghelp.a conseguente il tuo progetto. Probabilmente non ti piacerebbe avere dipendenze verso dbghelp.dll nei tuoi build di rilascio, dato che la stessa DLL non è sicuramente ridistribuibile.

+1

Mr. Edd ha una nuova libreria, dbg, http://www.mr-edd.co.uk/code/dbg. – yrnkrn

1

ho avuto tracce di stack che lavorano in MingGW con Edd's dbg biblioteca, che è un successore al suo minimo stack_trace libreria:

Con msys2, questo dovrebbe farti una traccia dello stack:

$ 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 

Ulteriori informazioni su dbg sono disponibili nello Wiki.Il codice è disponibile qui: https://bitbucket.org/edd/dbg/src