在产品的实际应用环境中,如果我们的程序在客户那里出现了问题,例如程序异常了,而这个时候的现象又不能还原或者很难还原重现,那么只有使用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. int _tmain(int argc, _TCHAR* argv[])
  20. {
  21. cout<<"Enter Main Function"<<endl;
  22. SetUnhandledExceptionFilter(TopLevelExceptionFilter);
  23. int *pValue = NULL;
  24. cout<<"Invalid Access"<<endl;
  25. *pValue = 0;
  26. cout<<"Finish Main Function"<<endl;
  27. getchar();
  28. return 0;
  29. }

工程设置

  1. 由于使用了dbghelp库,因此我们需要配置库依赖以及头文件包含信息;设置头文件包含如下图所示:<br />![](https://cdn.nlark.com/yuque/0/2018/png/200878/1543385764429-5ffc8cea-6bcd-4c0e-80a5-fcd741810f5b.png#width=749)

设置库文件依赖如下图所示:
使用dbghelp生成dump文件以及事后调试分析 - 图1
使用dbghelp生成dump文件以及事后调试分析 - 图2

设置好之后,即可成功编译该工程代码,同时将dbghelp.dll文件放入可执行文件目录下;最后结果如下图所示:
使用dbghelp生成dump文件以及事后调试分析 - 图3
由于我默认设置了生成符号文件,即DumpProject.pdb文件;关于符号文件的生成,如下图设置所示:
使用dbghelp生成dump文件以及事后调试分析 - 图4
使用dbghelp生成dump文件以及事后调试分析 - 图5

运行程序

双击DumpProject.exe文件,根据代码逻辑,由于程序有异常,因此会生成dump文件,运行结果如下图所示:
使用dbghelp生成dump文件以及事后调试分析 - 图6
同时生成了project.dmp文件,如下图所示:
使用dbghelp生成dump文件以及事后调试分析 - 图7

分析问题

  1. 得到了dmp文件,符号文件,同时又有对应的源码,这时使用WinDbg工具来解决问题,找出异常出在哪里。<br /> 打开WinDbg工具,设置好符号文件位置目录,源码文件位置目录,然后打开project.dmp文件,显示如下所示:<br />![](https://cdn.nlark.com/yuque/0/2018/png/200878/1543385963216-7da59edd-b457-473f-951e-20323c138e54.png#width=756)

在WinDbg命令行中输入如下!analyze -v命令,从而可以分析出异常出现的具体位置,如下图所示:
使用dbghelp生成dump文件以及事后调试分析 - 图8


使用dbghelp生成dump文件以及事后调试分析 - 图9