SymFromAddr возвращает флаг ERROR_INVALID_ADDRESS, как получить трассировку стека в mingw?

Все, что я пытаюсь сделать, это напечатать стек методов, которые вызвали данную строку. Я получил код от https://stackoverflow.com/a/5699483/393087 ответ. Немного переработал его, чтобы показать, в чем проблема.

#include <windows.h>
#include <iostream>
#include <imagehlp.h>
#include <dbghelp.h>

void printStack( void ) {
HMODULE dbghelp_lib = LoadLibrary("dbghelp.dll");
if (NULL == dbghelp_lib) {
printf("dbghelp.dll failed");
}
HANDLE process = GetCurrentProcess();
if (!SymInitialize( process, NULL, TRUE )) {
printf("SymInitialize failed: %d\n", GetLastError());
abort();
} else SetLastError(0);
void * stack[100];
ULONG FramesToSkip = 0;
ULONG FramesToCapture = 32;
unsigned short frames = CaptureStackBackTrace( FramesToSkip, FramesToCapture, stack, NULL );
SYMBOL_INFO * symbol;
symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
symbol->MaxNameLen = 255;
symbol->SizeOfStruct = sizeof( SYMBOL_INFO );
for(unsigned int i = 0; i < frames; i++ ) {
if(!SymFromAddr( process, ( DWORD )( stack[ i ] ), 0, symbol )) {
printf("SymFromAddr failed: %d\n", GetLastError());
}
printf( "%i: %s - 0x%0X\n", frames - i - 1, symbol->Name, symbol->Address );
}
free( symbol );
}

void testfunc() {
printStack();
}

int main() {
testfunc();
}

это возвращает:

SymFromAddr failed: 487
3:  - 0x0
SymFromAddr failed: 487
2:  - 0x0
SymFromAddr failed: 487
1:  - 0x0
0: RegisterWaitForInputIdle - 0x7C81702E

И он компилирует и ссылки без каких-либо предупреждений.

компилятор: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev7.7z

4

Решение

dbghelp читает только файлы PDB. Таким образом, ваши варианты:

  1. Переопределите API dbghelp для использования DWARF (возможно, больше работы, чем вы хотите)
  2. Конвертируйте ваши символы DWARF в PDB.

Найден небольшой поисковый запрос для №2 cv2pdb, который, кажется, ориентирован на язык программирования D, но кажется достаточно общим, чтобы это мог быть более простой подход.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector