程序自动生成Dump文件

Windows C++程序崩溃调试:自动生成Dump文件原理与实践指南 在Windows平台C++开发中,程序崩溃是常见的调试难题。通过内存转储技术,开发者可以在程序异常终止时捕获进程状态的完整快照,这为解决偶发性崩溃提供了关键数据支持。其核心原理基于操作系统的结构化异常处理机制,通过设置顶层异常过滤器拦截未处理异常,并调用MiniDumpWriteDump API将内存、线程堆栈和寄存器信息保存为Dump文件。这项技术的工程价值在于极大提升了生产环境问题的可追溯性,使得开发者能够脱离调试环境,仅凭Dump文件即可精准定位崩溃点。在桌面应用、服务程序等部署场景中,结合符号文件分 阅读详情

 

前言:通过drwtsn32、NTSD、CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。了解了mini dump文件格式后,完全可以程序自动生成Dump文件。

本文主要讨论以下内容:

1、  运行原理

2、  程序修改

3、  注意事项

一、   运行原理

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

 

因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

二、   程序修改

1、  重载 << 操作符。(本步可以不实现)

std::ostream& operator<<(std::ostream& os, const EXCEPTION_RECORD& red)

{

return os << "   Thread ID:" << GetCurrentThreadId()

<< "   ExceptionCode: " << red.ExceptionCode << "/n"

<< "   ExceptionFlags: " << red.ExceptionFlags << "/n"

<< "   ExceptionAddress: " << red.ExceptionAddress << "/n"

<< "   NumberParameters: " << red.NumberParameters;

}

         

2、  实现UnhandledExceptionFilter

#include "minidmp.h"

LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)

{

CreateMiniDump(pExceptionInfo, L"Exception.dmp");

              std::cerr << "未知错误:" << (*pExceptionInfo->ExceptionRecord) << std::endl;

              exit(pExceptionInfo->ExceptionRecord->ExceptionCode);

             

              return EXCEPTION_EXECUTE_HANDLER;    // 程序停止运行

}

3、  在异常发生之前调用SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

通常在Main()函数开始时调用即可。

4、  CreateMiniDump()函数在minidmp.h头文件中定义,文件如下:

#pragma once

#include <windows.h>

#include <imagehlp.h>

#include <stdlib.h>

#pragma comment(lib, "dbghelp.lib")

 

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)

{

  if(pModuleName == 0)

  {

       return FALSE;

  }

 

  WCHAR szFileName[_MAX_FNAME] = L"";

  _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);

 

  if(wcsicmp(szFileName, L"ntdll") == 0)

       return TRUE;

 

  return FALSE;

}

 

inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,

                                          const PMINIDUMP_CALLBACK_INPUT   pInput,

                                          PMINIDUMP_CALLBACK_OUTPUT        pOutput)

{

  if(pInput == 0 || pOutput == 0)

       return FALSE;

 

  switch(pInput->CallbackType)

  {

  case ModuleCallback:

       if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)

            if(!IsDataSectionNeeded(pInput->Module.FullPath))

                pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

  case IncludeModuleCallback:

  case IncludeThreadCallback:

  case ThreadCallback:

  case ThreadExCallback:

       return TRUE;

  default:;

  }

 

  return FALSE;

}

 

inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)

{

  HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,

       0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

 

  if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))

  {

       MINIDUMP_EXCEPTION_INFORMATION mdei;

       mdei.ThreadId           = GetCurrentThreadId();

       mdei.ExceptionPointers  = pep;

       mdei.ClientPointers     = FALSE;

       MINIDUMP_CALLBACK_INFORMATION mci;

       mci.CallbackRoutine     = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;

       mci.CallbackParam       = 0;

       MINIDUMP_TYPE mdt       = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |

            MiniDumpWithDataSegs |

            MiniDumpWithHandleData |

            0x00000800 /*MiniDumpWithFullMemoryInfo*/ |

            0x00001000 /*MiniDumpWithThreadInfo*/ |

            MiniDumpWithUnloadedModules);

       MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

            hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);

 

       CloseHandle(hFile);

  }

}

三、   注意事项

1、  可执行文件(exe)必须找到dbghelp.dll,才能生成Dump文件。这个DLL可以从调试工具包中找到。

2、  当异常代码定位成功以后,如果无法阻止异常的产生,可以用 __try 结构包装异常代码,__try 和 try 不同,前者可以捕获非法指针产生的异常。

__try {

// 会异常的函数

}

__except( EXCEPTION_EXECUTE_HANDLER ){

// 异常处理

}

 

参考文档:

http://blog.youkuaiyun.com/ArCoolGG/archive/2007/04/05/1553027.aspx

http://www.debuginfo.com/articles/effminidumps.html


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/alicehyxx/archive/2009/07/15/4351450.aspx

别再乱删PDB文件了!手把手教你为Windows C++/Qt程序配置崩溃自动生成Dump文件 本文详细讲解了如何为Windows C++/Qt程序配置崩溃自动生成Dump文件,强调了PDB文件在调试中的关键作用。通过Visual Studio和Qt项目的配置指南,以及四种Dump生成方案的对比,帮助开发者快速定位和解决异常崩溃问题,提升程序稳定性。 阅读详情

相关推荐

C#实现生成崩溃dump文件 (附完整源码)

C#实现生成崩溃dump文件 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 693

使用C#为进程创建DUMP文件

程序异常崩溃前使用此类为进程创建DUMP文件,之后可以使用WinDbg等工具进行分析。

zunguitiancheng的专栏 1159

