Win32 API стека ходить с MinGW / MSYS? - PullRequest
8 голосов
/ 23 июля 2010

Мне нужно разработать трассировку стека для нашей поддержки платформ Win32 API, чтобы отследить любое исключение с поведением стека трассировки JAVA.На самом деле мы получили полнофункциональную реализацию для платформ Linux.

Сначала я попытался реализовать стек в стеке, используя механизм Win32 CaptureStackBackTrace API.Но этот метод не интегрирован в фактически winbase-заголовок mingw (используя MSYS / MinGW 5.1.x) ...

Поэтому я решил попробовать использовать механизм dbgheader, следуя инструкциям этой ссылки: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

Но я снова проваливаюсь и сталкиваюсь с ошибками компоновщика, которые не могу решить.Я думаю, что MinGW не смог разрешить библиотеку dbgheader ....

DrMinGW не подходит для меня, хотя это JIT Debugger, я должен реализовать механизм трассировки стека, для любого исключения, происходящего во время выполненияс настраиваемой возможностью отслеживания файлов журнала, как мы знаем из JAVA ...

Кто-нибудь запускал MSYS / MinGW с Win32 API в рукопожатии?Я не буду менять компилятор на уродливый компилятор MVC вместо того, чтобы использовать MSYS / MinGW ...

Спасибо за любую подсказку.С уважением,

Кристиан

Ответы [ 3 ]

7 голосов
/ 24 августа 2011

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

http://www.mr -edd.co.uk / код / ​​stack_trace

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

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

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

3 голосов
/ 24 июля 2010

Вот метод обхода стека вызовов с использованием Win32 API, который вы можете вызвать из MinGW.

1 голос
/ 01 сентября 2016

Я получил трассировки стека, работающие в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...