生成程序崩溃的dump文件,使用windbg调试

使用WinDbg分析Windows dump文件方法 analyze -v"链接,或者在下面的命令窗口中输入“!analyze -v”命令,工具就对dump文件进行分析,然后输出导致系统崩溃的起因等相关信息。在安装Windows SDK的过程中,可以选择只安装WinDbg(Debugging Tools for Windows)这个组件。工具来分析windows系统产生的dump文件,此工具属于Windows SDK的一个组件,在微软官方网站可以下载(1)打开WinDbg工具,通过菜单“File”->“Open Crash Dump”打开dmp文件。 阅读详情

1,目的


有时候程序在客户那里崩溃了,你程序也没有什么有效的log日志能记录到崩溃的细节,那这实在是一件很麻烦的事情。

你得向客户反复了解操作内容并希望能在自己这里重现,这个过程想想都很痛苦吧。。

使用下面的方法,能在程序崩溃时生成一个自己的dump文件,记录了崩溃时的一些有用的信息,一般能帮你容易地找到出错的地方。


2,原理


简单地说,就是windows程序崩溃时会调一个对话框显示一些没什么用的信息。

XP下:

WIN7中:

①设置崩溃时的回调函数。

有一个方法可以让我们设置程序崩溃时先执行的回调函数,这里面可以弹我们自己的对话框,比如让用户输入一些有用的内容然后发送给我们。

这个函数是SetUnhandledExceptionFilter . 

原型:

    WINBASEAPI  
    LPTOP_LEVEL_EXCEPTION_FILTER  
    WINAPI  
    SetUnhandledExceptionFilter(  
        __in_opt LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter  
        );  

它的参数是你要设置的回调函数:PTOP_LEVEL_EXCEPTION_FILTER
typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(  
    __in struct _EXCEPTION_POINTERS *ExceptionInfo  
    );  
typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; 



系统调起你的回调函数时,会给你传一个代表异常信息的结构:EXCEPTION_POINTERS

    typedef struct _EXCEPTION_POINTERS {  
        PEXCEPTION_RECORD ExceptionRecord;  
        PCONTEXT ContextRecord;  
    } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;  


我们现在要做的就是在回调函数里根据这个系统给我们的信息,记录到一个dump文件中去。供我们使用windbg分析。

通过SetUnhandledExceptionFilter 函数的返回值我们可以选择在回调结束后不再弹原来默认的对话框而直接结束程序、或者再弹那个默认的再结束程序、不弹对话框继续执行。

如下:

    #define EXCEPTION_EXECUTE_HANDLER       1           //在回调结束后不再弹原来默认的对话框而直接结束程序  
    #define EXCEPTION_CONTINUE_SEARCH       0       //再弹那个默认的再结束程序  
    #define EXCEPTION_CONTINUE_EXECUTION    -1      //继续执行  




②在回调函数中输出崩溃信息到dump文件。


往dump文件写内容用到一个API:MiniDumpWriteDump。

在DbgHelp.h头文件中,且需包含 DbgHelp.lib库。

    #include <DbgHelp.h>  
    #pragma comment(lib, "dbghelp.lib")  


函数形式:

    BOOL  
    WINAPI  
    MiniDumpWriteDump(  
        __in HANDLE hProcess,  
        __in DWORD ProcessId,  
        __in HANDLE hFile,  
        __in MINIDUMP_TYPE DumpType,  
        __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,  
        __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,  
        __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam  
        );  

说明:

hProcess  ——进程句柄,使用GetCurrentProcess()获得即可。
ProcessID——进程ID,GetCurrentProcessId()。

hFile          ——我们创建的dump文件句柄。

DumpType——dump类型,一般填MiniDumpNormal 即可,具体内容参看DbgHelp.h和MSDN。

ExceptionParam——  1)ThreadId:GetCurrentThreadId()。

2)ExceptionPointers:即回调函数的参数。

3)ClientPointers:一般填TRUE即可。

UserStreamParam—— 一般设NULL。

CallbackParam      —— 一般设NULL。


3,演示程序代码


如果是release版,需要在工程配置中设置生成调试文件和生成映射文件。

如图:



