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

Windows C++程序崩溃调试:自动生成Dump文件原理与实践指南 在Windows平台C++开发中,程序崩溃是常见的调试难题。通过内存转储技术,开发者可以在程序异常终止时捕获进程状态的完整快照,这为解决偶发性崩溃提供了关键数据支持。其核心原理基于操作系统的结构化异常处理机制,通过设置顶层异常过滤器拦截未处理异常,并调用MiniDumpWriteDump API将内存、线程堆栈和寄存器信息保存为Dump文件。这项技术的工程价值在于极大提升了生产环境问题的可追溯性,使得开发者能够脱离调试环境,仅凭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 (_WIN32) || defined (WIN32)
#include <time.h>
#include <Windows.h>
#include <dbghelp.h>
#include <tchar.h>
#pragma comment(lib, "dbghelp.lib")
#endif

#include "dumpcreate.h"

#define USER_DATA_BUFFER_SIZE (4096)

/*
 *ExceptionCode 最可能遇到的几种类型
 *C0000005h读写内存冲突
 *C0000094h非法除0
 *C00000FDh堆栈溢出或者说越界
 *80000001h由Virtual Alloc建立起来的属性页冲突
 *C0000025h不可持续异常,程序无法恢复执行,异常处理例程不应处理这个异常
 *C0000026h在异常处理过程中系统使用的代码,如果系统从某个例程莫名奇妙的返回,则出现此代码,例如调用RtlUnwind时没有ExceptionRecord参数时产生的异常填入的就是这个代码
 *80000003h调试时因代码中int3中断
 *80000004h处于被单步调试状态
 *
 *返回值:
 *
 *EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以结束了
 *EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
 *EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行
*/

long /*__stdcall*/ exceptionHander(_EXCEPTION_POINTERS* excp)
{
    TCHAR m_szDumpPath[_MAX_PATH];
    TCHAR m_szAppPath[_MAX_PATH];
    TCHAR m_szAppBaseName[_MAX_PATH];
    time_t m_lTime;

    time(&m_lTime);

    LONG retval = EXCEPTION_CONTINUE_SEARCH;

    HMODULE hDll = NULL;
    //TCHAR szDbgHelpPath[_MAX_PATH];

    if (GetModuleFileName(NULL, m_szAppPath, _MAX_PATH))
    {
        TCHAR *pSlash = _tcsrchr(m_szAppPath, '\\');

        if (pSlash)
        {
            _tcsncpy_s(m_szAppBaseName, _MAX_PATH, pSlash + 1, _MAX_PATH);
            *(pSlash + 1) = 0;
            // SetDumpFileName
            wsprintf(m_szDumpPath, _T("%s%s.%ld.dmp"), m_szAppPath, m_szAppBaseName, m_lTime);
        }
    }

    TCHAR szScratch[USER_DATA_BUFFER_SIZE];

    // ask the user if they want to save a dump file
    wsprintf(szScratch, _T("There was an unexpected error:\n\n%s\nWould you like to save a diagnostic file?\n\nFilename: %s"), "", m_szDumpPath);
    if (::MessageBox(NULL, szScratch, NULL, MB_YESNO) != IDYES)
        return EXCEPTION_EXECUTE_HANDLER;

    //创建转储文件
    HANDLE hFile = CreateFile(m_szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
        CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

    LPCTSTR szResult = NULL;

    if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION exptInfo;
        exptInfo.ThreadId = ::GetCurrentThreadId();
        exptInfo.ExceptionPointers = excp;
        exptInfo.ClientPointers = NULL;

        //将dump信息写入到文件中
        BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(),
            GetCurrentProcessId(),
            hFile, MiniDumpNormal,
            &exptInfo, NULL, NULL);
        if (bOK)
        {
            szResult = NULL;
            retval = EXCEPTION_EXECUTE_HANDLER;
        }
        else
        {
            wsprintf(szScratch, _T("Failed to save dump file to '%s' (error %d)"), m_szDumpPath, GetLastError());
            szResult = szScratch;
        }
        ::CloseHandle(hFile);
    }
    else
    {
        wsprintf(szScratch, _T("Failed to create dump file '%s' (error %d)"), m_szDumpPath, GetLastError());
        szResult = szScratch;
    }
    if (szResult)
        ::MessageBox(NULL, szResult, NULL, MB_OK);

    TerminateProcess(GetCurrentProcess(), 0);

    return EXCEPTION_CONTINUE_SEARCH;
}

