C++ SymFromAddr返回错误\无效\地址标志,如何在mingw中获取堆栈跟踪?

C++ SymFromAddr返回错误\无效\地址标志,如何在mingw中获取堆栈跟踪?,c++,c,debugging,winapi,backtrace,C++,C,Debugging,Winapi,Backtrace,我所要做的就是打印调用给定行的方法堆栈。我从答案中得到了密码。对其进行了轻微的重构,以显示问题所在 #include <windows.h> #include <iostream> #include <imagehlp.h> #include <dbghelp.h> void printStack( void ) { HMODULE dbghelp_lib = LoadLibrary("dbghelp.dll"); if (NULL ==

我所要做的就是打印调用给定行的方法堆栈。我从答案中得到了密码。对其进行了轻微的重构,以显示问题所在

#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();
}
它在没有任何警告的情况下编译和链接


编译器:

dbghelp只读取PDB文件。因此,您的选择是:

  • 重新实现dbghelp API以使用DWARF(可能比您想要的工作量更多)
  • 将矮人符号转换为PDB

  • 谷歌搜索了一下#2,发现它似乎是面向D编程语言的,但它似乎足够通用,因此可能是一种更简单的方法。

    我想知道dbghelp是否支持非microsoft编译器。它需要一个.pdb文件来将地址映射到符号。当然你没有。dbghelp目前不支持DWARF符号,它只支持PDB。我得到的答案是如何使SYMFORMADDR与MinGW或产生符号的等效解决方案一起工作。我发现如果我在函数原型上使用u declspec(dllexport),符号就会显示出来。
    SymFromAddr failed: 487
    3:  - 0x0
    SymFromAddr failed: 487
    2:  - 0x0
    SymFromAddr failed: 487
    1:  - 0x0
    0: RegisterWaitForInputIdle - 0x7C81702E