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

ZRYXS 2011-08-26 02:51:57
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文件,而知道异常发生时,堆栈里面的函数名字以及其所在的程序或者动态库.
...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZRYXS 2011-08-29
  • 打赏
  • 举报
回复
原来这样啊,多谢各位的回答了。
那我就不折腾啦。。。
chenjiawei007 2011-08-27
  • 打赏
  • 举报
回复
PDB符号文件记录调试信息,出错时需要根据PDB才能转换成对应调试信息,还没听说过DUMP能脱离PDB文件。
yuohoo 2011-08-27
  • 打赏
  • 举报
回复
没有pdb的话只能看汇编代码
oyljerry 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zryxs 的回复:]
引用 1 楼 ndy_w 的回复:

那函数名字什么的从哪里来...

堆栈里面应该保存有的吧?
[/Quote]
需要结合PDB符号文件才能转换成名字,否则都是数字等,无法识别,这就是PDB文件的目的
ZRYXS 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ndy_w 的回复:]

那函数名字什么的从哪里来...
[/Quote]
堆栈里面应该保存有的吧?
ndy_w 2011-08-26
  • 打赏
  • 举报
回复
那函数名字什么的从哪里来...

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