惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
A
About on SuperTechFans
U
Unit 42
MyScale Blog
MyScale Blog
J
Java Code Geeks
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
D
Docker
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
量子位
月光博客
月光博客
G
Google Developers Blog
V
V2EX
博客园 - 聂微东
宝玉的分享
宝玉的分享
IT之家
IT之家
Vercel News
Vercel News

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms自定义控件(1) 基于.NET的Windows窗体编程之WinForms滑块与上下控件 基于.NET的Windows窗体编程之WinForms文件监控 基于.NET的Windows窗体编程之WinForms音频控件 基于.NET的Windows窗体编程之WinForms图像控件 基于.NET的Windows窗体编程之WinForms提示控件 基于.NET的Windows窗体编程之WinForms时间控件 基于.NET的Windows窗体编程之WinForms图表控件 基于.NET的Windows窗体编程之WinForms输入与显示 基于.NET的Windows窗体编程之WinForms菜单工具栏 基于.NET的Windows窗体编程之WinForms打印 基于.NET的Windows窗体编程之WinForms对话框 基于.NET的Windows窗体编程之WinForms列表控件 基于.NET的Windows窗体编程之WinForms数据表格 基于.NET的Windows窗体编程之WinForms事件简介 基于.NET的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 推荐一款基于.NET和百度飞桨的OCR识别组件 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一种异步线程执行过程中更新进度的方法 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器
推荐一种程序崩溃闪退或卡死的分析方法
老码识途呀 · 2025-06-12 · via 博客园 - 老码识途呀

在实际开发中,经常遇到程序崩溃闪退或者卡死的问题,在遇到这种问题的时候,往往很难捕捉异常,且日志也无法正确记录到问题发生的位置。在Windows操作系统中,dump文件就可以记录并保存程序崩溃时的快照,今天我们通过一个小例子,简述一种生成dump文件的方法,仅供学习分享使用,如有不足之处,还请指正。

闪退场景

在下面例子中,我们有一个WinForm程序,在FormMain的构造方法中,制造一个除零异常,此异常会导致程序闪退,如下所示:

namespace TestDump
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
            //抛出一个异常
            throw new DivideByZeroException();
        }
    }
}

在我们启动程序时,双击软件,然后发现程序“转了几圈,就消失了”,程序并没有启动起来。

当然,上述只是我们的一个小例子,实际工作中,我们并不会制造这么愚蠢的异常出来。

异常分类

根据异常发生和处理的机制不同,主要分为如下两类:

托管异常:托管异常是由 .NET 运行时管理的异常,它们通常在托管代码中抛出并处理。例如,在 C# 中使用 try-catch 块捕获的异常就是托管异常。这些异常通常由 .NET 的类库抛出,例如 ArgumentNullExceptionIndexOutOfRangeException 等。

非托管异常:非托管异常是由操作系统或其他非 .NET 代码(如调用本地库或使用 P/Invoke 调用 Windows API)抛出的异常。这些异常不是由 .NET 运行时直接管理的,因此需要使用特定的技术来捕获和处理。

在实际应用中,托管异常容易识别和处理;非托管异常通常需要结合使用托管和原生代码的技术来处理。

什么是dump文件?

Dump文件是一种包含了程序运行时的内存、寄存器状态、堆栈跟踪等信息的文件,通常用于调试和故障排查。当程序崩溃或发生异常时,操作系统或程序自身可能会生成一个Dump文件,以便开发者或技术支持人员能够分析程序崩溃的原因,并采取相应的修复措施。

Dump文件通常包含以下信息:

  • 程序的内存映像:即程序在崩溃时内存中的数据和代码的状态。
  • 寄存器状态:包括CPU的寄存器在崩溃时的值,这些值对于理解程序崩溃时的上下文非常关键。
  • 堆栈跟踪:记录了程序崩溃时执行的函数调用序列,有助于确定程序崩溃的具体位置。

不同的操作系统和程序可能会生成不同格式的Dump文件。例如,在Windows操作系统中,应用程序崩溃时可能会生成`.dmp`文件,而在Linux系统中,则可能会生成`core`文件。开发者或技术支持人员可以使用专门的调试工具来打开和分析这些Dump文件,以便找到并修复导致程序崩溃的问题。

生成dump文件

在 Windows 操作系统中,可以将 Windows 错误报告 (WER) 配置为在应用程序崩溃时生成转储。具体步骤如下:

在Windows左下角搜索框输入“regedit”打开注册表编辑器,如下所示:

在注册表中,依次打开“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps”,然后创建三个字段,如下所示:

  • DumpFolder:表示Dump生成的目录,此值的类型为REG_EXPAND_SZ(可扩充字符串)。
  • DumpCount:表示最多生成dump文件的数量。此值为DWORD的32位整数,默认设置为10
  • DumpType:生成的Dump文件类型:0:自定义类型,1:MiniDump,2:Full Dump。此值为DWORD的32位整数

具体如下图所示:

注册表也可以通过以下命令创建:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\mydumps" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
pause

复制上述命令,保存在一个后缀为.bat的文件中,然后双击即可。如下所示:

分析dump文件

通过上述步骤,当程序发生崩溃时,就会在指定的目录生成dump文件,如下所示:

如果就简单的.net程序闪退生成的dump文件,可以在Visual Studio 2022中打开dump文件,然后点击“运行诊断分析”,如下所示:

Visual Studio 2022会自动定位到发生闪退的异常所在位置,如下所示:

在“诊断分析”页面,点击“分析”,可以查看分析结果,然后点击结果,即可看到分析摘要中显示的具体异常信息。

当然上述分析只是针对相对简单的崩溃异常分析,如果复杂的闪退场景,则需要借助专业的调试工具,如WinDbg等,本文暂不讨论。

以上就是《推荐一种程序崩溃闪退或卡死的分析方法》的全部内容,旨在抛砖引玉,一起学习,共同进步。