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命令,从而可以分析出异常出现的具体位置,如下图所示:



    结束

    方便快捷的定位分析问题,提高效率;

  • 相关阅读:
    Python爬虫入门之Urllib库的高级用法
    Python爬虫入门之Urllib库的基本使用
    Python中对字符串的操作
    Python2.x爬虫入门之URLError异常处理
    Python编写的记事本小程序
    Python2.X和Python3.X中Tkinter模块的文件对话框、下拉列表的不同
    记录面试龙腾简合-java开发工程师经历
    解决npm ERR! Please try running this command again as root/Administrator. 问题
    ionic3/4 使用NavController 返回两层的方式
    点击iframe窗口里的超链接,打开新页面的方式
  • 原文地址:https://www.cnblogs.com/appsucc/p/3458906.html
Copyright © 2011-2022 走看看