win32控制台程序:

    #include "stdafx.h"  
    #include <windows.h>  
    #include <DbgHelp.h>  
    #pragma comment(lib, "dbghelp.lib")  
      
    //我们的回调函数  
    LONG __stdcall ExceptCallBack( EXCEPTION_POINTERS *pExcPointer)  
    {  
        MessageBox(NULL,"程序崩溃!相关信息记录在C:\\Test.dmp文件中。",NULL,MB_OK);  
      
        //创建dump文件  
        HANDLE hFile = CreateFile("C:\\Test.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);  
          
        //向文件写下当前程序崩溃相关信息  
        MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;  
        loExceptionInfo.ExceptionPointers = pExcPointer;  
        loExceptionInfo.ThreadId = GetCurrentThreadId();  
        loExceptionInfo.ClientPointers = TRUE;  
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);  
        CloseHandle(hFile);  
      
        return EXCEPTION_EXECUTE_HANDLER;  
    }  
      
    void WrongFun()  
    {  
        //crash  
        int * p = NULL;  
        *p = 1;  
    }  
      
    int _tmain(int argc, _TCHAR* argv[])  
    {  
        //设置崩溃回调函数  
        SetUnhandledExceptionFilter(ExceptCallBack);  
      
        WrongFun();  
      
        return 0;  
    }  


4,效果。

crash后先弹出一个对话框:


之后不再调windows自带的崩溃对话框了。程序结束。


5,使用windbg查看dmp文件


用windbg 菜单 File->Open Crash File 打开这个Test.dmp文件,在下方编辑框输入 “!analyze -v” 命令执行自动分析。

稍等一会,就会出现一些内容,大致找到如下:

就能看到程序崩溃的一些细节甚至代码。


原文地址:http://blog.youkuaiyun.com/dpsying/article/details/21453679
使用Windbg分析dump文件定位软件异常的方法! 1、前言 Windbg是微软开发的在Windows平台下强大的用户态和内核态调试工具,是Windows系统排查软件异常的一大利器,使用Windbg能极大的提高我们排查问题的效率,Windbg可以快速分析出软件崩溃、死循环、死锁等多种异常。 很多时候,如果仅仅通过排查代码或者添加打印去排查软件的异常崩溃,效率会很低,特别是代码量比较大的大项目,查起来会更加费劲。并且有些软件异常不是必现的或很难复现的,更不利于问题的排查。我们可以在工程代码中引入谷歌的CrashReport库,给软件安装异常捕获机制,当 阅读详情

相关推荐

Windbg分析dump崩溃

首先抓dump.在任务管理器->进程里面进行抓dump. 然后需要的原材料有dump、源码、pdb 打开windbg把源码路径和pdb路径添加进去。 需要打开的窗口包括线程窗口(Processes and Threads)、Calls窗口、Command窗口。 把dump拖进去,如果Dump文件是64位的,在分析时,需要根据被转储文件的位数来判断是否转为32位的,转换的命令如下: ....

Scarlett_OHara的博客 3116

程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验

1,程序异常崩溃后用windbg辅助调试解决的经验 状况:我的程序调用别人的库做 文件写入工作。 在这一过程中出现异常,程序崩溃。 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错。 使用windbg绑定程序进程进行调试,可以在发生异常时候,获取函数调用顺序,进而知道在哪个函数出了异常。 由截图可见,在我的程序...

weixin_30338481的博客 543

使用Windbg分析dump文件定位软件异常的方法与操作步骤

WinDbg 是一个强大的工具,可以帮助开发人员分析和调试 Windows 应用程序的崩溃问题。通过上述步骤,加载 dump 文件并结合符号文件,可以帮助你定位和分析异常。如果分析过程中遇到复杂的问题,可以参考 WinDbg 的官方文档,进一步学习更多的调试技巧。

s13596191285的博客 566

程序运行时崩溃生成崩溃文件(Windows & Linux)

记:在实际开发过程中,程序可以通过IDE来排查崩溃问题,但是当程序部署到没有开发环境的电脑上时,为方便调试和排查问题,势必要通过崩溃文件来记录崩溃瞬间的信息,这样就可以通过查找堆栈信息来排查问题。

等风来的博客 1896

使用Windbg分析dump文件的一般步骤及要点详解

通过一个问题实例详细讲解使用Windbg静态分析dump文件的完整过程。

dvlinker的技术专栏 4万+

何时使用Windbg静态分析?何时使用Windbg动态调试?

使用Windbg静态分析dump文件是分析软件异常最常用方法,在某些场景下则需要使用Windbg动态调试目标进程去排查。本文详细讲述何时使用Windbg静态分析dump文件,何时使用Windbg去动态调试目标进程。

dvlinker的技术专栏 4万+

