2010-07-23 1 views
8

Я должен разработать трассировку стека к нашей поддержке placform API win32, чтобы поймать любое исключение с поведением JAVA stacktrace. Фактически мы получили полную функциональную реализацию для платформ Linux.Win32 API стек ходить с MinGW/MSYS?

Сначала я попытался реализовать stackwalk, используя механизм win32 CaptureStackBackTrace API . Но этот метод не интегрирован в фактически winbase заголовке 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 с помощью API win32 в рукопожатии? Я не буду менять компилятор на уродливый компилятор MVC вместо использования MSYS/MinGW ...

Спасибо за любой намек. С наилучшими пожеланиями,

христианские

+0

Трассировка стека - это действительно ваш второй вариант. Если вы хотите собрать действительно полезную диагностику, вместо этого напишите файл minidump (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx). – IInspectable

ответ

7

Check г EDD по следующему ссылке. Он создаст хороший список кадров стека и имеет специальный код для поддержки MinGW.

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

Его библиотека использует dbghelp.dll, однако, так что вы можете попасть в некоторые проблемы, пытаясь собрать его. Насколько я знаю, MinGW не включает библиотеку импорта для этой DLL (см. Старый запрос функции here). Однако у меня был успех, создав одну библиотеку импорта. Вы можете сделать то же самое только с помощью DEF-файл из проекта Wine (проверьте присоединенные файлы предыдущей ссылки для одного) и запустить MinGW утилиты dlltool:

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

Вы можете включить полученный файл dbghelp.a в ваш проект. Вероятно, вам не захочется иметь зависимости от dbghelp.dll в ваших сборках релизов, так как сама DLL, безусловно, не распространяется.

+1

У г-на Эдда есть более новая библиотека, dbg, http://www.mr-edd.co.uk/code/dbg. – yrnkrn

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