2010-07-23 7 views
8

Muszę opracować ścieżkę śledzenia stosu do naszej platformy API win32, aby wychwycić każdy wyjątek zachowaniem stosu stacków JAVA. W rzeczywistości mamy pełną funkcjonalną implementację dla platform Platt.Stos API Win32 chodzić z MinGW/MSYS?

Najpierw próbowałem zaimplementować deptak przy użyciu mechanizmu Win32 CaptureStackBackTrace API . Ale ta metoda nie jest zintegrowana w rzeczywistości winbase nagłówku MinGW (używając MSYS/MinGW 5.1.x) ...

więc postanowiłem próbowała wykorzystywać mechanizm dbgheader follwoing instrukcje ten link: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

Ale znowu się nie udało i mam problemy z linkerem, których nie mogłem rozwiązać. Myślę, że MinGW nie mógł rozwiązać biblioteki dbgheader ...

DrMinGW nie jest dla mnie opcją, podczas gdy jest to Debugger JIT, muszę zaimplementować mechanizm śledzenia stosu, dla każdego wyjątku występującego w czasie wykonywania z konfigurowalny plik dziennika śledzenia, jak wiemy z JAVA ...

Czy ktoś może uzyskać MSYS/MinGW z wykorzystaniem interfejsu API win32 w uzgadnianiu? Nie zmienię kompilatora na brzydki kompilator MVC zamiast używać MSYS/MinGW ...

Dzięki za podpowiedź. poważaniem,

chrześcijańskich

+0

Śledzenie stosu jest tylko twoją drugą najlepszą opcją. Jeśli chcesz zebrać naprawdę pomocną diagnostykę, [napisz minidump] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx). – IInspectable

Odpowiedz

7

Check pana Edd pod następującym linkiem. Spowoduje to utworzenie ładnej listy ramek stosu i posiada specjalny kod obsługujący MinGW.

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

Jego biblioteka korzysta dbghelp.dll jednak, więc można dostać się do niektórych problemów starają się go skompilować. O ile mi wiadomo, MinGW nie zawiera biblioteki importu dla tej biblioteki DLL (zobacz stare zapytanie o funkcję here). Udało mi się jednak samemu stworzyć jedną bibliotekę importu. Można zrobić to samo tylko przy użyciu pliku .def z projektu Wine (sprawdź załączone pliki linka za jeden) i uruchamiając MinGW użytkową dlltool:

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

można następnie dołączyć plik wynikowy w dbghelp.a Twój projekt. Prawdopodobnie nie będziesz chciał mieć zależności względem dbghelp.dll w swoich wersjach, ponieważ sama biblioteka DLL z pewnością nie jest redystrybucyjna.

+1

Pan Edd ma nowszą bibliotekę, dbg, http://www.mr-edd.co.uk/code/dbg. – yrnkrn

1

mam stack ślady pracujących w MingGW z Edd's dbg biblioteki, która jest następcą jego minimalnym stack_trace Biblioteka:

Z msys2, powinno to cię ślad stosu:

$ 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 

Więcej o dbg można znaleźć w Wiki.Kod jest dostępny tutaj: https://bitbucket.org/edd/dbg/src