Windows上使用dump文件调试

dump文件记录当前程序运行某一时刻的信息,包括内存,线程,线程栈,变量等等,相当于调试程序时运行到某个断点上,把程序运行的信息记录下来。可以通过Windbg打开dump,查看程序运行的变量等,来调试程序。

Wlk1229 4644

使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查程序崩溃问题

当程序中安装的异常捕获模块捕获不到异常、没有生成dump文件时,可以尝试到系统应用程序日志中去找系统自动生成的dump文件,以排查当前的软件崩溃问题。本文以一个项目问题实例去详细讲述如何从系统应用程序日志中找到的系统自动生成的dump文件,然后使用Windbg打开dump文件进行静态分析去排查异常崩溃问题。

dvlinker的技术专栏 5万+

Windows下dump文件生成与分析

一、生成Dump文件方式 1.1任务管理器生成 (1)在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只适用于程序崩溃但没有立即自行退出的情况。 (2)自动生成dump,倘若程序故障后自行退出,则此方法就难以应用。不过,我们可以在注册表中添加如下信息已确保系统在程序崩溃后自行保存一个dump文件: 运行regedit.exe,在注册表中找到 HKEY_LOCAL_M...

luoyaxing0812的专栏 2177

如何让C++程序自动生成dump文件?如何使用Windbg分析dump文件?

本文讲述如何让C++程序自动生成dump文件,以及如何使用Windbg分析dump文件。

dvlinker的技术专栏 9611

Windows程序崩溃后通过代码产生完整dump

当windows程序崩溃,通过此此代码可以产生完整的dump文件,并可控制产生文件数量

Windows下的Dump文件

一、    生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只使用与程序崩溃但没有立即自行退出的情况。倘若程序故障或自行退出,则此方法就难以应用。不过,我们可以在注册表中添加如下信息已确保系统在程序崩溃后自行保存一个dump文件

xiaoluo91的专栏 1万+

用友U8库龄分析避坑指南:物料出入库日期计算的5个常见错误

本文深入剖析了在用友U8系统中进行库龄分析时,物料出入库日期计算的五个常见陷阱。从数据源选择、业务类型过滤、计价方式逻辑、期初数据处理到查询性能优化,逐一解析错误根源并提供避坑指南,帮助企业获得准确的库龄数据,有效管理库存与资金风险。

weixin_29209801的博客 454

weblogic生成dump文件_Windows程序Dump收集

前面一篇写过《Windbg调试----Windbg入门》,可能不少新手会问,我在本地用Visual Studio去做调试就行了,为什么还需要那么抽象的Windbg去进行调试呢?那是因为: 客户环境复杂多样, 发布的软件,经常会出现在本地测试无法重现的问题。我们不可能在客户的环境装一个几十G的Visual Studio,那么一般会先通过Debug Log进行初步的分析,但是碰到程序崩溃,程...

weixin_39789857的博客 1085

汽车OBD接口实战:如何用STM32读取CAN总线数据(附完整代码)

本文详细介绍了如何利用STM32微控制器通过汽车OBD接口读取CAN总线数据的完整实战方案。内容涵盖硬件连接(如OBD引脚定义与TJA1050收发器接线)、STM32的CAN外设初始化与滤波器配置,并深入解析OBD-II诊断协议,演示了如何请求和解析发动机转速、车速等关键数据。文末提供了构建稳定数据读取系统的代码框架与错误处理建议,为嵌入式开发者和汽车电子爱好者提供了从零到一的实践指南。

9q8w7e6r5的博客 297

Jacobi正交多项式在数值分析中的应用与实现

本文深入探讨了Jacobi正交多项式在数值分析中的核心应用与实现。作为最通用的正交多项式族,Jacobi多项式通过参数α和β的调节,可退化为切比雪夫、勒让德等经典多项式,为函数逼近、奇异积分和微分方程求解提供了统一框架。文章重点解析了其在加权高斯积分(高斯-雅可比积分)和谱方法求解微分方程中的关键作用,并提供了基于递归关系和SciPy的稳定高效实现方案,帮助读者掌握这一强大的数值计算工具。

weixin_29306011的博客 244

Windbg调试dump文件

用Windows自带的windbg,在调试工具,使用dump文件查找崩溃的位置

bigger_belief的博客 8092

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用)

影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。

此星光明博客 3107
上一篇: SVN Upgrade working copy
下一篇: 为WinDbg设置符号文件路径
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值