在main.cpp中设置异常句柄,如下:
// main.cpp 文件

// main.cpp 文件
#include "dumpcreate.h"

int main(int argc, char *argv[])
{
#if defined (_WIN32) || defined (WIN32)
    SetUnhandledExceptionFilter(exceptionHander);
#endif

    // 测试生成 dump 文件
    char *str = NULL;
    strcpy(str, "test");

    return 0;
}

程序运行结果:

在发生运行错误时,会弹出是否要生成dump文件的对话框,选择是(Y)时,即开始生成dump文件,选择否(N)即不生成。
question

若不想有确认生成的弹窗,屏蔽dumpcreate.cpp中的两处MessageBox(...)方法调用即可

生成的文件默认在工作目录下,如下图。

result

C++程序崩溃时,使用Windbg静态分析dump文件 阅读详情

相关推荐

windows程序崩溃调试终极武器

windows程序崩溃调试终极武器---dump文件一、前言前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑...

编程与实战的博客 2274

记录程序崩溃时的调用堆栈

在程序release之后,不可避免的会存在一些bug,测试人员和最终用户如何在发现bug之后指导开发人员进行更正呢?在MS的网站上,有一篇名为"Under the hook"的文章,讲述了如何把程序崩溃时的函数调用情况记录为日志的方法,对此感兴趣的读者可以去看一看原文,那里提供源代码和原理的说明。 文章的作者提供了一个MSJExceptionHandler类来实现这一功能,这个类的使用方法很

qing666888的专栏 6311

【C++软件调试技术】dump文件类型与dump文件生成方法详解

dump文件类型与dump文件生成方法详解。

dvlinker的技术专栏 2万+

C++开发的应用程序崩溃时生成Dump文件分析(附Demo)

  Dump 文件是进程的内存镜像 , 可以把程序的执行状态通过调试器保存到dump文件中 ; Dump 文件是用来给驱动程序编写人员调试驱动程序用的 , 这种文件必须用专用工具软件打开 , 比如使用 WinDbg , VisualStudio打开;   当我们的程序发布出去之后 , 在客户机上是无法跟踪自己代码的 BUG 的 , 所以 Dump 文件对于我们来说特别有用 ; 我们可以通过 .dmp 文件把出现 BUG 的情况再现 , 然后再现客户环境 (包括堆栈调用等情况) , 设置源码调试路径 , 可以

jw2016的博客 4753

C++实现自动生成Dump文件的小型调试工具

Dump文件不是万能药,但它是最接近真相的证据。从SEH的底层机制,到的精细控制,再到WinDbg的强大分析能力,这一整套技术栈构成了现代C++工程的质量护城河。真正高级的工程师,不怕崩溃,只怕崩溃后一片空白。💪而你现在,已经掌握了让程序“死得明明白白”的全套技能。下次当你的服务凌晨报警,你可以淡定地说一句:“别慌,先看Dump。然后,泡杯咖啡☕,慢慢破案。🎯一句话总结异常不可避免,但失控可以杜绝。用好Dump机制,把每一次崩溃变成一次成长的机会。

weixin_34511754的博客 1046

window COREdump文件生成 c++代码

在window程序中,添加代码一边在程序崩溃时候产生coredump,能准确定位崩溃地点。

Windows C++程序运行过程中生成dump文件