分子动力学后处理自编程系列(1)---角分布函数

键角分布函数作为一种重要的结构表征方法,在微观研究方法中成为确定物质结构演化规律以及拓扑结构状态的重要手段。虽然现有分子动力学后处理软件及程序包大都有键角分布函数计算的功能,但ADF的计算依旧存在一些问题,**主要表现在:**(1)操作简单的软件功能有限,不能满足需求;(2)部分软件ADF计算非常不准确;(3)能实现特点结构计算的程序包使用起来复杂,大都需要python一顿改,对新手不友好。

weixin_45896923的博客 3716

C# Dump

该函数的第一个参数是进程句柄,第二个参数是进程 ID,第三个参数是 dump 文件的路径和名称,第四个参数是 dump 文件的类型(这里使用了 MiniDumpNormal),第五个参数是异常信息(这里使用了 ex.ToString() 来将异常信息转换为字符串),第六个参数是是否压缩 dump 文件(这里使用了 false),最后一个参数是是否生成 full dump(这里使用了 false)。4、如何优化 dump 文件的大小:在某些情况下,dump 文件可能会非常大,导致存储和分析的困难。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1728

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

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

dvlinker的技术专栏 9611

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

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

dvlinker的技术专栏 5万+

程序自动生成dump文件

作用 可以再程序崩溃后保留崩溃现场,方便事后查找程序的崩溃原因。 前提是奔溃程序所对应的代码和PDB文件都是匹配的(发布程序的时候,保留源代码和PDB文件)。 代码示例 原理是使用DbgHelp的自定义未处理异常来保留崩溃现场到文件的,使用直接包含该头文件,然后再main函数的开始就调用EnableAutoDump函数。// pro_dump.h // 包含本文件是

Arbboter的专栏 4378

HWSD全球土壤数据下载、处理与提取完整指南

全球尺度的科学研究与工程项目中,土壤数据是必不可少的基础底图,而HWSD(和谐世界土壤数据库)凭借其统一的分辨率与属性标准,成为农业区划、生态模型、土地利用变化和水资源评估等领域的通用数据源。深入理解其“栅格存编号、数据库存属性”的核心原理,是高效使用这套数据的关键。通过掌握MDB数据库结构、属性字段含义以及栅格与属性表的关联方法,研究者可以将原始数据转化为可用的研究底图。无论你是需要提取特定区域的土壤属性,还是进行面积统计与点位采样,合理的处理流程都能显著提升工作效率。本文从下载注册开始,一步步梳理数据清

weixin_29056781的博客 313

C++实现Windows程序崩溃自动生成Dump文件

使用此方法可以生成dmp文件,帮助调试,需要主要的是一般发布的程序是release版本,需要开启生成pdb文件,当程序崩溃时生成dmp,需要使用当前编译程序版本的源代码进行调试。

m0_51580562的博客 1108

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3868

【机械臂算法】机械臂动力学参数辨识仿真

本文以puma560m机械臂为例子进行动力学参数辨识的讲解,puma560m可以在robotic toolbox中找到,这里以它真实机械臂对他的动力学参数进行辨识。此外这里还有要说的是,机械臂参数辨识其实是一个系统工程,其中和系统的机械、电子、嵌入式都有着很深的联系,并不是仿真这么简单的。

vrijheid的博客 7832

MFC程序自动生成dump Windbg文件

  在客户机器上如何得到应该程序的详细出错信息, 这里使用drwtsn32,在应用程序崩溃的时候自动将调用栈的信息以文件形式保存在磁盘。   生成dump有drwtsn32, NTSD,CDB等多种工具,drwtsn32 于系统自带。   在项目中使用以下几个步骤: 1. 创建minidmp.h   minidmp.h #pragmaonce#include<...

diaoquan4385的博客 432

SPI 协议帧格式深度解析:从 8 位数据到 16 位扩展的 3 种模式

本文深入解析SPI协议的帧格式,涵盖从8位标准到16位扩展的三种模式。通过详细讲解SPI时钟模式、数据宽度配置及实际应用案例,帮助开发者掌握SPI外设的深度定制能力,提升嵌入式系统开发效率。特别适用于连接传感器、存储器和显示器等高速通讯场景。

weixin_34110749的博客 345

java 生成dump文件_程序自动生成Dump文件

前言:通过drwtsn32、NTSD、CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。了解了mini dump文件格式后,完全可以程序自动生成Dump文件。本文主要讨论以下内容:1、运行原理2、程序修改3、注意事项一、运行原理当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发...

weixin_36444881的博客 2275

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

学Simulink——基于直流电机的建模与控制场景实例:他励直流电机的起动与制动过程仿真

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

xiaoheshang_123的博客 227

Windows C++程序崩溃时自动生成 dump文件

Windows生成dump文件 // dumpcreate.h 文件 // dumpcreate.h #if defined (_WIN32) || defined (WIN32) #include <Windows.h> long __stdcall exceptionHander(_EXCEPTION_POINTERS* excp); // 全局异常处理捕获 #endif // dumpcreate.cpp 文件 // dumpcreate.cpp #if defined

Echo的博客 2021

Qt视频播放器项目(打开文件,视频的播放与停止,进度条与视频进度绑定,调整音量,设置按钮图标,将槽函数与按钮绑定等功能)完整代码地址在末尾

【代码】Qt视频播放器项目。

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 755
上一篇: LINK 错误
下一篇: VS2005中SetUnhandledExceptionFilter函数应用
happy hell
博客等级 码龄23年 136粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值