2010-07-23 13 views
8

Je dois développer une marche de trace de pile vers notre support de plate-forme API win32 pour attraper n'importe quelle exception avec un comportement d'une piletrace JAVA. En fait, nous avons une implémentation fonctionnelle complète pour les plateformes Linux.Pilote Win32 API marche avec MinGW/MSYS?

D'abord, j'ai essayé d'implémenter un stackwalk en utilisant le mécanisme win32 CaptureStackBackTrace API . Mais cette méthode est pas intégrée dans l'en-tête winbase fait de MinGW (en utilisant 5.1.x MSYS/MinGW) ...

Alors moi avons décidé essayé utiliser le mécanisme de dbgheader follwoing les instructions de ce lien: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

Mais j'échoue encore et courez dans des échecs de linker que je n'ai pas pu résoudre. Je pense que MinGW ne pouvait pas résoudre la bibliothèque dbgheader ....

DrMinGW est pas une option pour moi, alors qu'il est un Debugger JIT, j'ai à mettre en œuvre un mechansim de trace de la pile, pour tout se produisant d'exception sur l'exécution d'un La traçabilité du fichier journal personnalisable comme nous le savons depuis JAVA ...

Est-ce que quelqu'un a déjà fait fonctionner MSYS/MinGW avec l'API win32? Je ne vais pas changer le compilateur au compilateur MVC laide au lieu d'utiliser MSYS/MinGW ...

Merci pour tout indice. Meilleures salutations,

Christian

+0

Une trace de la pile n'est vraiment votre deuxième meilleure option. Si vous voulez rassembler des diagnostics vraiment utiles, [écrire une minidump] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx) à la place. – IInspectable

Répondre

7

bibliothèque de trace Vérifiez la pile de M. Edd sur le lien suivant. Il produira une belle liste de cadres de pile et aura un code spécifique pour supporter MinGW.

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

Sa bibliothèque utilise dbghelp.dll, cependant, vous pouvez entrer dans certains problèmes en essayant de le compiler. Pour autant que je sache, MinGW n'inclut pas de bibliothèque d'importation pour cette DLL (voir une ancienne demande de fonctionnalité here). J'ai eu du succès, cependant, en créant une bibliothèque d'importation moi-même. Vous pouvez faire la même chose que d'utiliser un fichier .def du projet Wine (vérifier les fichiers de lien précédent ci-joints pour un) et l'exécution du dlltool utilitaire MingW:

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

Vous pouvez ensuite inclure le fichier dbghelp.a résultat votre projet. Vous ne voudrez probablement pas avoir de dépendances vers dbghelp.dll dans vos versions de version, car la DLL elle-même n'est sûrement pas redistribuable.

+1

M. Edd a une nouvelle bibliothèque, dbg, http://www.mr-edd.co.uk/code/dbg. – yrnkrn

1

je suis arrivé traces de pile travaillant dans MingGW avec bibliothèque Edd's dbg, qui est un successeur à sa bibliothèque stack_trace minimale:

Avec msys2, cela devrait vous obtenir une trace de pile:

$ 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 

Plus sur dbg peut être trouvé dans le Wiki.Le code est disponible ici: https://bitbucket.org/edd/dbg/src