开发Windows C++程序跟踪异常是比较重要的功能,一般情况都需要进行全局异常捕获,并且生成dump文件。而且C++没有运行时直接获取堆栈信息的方法,返回错误或者异常处理时无法记录到堆栈信息,如果这个时候能够生成dump,对于bug分析是非常有利的。

codeofcc的博客 3926

F280049C_HRPWM_死区时间高精度控制与MEP技术实战解析

本文深入解析了F280049C的HRPWM模块及其基于MEP技术的死区时间高精度控制。通过实测数据与TI官方代码对比,详细阐述了DBREDHR和DBFEDHR寄存器的配置技巧、精度优化方法及常见问题调试,为电源管理和电机控制应用提供了实用的实战指南。

yolo5detector的博客 217

致命错误:异常代码=C0000005(这篇最详细,收藏之~)

,输入“联通”,然后保存后关闭该文本,再重新开打,看到什么了?     是的,当年WIN2000操作系统的流行时,Visual Foxpro开发组并没有彻底改正语义分析器代码的漏洞。     好的,第一大类我就阐述完了。如何避免它呢?     总的应该说很麻烦,有两种途径供您选择:1、修改VCX、SCX表国际代码页的编码,将简体中文编码改为英文编码;     2、我所推荐的方法

zhaogn 的技术博客 16万+

Altium Concord Pro 的应用范围,安装,和使用范围

Altium Concord Pro 的应用范围,安装,和使用范围。保证满足两者软件的最低安装要求。 Altium Concord Pro 是配合Digapcb,和MCAD,Altium 和相应机械设计软件的基础和交换桥梁

hanzhaos的博客 1121

FPGA实现Gardner环定时同步:Verilog代码与Testbench实战解析

本文深入解析了在FPGA上实现Gardner环定时同步的完整过程,详细阐述了其非数据辅助的定时误差检测原理。通过Verilog代码实战,展示了内插滤波器、定时误差检测器、环路滤波器和数控振荡器等核心模块的设计,并提供了完整的Testbench验证方法,帮助开发者解决数字通信系统中的时钟同步难题。

gpt4scribbler的博客 576

死亡搁浅 服务器不稳定,[收集]死亡搁浅现有bug临时解决方案

该楼层疑似违规已被系统折叠隐藏此楼查看此楼Build : dso 100/1892587 21:23 - Fri Jul 10 2020An Access Violation (C0000005h) has occurred in thread 'SystemFileDevice:1' at instruction location 00000001416D4B37hCallStack : 40...

weixin_34246529的博客 2915

Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+)

本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。

weixin_29214559的博客 171

WindowCOREdump文件生成C++代码:为开发者提供精准崩溃定位

WindowCOREdump文件生成C++代码:为开发者提供精准崩溃定位 去发现同类优质开源项目:https://gitcode.com/ 在软件开发过程中,定位程序崩溃的原因是一项极具挑战性的任务。今天,我们为您推荐一个开源项目——WindowCOREdump文件生成C++代码,它能够帮助开发者快速生成核心转储文件(core dump),从而有效定位程序崩溃点。 项目介绍 WindowCOREd...

gitblog_06723的博客 600

【软碟通 | UltraISO】刻录光盘教程(制作U盘启动盘)

前言 今天老师说办公室的电脑有点卡,让我给重新安装一个 Windows 7 系统。于是就用软碟通(UltraISO)在 U 盘上刻录了一个 Windows 7 镜像,然后给老师重装了系统。顺便把制作 U 盘启动盘的教程也分享给大家。 软件 UltraISO v9.7.1.3519:点击跳转(密码:dd2k) 教程 将 U 盘插到电脑上,然后鼠标右击选择格式化(制作启动盘必须格式化) 点击文件-打开 选择下载好的系统镜像(如:Windows 7) 点击启动-写入硬盘映像 选择硬盘

XavierJ的博客 2万+

Zemax单模光纤耦合仿真避坑指南:数值孔径、模式匹配与镀膜影响详解

