C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 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 ] ),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

解决方法

dbgHelp只读取PDB文件.因此,您的选择是:

>重新实现dbgHelp API以使用DWARF(可能比您想要的更多工作)
>将DWARF符号转换为PDB.

对于#2的一些谷歌搜索找到了cv2pdb,它似乎面向D编程语言,但它看起来很通用,可能是一种更简单的方法.

大佬总结

以上是大佬教程为你收集整理的c – SymFromAddr返回ERROR_INVALID_ADDRESS标志,如何在mingw中获取堆栈跟踪?全部内容,希望文章能够帮你解决c – SymFromAddr返回ERROR_INVALID_ADDRESS标志,如何在mingw中获取堆栈跟踪?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。