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

推荐订阅源

C
Check Point Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
The Exploit Database - CXSecurity.com
I
Intezer
P
Privacy & Cybersecurity Law Blog
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
K
Kaspersky official blog
AWS News Blog
AWS News Blog
Schneier on Security
Schneier on Security
雷峰网
雷峰网
www.infosecurity-magazine.com
www.infosecurity-magazine.com
宝玉的分享
宝玉的分享
G
Google Developers Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Forbes - Security
Forbes - Security
T
The Blog of Author Tim Ferriss
S
Security @ Cisco Blogs
NISL@THU
NISL@THU
N
News and Events Feed by Topic
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
Blog — PlanetScale
Blog — PlanetScale
Help Net Security
Help Net Security
F
Full Disclosure
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
D
Docker
T
Tailwind CSS Blog
L
LangChain Blog
The Last Watchdog
The Last Watchdog
美团技术团队
博客园 - Franky
H
Hacker News: Front Page
Stack Overflow Blog
Stack Overflow Blog
W
WeLiveSecurity
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recorded Future
Recorded Future
V
Visual Studio Blog
N
Netflix TechBlog - Medium
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
S
Schneier on Security
Know Your Adversary
Know Your Adversary

博客园 - 老码识途呀

基于.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的分库分表利器 推荐一款Excel读写神器之MiniExcel入门详解 推荐一款Ioc容器之Ninject入门详解 ASP.NET Core WebApi+React UI开发入门详解
推荐一种程序崩溃闪退或卡死的分析方法
老码识途呀 · 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等,本文暂不讨论。

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