一:背景

1. 讲故事

最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去了????????????,好了,我大概总结了下面三种方式:

  • procdump -e

  • procdump -> AEDebug

  • Windows Error Reporting

老读者应该知道,我一直都推崇 procdump 去搞定这些事情,毕竟它是一款可跨平台抓取的强大灵巧工具。

二: 实现可测试案例

从 dump 样本来看,web类的程序是最多的,所以这里我就以 Asp.NET MVC 5 作为案例,在 RouteConfig 类中我使用一个Timer不断的抛出异常,目的就是把 w3wp 进程给弄挂掉,参考代码如下:

public class RouteConfig{public static Timer timer;public static void RegisterRoutes(RouteCollection routes){timer = new Timer(new TimerCallback(m =>{var r = 10 / Convert.ToInt32("0");}), null, 60000, 5000);routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}}

对了,肯定有朋友问:为什么不在 Action 中抛异常,这是因为 Http管道 会把这种异常包装成 http 500,所以就达不到 crash 的效果了。

接下来把程序部署到 IIS 上并运行,可以清楚的看到 Windows 事件查看器 中成功的记录到了崩溃信息,如下图所示:

三: 3种抓取方式解析

1. 使用 procdump -e

这种方式简单但不太稳定,因为有几个朋友告诉我,procdump在抓取的过程中报错了,原因是进程已退出,不管怎么说这个要看你运气了哈,这里的 -eexception 的简写,具体可参见官方文档: https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump。


-e Write a dump when the process encounters an unhandled exception. Include the 1 to create dump on first chance exceptions.

完整的参考命令如下:


C:\Windows\system32>procdump -e -ma -w w3wp E:\testProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.comWaiting for process named w3wp......Press Ctrl-C to end monitoring without terminating the process.[21:12:08] Exception: 04242420
[21:12:08] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:09] Exception: E0434352.CLR
[21:12:14] Exception: C0000094.INT_DIVIDE_BY_ZERO
[21:12:14] Unhandled: C0000094.INT_DIVIDE_BY_ZERO
[21:12:14] Dump 1 initiated: E:\test\w3wp.exe_210525_211214.dmp
[21:12:14] Dump 1 writing: Estimated dump file size is 326 MB.
[21:12:15] Dump 1 complete: 326 MB written in 1.2 seconds
[21:12:15] Dump count reached.

从输出信息看已经成功抓取了 dump 文件,如果你的机器有多个 w3wp,可以将其替换成 pid,参考命令如下:


C:\Windows\system32>procdump -e -ma 9320 E:\test

2. 将 procdump 作为 AeDebug 的默认调试器

它的大概运作原理是:当程序出现了未处理异常,此时会激活操作系统的 Win32 unhandled exception filter,这个过滤器会调用注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 节点配置的调试器,也就是我的 Procdump,要将 procdump 送到注册表的 AeDebug  节点,可以使用 -i 进行注册。


-i Install ProcDump as the AeDebug postmortem debugger. Only -ma, -mp, -d and -r are supported as additional options.

完整参考命令如下:


C:\Windows\system32>procdump -ma -i E:\testProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.comSet to:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug(REG_SZ) Auto     = 1(REG_SZ) Debugger = "C:\xcode\soft\Procdump\procdump.exe" -accepteula -ma -j "E:\test" %ld %ld %pSet to:HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug(REG_SZ) Auto     = 1(REG_SZ) Debugger = "C:\xcode\soft\Procdump\procdump.exe" -accepteula -ma -j "E:\test" %ld %ld %pProcDump is now set as the Just-in-time (AeDebug) debugger.

从输出信息看已经成功将其送入到注册表了,接下来可以打开 注册表编辑器 去验证。

最后就是把 web 跑起来,1min之后就会成功的看到 E:\test 下的 dump 文件啦,截图如下:

从图中看有2个dump,具体为什么是2个我就不管了,就怕不生成。????????????

3. 借助 Windows Error Reporting 生成

它的大概运作原理是借助 windows 自带的 Windows Error Reporting 服务去帮助我们生成程序的 crash dump,要实现的话,必须开启这个服务并且在注册表中配置好你要抓取的exe程序,配置起来有点繁琐,这里有一个bat脚本,直接运行即可,简单粗暴。


SET DMPPATH=E:\test
SC CONFIG WerSvc START= AUTO
NET START WerSvc
ECHO 启用完成REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger /fREG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f
REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger /fECHO 删除完成REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /t REG_SZ  /v DumpFolder /d   %DMPPATH% /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /t REG_DWORD   /v DumpCount /d  2 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe"  /t REG_DWORD   /v DumpType /d  2 /fECHO 启用完成PAUSE

有3个参数需要简单解释一下。

  • DumpFolder:dump的存放路径

  • DumpCount: 最多保留几个 dump 文件

  • DumpType:  0:Custom dump.  1:Mini dump.  2:Full dump

