首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于用dbghelp.dll捕获到错误时,得到堆栈调用的函数的名字的有关问题

2012-01-22 
关于用dbghelp.dll捕获到异常时,得到堆栈调用的函数的名字的问题C/C++ codeSTACKFRAME64 sfmemset(&sf, 0

关于用dbghelp.dll捕获到异常时,得到堆栈调用的函数的名字的问题

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的话只能看汇编代码

热点排行