使用dbghelp生成dump文件以及事后调试分析
2016-09-27 19:19
344 查看
原文地址:http://www.cnblogs.com/appsucc/p/3458906.html
前言
在产品的实际应用环境中,如果我们的程序在客户那里出现了问题,例如程序异常了,而这个时候的现象又不能还原或者很难还原重现,那么只有使用dump文件来保存程序的当前运行信息,例如调用堆栈等,同时使用符号文件来定位问题了;这里主要讲解使用dbghelp库来生成输出dump文件,同时使用符号文件和windbg来分析问题。
这个dbghelp.dll是系统库,一般不用放到产品目录中。但是阿里钉钉,爱奇艺PPS都在安装目录下带上了这个库,可能是要用最新版本的dbghelp.dll库,也可能防止系统中的库被删除掉,导致无法导出dump文件。
样例代码
工程设置
由于使用了dbghelp库,因此我们需要配置库依赖以及头文件包含信息,设置头文件包含如下图所示:
设置库文件依赖如下图所示:
设置好之后,即可成功编译该工程代码,同时将dbghelp.dll文件放入可执行文件目录下,最后结果如下图所示:
由于我默认设置了生成符号文件,即DumpProject.pdb文件,关于符号文件的生成,如下图设置所示:
运行程序
双击DumpProject.exe文件,根据代码逻辑,由于程序有异常,因此会生成dump文件,运行结果如下图所示:
同时生成了project.dmp文件,如下图所示:
分析问题
得到了dmp文件,符号文件,同时又有对应的源码,这时使用WinDbg工具来解决问题,找出异常出在哪里。
打开WinDbg工具,设置好符号文件位置目录,源码文件位置目录,然后打开project.dmp文件,显示如下所示:
在WinDbg命令行中输入如下!analyze -v命令,从而可以分析出异常出现的具体位置,如下图所示:
结束
方便快捷的定位分析问题,提高效率。
参考:http://www.cnblogs.com/lzjsky/archive/2010/12/01/1893660.html
微软关于dbghelp.dll的详细说明,参见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms679309(v=vs.85).aspx
前言
在产品的实际应用环境中,如果我们的程序在客户那里出现了问题,例如程序异常了,而这个时候的现象又不能还原或者很难还原重现,那么只有使用dump文件来保存程序的当前运行信息,例如调用堆栈等,同时使用符号文件来定位问题了;这里主要讲解使用dbghelp库来生成输出dump文件,同时使用符号文件和windbg来分析问题。
这个dbghelp.dll是系统库,一般不用放到产品目录中。但是阿里钉钉,爱奇艺PPS都在安装目录下带上了这个库,可能是要用最新版本的dbghelp.dll库,也可能防止系统中的库被删除掉,导致无法导出dump文件。
样例代码
#include "stdafx.h" #include <Windows.h> #include <iostream> #include "dbghelp.h" using namespace std; LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo) { cout << "Enter TopLevelExceptionFilter Function" << endl; HANDLE hFile = CreateFile( _T("project.dmp"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); MINIDUMP_EXCEPTION_INFORMATION stExceptionParam; stExceptionParam.ThreadId = GetCurrentThreadId(); stExceptionParam.ExceptionPointers = pExceptionInfo; stExceptionParam.ClientPointers = FALSE; MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpWithFullMemory,&stExceptionParam,NULL,NULL); CloseHandle(hFile); getchar(); return EXCEPTION_EXECUTE_HANDLER; } int _tmain(int argc, _TCHAR* argv[]) { cout<<"Enter Main Function"<<endl; SetUnhandledExceptionFilter(TopLevelExceptionFilter); int *pValue = NULL; cout<<"Invalid Access"<<endl; *pValue = 0; cout<<"Finish Main Function"<<endl; getchar(); return 0; }该段代码很简单,有几个API函数大家查查msdn即可,我就不再讲解了。
工程设置
由于使用了dbghelp库,因此我们需要配置库依赖以及头文件包含信息,设置头文件包含如下图所示:
设置库文件依赖如下图所示:
设置好之后,即可成功编译该工程代码,同时将dbghelp.dll文件放入可执行文件目录下,最后结果如下图所示:
由于我默认设置了生成符号文件,即DumpProject.pdb文件,关于符号文件的生成,如下图设置所示:
运行程序
双击DumpProject.exe文件,根据代码逻辑,由于程序有异常,因此会生成dump文件,运行结果如下图所示:
同时生成了project.dmp文件,如下图所示:
分析问题
得到了dmp文件,符号文件,同时又有对应的源码,这时使用WinDbg工具来解决问题,找出异常出在哪里。
打开WinDbg工具,设置好符号文件位置目录,源码文件位置目录,然后打开project.dmp文件,显示如下所示:
在WinDbg命令行中输入如下!analyze -v命令,从而可以分析出异常出现的具体位置,如下图所示:
结束
方便快捷的定位分析问题,提高效率。
参考:http://www.cnblogs.com/lzjsky/archive/2010/12/01/1893660.html
微软关于dbghelp.dll的详细说明,参见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms679309(v=vs.85).aspx
相关文章推荐
- 使用dbghelp生成dump文件以及事后调试分析
- 使用dbghelp生成dump文件以及事后调试分析
- 使用dbghelp生成dump文件以及事后调试分析
- 使用dbghelp生成dump文件以及事后调试分析
- 使用dbghelp生成dump文件以及事后调试分析
- 使用dbghelp生成dump文件以及事后调试分析
- 使用jdk自带工具生成heapdump文件以及分析内存中的变量情况
- Nmon工具的使用以及通过nmon_analyse生成分析报表
- Nmon工具的使用以及通过nmon_analyse生成分析报表
- Nmon工具的使用以及通过nmon_analyse生成分析报表
- 生成程序崩溃的dump文件,使用windbg调试
- 使用WinDBG生成和调试dump文件
- Nmon工具的使用以及通过nmon_analyse生成分析报表
- HC-05蓝牙模块调试笔记以及使用正点原子例程无法检测到蓝牙模块原因分析
- 生成程序崩溃的dump文件,使用windbg调试
- linux下性能监控工具Nmon的使用以及通过nmon_analyse生成分析报表
- Nmon工具的使用以及通过nmon_analyse生成分析报表
- 使用WinDBG生成dump文件 WinDBG分析dump文件
- 使用jxl工具包生成Excel以及读取Excel的方法
- gdb调试要点以及arm-linux交叉工具的使用