zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    HDU 2196 Computer
    HDU 1520 Anniversary party
    POJ 1217 FOUR QUARTERS
    POJ 2184 Cow Exhibition
    HDU 2639 Bone Collector II
    POJ 3181 Dollar Dayz
    POJ 1787 Charlie's Change
    POJ 2063 Investment
    HDU 1114 Piggy-Bank
    Lca hdu 2874 Connections between cities
  • 原文地址:https://www.cnblogs.com/findumars/p/4711298.html
Copyright © 2011-2022 走看看