本文详细解析了Zemax单模光纤耦合仿真中的关键避坑要点,包括数值孔径的多重定义与换算、模式匹配度评估及镀膜影响分析。通过实际案例和技术公式,帮助工程师避免常见仿真误差,提升激光通信和光纤传感系统的设计精度。特别针对OpticStudio用户提供了实用的参数设置建议和优化策略。

weixin_30836759的博客 465

Windows上位机软件生成dump文件

摘要:本文介绍了Windows上位机开发中生成dump文件的重要性与方法。dump文件作为程序崩溃时的黑匣子;,能记录内存、线程栈等关键信息,适用于客户环境崩溃、偶发Bug等场景。文章对比了MiniDump(小型转储)和FullDump(完整转储)的适用场景,并提供了三种生成方式;最后给出了完整的C++实现代码,包含异常过滤、目录创建和自定义dump文件命名等功能,特别适合正式发布的软件集成。

fdfddfdfsd的博客 223

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

VS2010 调试 dump 文件产生

如何利用dump文件分析程序崩溃

xiabin1002的专栏 875

[xboard-ok210] 44 s5pv210开发板介绍和对比

文章目录前言四大S3C6410提供商友坚开发板UT-S5PV210华天正(润尔)real210飞凌开发板ok210九鼎x210友善之臂开发板tiny210mini210smart210天嵌开发板tq210sate210xboardxboardxboard之ok210 前言 四大S3C6410提供商 友坚开发板 UT-S5PV210 华天正(润尔) real210 飞凌开发板 ok210 九鼎 x210 友善之臂开发板 tiny210 mini210 smart210 天嵌开发板 tq210 sate210

鹰之翔 286

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

win10+vs2008 + qt486 + qtaddin1.1.11 实现崩溃时记录dump文件并用windbg定位异常点

本文记录了在Windows 10环境下使用VS2008和Qt4.8.6实现程序崩溃时生成dump文件并定位异常的完整流程。关键步骤包括:1)通过SetUnhandledExceptionFilter注册异常处理回调;2)使用MiniDumpWriteDump生成包含完整内存信息的dump文件;3)在Qt按钮点击事件中模拟空指针异常触发崩溃;4)配置编译器生成调试信息;5)使用WinDbg分析dump文件,通过!analyze -v命令准确定位到源码中的崩溃位置

daxuege1988的博客 231

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

关于Windows程序崩溃(Crash)以及生成dump文件的探究

文章目录关于Windows程序崩溃(Crash)以及生成dump文件的探究什么是崩溃(Crash),崩溃(Crash)的现象崩溃(Crash)的原因是什么如何消除崩溃时出现的异常信息对话框如何捕获崩溃(Crash)时的异常,生成dump文件来帮助寻找异常总结 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 什么是崩溃? 崩溃是...

不定期更新的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

m0_51580562的博客 1108

Windows下用crashRpt让C++程序崩溃自动生成dump

windows c++程序崩溃自动收集dump,用于复现BUG

凝视阳光呦 3170

windows c++程序在崩溃时自动生成dump

作者:刘树伟 // MSDN建议不要使用崩溃的那个进程创建dump,因为程序已经崩溃,再创建dump,可能失败。而是建议使用一个监控进程来创建。MINIDUMP_EXCEPTION_INFORMATION.ClientPointers必须根据是自己还是监控进程创建dump进行正确的设置, 参考:https://www.it1352.com/457981.html MiniDumpWriteDump在进行写dump文件的时候,首先挂起其它所有线程,然后再写dump。如果另一个线程中正在进行堆分配/释放/

psbeyond的专栏 1460

跨平台 C++ 程序崩溃调试与 Dump 文件分析

本篇博客将介绍如何在代码中自动生成Dump文件,并详细解析Dump相关参数,帮助开发者快速定位Bug。

Darker的博客 2450
上一篇: mysql数据库ibdata1和mysql-bin文件过大导致致磁盘空间不足问题处理
下一篇: C++ 文件操作返回值错误码列表及解析
EchoCoder
博客等级 码龄16年 25粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值