5

私がやろうとしているのは、特定の行を呼び出したメソッドのスタックを出力することだけです。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

1 に答える 1

1

dbghelp は PDB ファイルのみを読み取ります。したがって、オプションは次のとおりです。

  1. DWARF を使用するように dbghelp API を再実装します (おそらく必要以上の作業が必要です)。
  2. DWARF シンボルを PDB に変換します。

#2 を少しグーグルで検索すると、 cv2pdbが見つかりました。これは、D プログラミング言語向けのように見えますが、より単純なアプローチである可能性があるほど一般的なようです。

于 2015-02-24T19:32:44.557 に答える