使用dbghelp生成dump文件以及事后调试分析
前言
在产品的实际应用环境中,如果我们的程序在客户那里出现了问题,例如程序异常了,而这个时候的现象又不能还原或者很难还原重现,那么只有使用dump文件来保存程序的当前运行信息,例如调用堆栈等,同时使用符号文件来定位问题了;这里主要讲解使用dbghelp库来生成输出dump文件,同时使用符号文件和windbg来分析问题。
样例代码
1 #include "stdafx.h" 2 #include <Windows.h> 3 #include <iostream> 4 #include "dbghelp.h" 5 using namespace std; 6 LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo) 7 { 8 cout << "Enter TopLevelExceptionFilter Function" << endl; 9 HANDLE hFile = CreateFile( _T("project.dmp"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 10 MINIDUMP_EXCEPTION_INFORMATION stExceptionParam; 11 stExceptionParam.ThreadId = GetCurrentThreadId(); 12 stExceptionParam.ExceptionPointers = pExceptionInfo; 13 stExceptionParam.ClientPointers = FALSE; 14 MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpWithFullMemory,&stExceptionParam,NULL,NULL); 15 CloseHandle(hFile); 16 getchar(); 17 return EXCEPTION_EXECUTE_HANDLER; 18 } 19 20 int _tmain(int argc, _TCHAR* argv[]) 21 { 22 cout<<"Enter Main Function"<<endl; 23 SetUnhandledExceptionFilter(TopLevelExceptionFilter); 24 int *pValue = NULL; 25 cout<<"Invalid Access"<<endl; 26 *pValue = 0; 27 cout<<"Finish Main Function"<<endl; 28 getchar(); 29 30 return 0; 31 }
该段代码很简单,有几个API函数大家查查msdn即可;我就不再讲解了.
工程设置
由于使用了dbghelp库,因此我们需要配置库依赖以及头文件包含信息;设置头文件包含如下图所示:
设置库文件依赖如下图所示:
设置好之后,即可成功编译该工程代码,同时将dbghelp.dll文件放入可执行文件目录下;最后结果如下图所示:
由于我默认设置了生成符号文件,即DumpProject.pdb文件;关于符号文件的生成,如下图设置所示:
运行程序
双击DumpProject.exe文件,根据代码逻辑,由于程序有异常,因此会生成dump文件,运行结果如下图所示:
同时生成了project.dmp文件,如下图所示:
分析问题
得到了dmp文件,符号文件,同时又有对应的源码,这时使用WinDbg工具来解决问题,找出异常出在哪里。
打开WinDbg工具,设置好符号文件位置目录,源码文件位置目录,然后打开project.dmp文件,显示如下所示:
在WinDbg命令行中输入如下!analyze -v命令,从而可以分析出异常出现的具体位置,如下图所示:
结束
方便快捷的定位分析问题,提高效率;
http://www.cnblogs.com/appsucc/p/3458906.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2015-10-05 protocol buffer和当年corba ,和现在SOA有啥异同点
2015-10-05 热爱工作 发财机会大增(这里不是选择软件还是硬件的问题,是自己的性格和追求的问题)——当你的老板不如你懂行的时候,还赚的盆满钵满的时候,你就可以考虑独立了 good
2015-10-05 Delphi读取文件属性
2014-10-05 点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)