bat执行完成后,可以到注册表中验证一下。

接下来把web跑起来,1min之后你就会看到生成的dump文件了,截图如下:

三:总结

对于抓取程序crash的dump,这三种方式基本上就可以做到万无一失,总结完后,对你对我都是节省宝贵的时间????????????。

END

工作中的你,是否已遇到 ...

1. CPU爆高

2. 内存暴涨

3. 资源泄漏

4. 崩溃死锁

5. 程序呆滞

等紧急事件,全公司都指望着你能解决...  危难时刻才能展现你的技术价值,作为专注于.NET高级调试的技术博主,欢迎微信搜索: 一线码农聊技术,免费协助你分析Dump文件,希望我能将你的踩坑经验分享给更多的人。

.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案相关推荐

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

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

  2. 单片机跑马灯程序c语言,MCS-51单片机控制跑马灯的三种方法

    描述 在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的.在并行端口的编程学习中,"跑马灯"是单片机并行端口输出控制的典型实例.所谓跑马灯,是 ...

  3. 微信小程序选择题制作_制作较小故事的三种选择

    微信小程序选择题制作 几周前我在以色列教研班时,人们遇到的最大问题之一就是大故事. 为什么这是一个问题? 如果您的故事很大,则无法显示进度,更重要的是,您无法进行更改. 对我来说,敏捷的重点是透明度- ...

  4. 如何在.NET程序崩溃时自动创建Dump?

  5. c语言数码管流动显示一个数,51单片机数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)...

    数码管动态扫描显示01234567程序二--51单片机动态显示共阳数码管01234567 原理图 c语言程序 程序如下: #include #define uint unsigned int #def ...

  6. linux 动态扫描 数码管,数码管动态扫描显示01234567程序(三种方案) - 全文

    数码管由于价格便宜,使用简单,在电器特别是家电领域(比如空调.热水器和冰箱等)得到了极为广泛的应用.在高校电子信息类专业单片机的教学过程中,数码管动态显示及实现方法是学生普遍反映较难掌握的内容.鉴于此 ...

  7. 数据抓取必须学会的三种技术

    我们正处于一个大数据的时代,在这样的一个以数据为王的时代,第一步就是如何获取数据.大概的流程是这样的:通过Http客户端获取html页面,通过html页面解析工具解析html页面,获取感兴趣的数据元素 ...

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

    作者:刘树伟 网上找到的windows在进程崩溃时自动抓dump的代码,几乎全部是由进程自己调用实现的,这个其实在一些情况下是有问题的. 原因1:程序已经崩溃,再创建dump,可能失败. 原因2:Mi ...

  9. 使用 Google Breakpad 来助力解决程序崩溃

    背景 作为一名程序,最头疼的莫过于项目上线后收到程序崩溃的通知,若能够在手头重现出该问题,那相对来说项目能够及时的修复并更新:如果无法重现外网崩溃的问题,那就十分的"头疼"了.要是 ...

最新文章

  1. 在EXT中前后台传数据的方式
  2. 台湾大学林轩田机器学习基石课程学习笔记11 -- Linear Models for Classification
  3. 使用DBI(perl)实现文本文件的导入导出mysql
  4. P7888-「MCOI-06」Distinct Subsequences【dp】
  5. laravel 向模板中添加公共变量
  6. Microstrategy CEO:比特币是一种货币资产 正在迅速取代黄金作为价值存储
  7. 全球最快!湖南大学天河超算存储系统!
  8. Kepserver如何连接InTouch
  9. [数据压缩作业2]TIFF文件格式分析
  10. Unity实现多旋翼无人机的模拟飞行(物理引擎)
  11. 常见地图坐标系以及转换方法、转换工具
  12. 运筹学--线性目标规划
  13. 每日学习-Java基础(十)接口和继承10(内部类)
  14. APS54083 DC/DC升降压恒流驱动芯片 2.4G调光 —提供DEMO板
  15. 二次规划及qpoases简要介绍
  16. Oracle Dataguard 介绍
  17. 【室内定位】常用的机器人定位导航技术及优缺点
  18. STM32F103驱动超声波HC-SR04
  19. 通过yolov5训练自己的模型中遇到的一些问题及解决办法
  20. xp服务器修改登录密码,xp服务器开机密码设置

热门文章

  1. php foreach id是否存在数组_请纠正这 5 个 PHP 编码小陋习
  2. ZooKeeper相关资料集锦
  3. 02 JRE与JDK
  4. WD 蓝盘、绿盘、黑盘、红盘的区别
  5. LINUX BASH SHELL,小小学习一下
  6. linux系统服务设置命令--chkconfig命令参数及用法详解
  7. SQL Azure Reporting CTP
  8. ZGY的Excel特征提取器初期版本完成
  9. 世界杯,世界共同的游戏!
  10. Django中session和cookie简单的使用