关于用dbghelp.dll捕获到错误时,得到堆栈调用的函数的名字的有关问题
关于用dbghelp.dll捕获到异常时,得到堆栈调用的函数的名字的问题
接下来,为了得到堆栈调用的函数的名字,网上介绍的方法都是用SymFromAddr这个函数,但是这个函数是需要编译时产生的pdb文件的,
我很想知道,有没有什么办法不依赖PDB文件,而知道异常发生时,堆栈里面的函数名字以及其所在的程序或者动态库.
------解决方案--------------------
那函数名字什么的从哪里来...
------解决方案--------------------
------解决方案--------------------
PDB符号文件记录调试信息,出错时需要根据PDB才能转换成对应调试信息,还没听说过DUMP能脱离PDB文件。
------解决方案--------------------
没有pdb的话只能看汇编代码
- C/C++ code
STACKFRAME64 sf; memset(&sf, 0, sizeof(sf)); DWORD64 eip, esp, ebp; eip= pExcPointer->ContextRecord->Eip; esp = pExcPointer->ContextRecord->Esp; ebp = pExcPointer->ContextRecord->Ebp; //初始化stackframe结构 sf.AddrPC.Offset = eip; sf.AddrPC.Mode = AddrModeFlat; sf.AddrStack.Offset = esp; sf.AddrStack.Mode = AddrModeFlat; sf.AddrFrame.Offset = ebp; sf.AddrFrame.Mode = AddrModeFlat; DWORD dwMachineType = IMAGE_FILE_MACHINE_I386; HANDLE hProcess = GetCurrentProcess(); HANDLE hThread = GetCurrentThread(); BOOL bRet = SymInitialize(hProcess, NULL, NULL); memset(buf, 0, 256); //WideCharToMultiByte(CP_ACP, 0, szModuleName, wcslen(szModuleName) + 1, buf, 256, NULL, NULL); PLOADED_IMAGE pLoadImage; pLoadImage = ImageLoad(szModuleName, NULL); DWORD dwLoad = SymLoadModule(hProcess, NULL, szModuleName,NULL, 0, pLoadImage->SizeOfImage); while(1) { //获取下一栈帧 if(!StackWalk64(dwMachineType, hProcess, hThread, &sf, pExcPointer->ContextRecord, 0, (PFUNCTION_TABLE_ACCESS_ROUTINE64)SymFunctionTableAccess, (PGET_MODULE_BASE_ROUTINE64)SymGetModuleBase, 0)) break; ......
接下来,为了得到堆栈调用的函数的名字,网上介绍的方法都是用SymFromAddr这个函数,但是这个函数是需要编译时产生的pdb文件的,
我很想知道,有没有什么办法不依赖PDB文件,而知道异常发生时,堆栈里面的函数名字以及其所在的程序或者动态库.
------解决方案--------------------
那函数名字什么的从哪里来...
------解决方案--------------------
------解决方案--------------------
PDB符号文件记录调试信息,出错时需要根据PDB才能转换成对应调试信息,还没听说过DUMP能脱离PDB文件。
------解决方案--------------------
没有pdb的话只能看汇编代码