一:背景

上一篇我们聊到了如何通过 procdump 抓取 cpu爆高内存暴涨 两种情况,这一篇再聊聊如何去抓程序 挂死意外退出

二:程序挂死

1. 定义

程序挂死 简单的说就是程序没有响应,既然没响应了,可能 死锁, 可能 负载过大线程池耗尽 等等情况,万千世界,啥情况都有????????????。

既然是用 procdump 去抓,我得先了解下它对 挂死 (hung on) 的定义?


-h Write dump if process has a hung window (does not respond to window messages for at least 5 seconds).

从上面的定义看,人家貌似是判断窗口是否在指定时间内响应 windows消息 来判别的,我知道你在想什么????,你寻找的web请求响应时间过长,这种场景通过 -h 是抓不到的,我感觉它特别适合那些带有 GUI 程序的抓取,比如说:(WPF,Winform) 。

2. 案例演示

现在我准备创建一个简单的 winform 程序,在 button 事件中故意让主线程sleep造成程序假死,参考代码如下:

public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Thread.Sleep(1000 * 10);MessageBox.Show("clicked me!");}}

接下来启动 cmd 窗口,输入:


C:\Windows\system32>procdump -ma -h -w WindowsFormsApp1.exe E:\net5\hungwindow.dmpProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.comWaiting for process named WindowsFormsApp1.exe...

启动程序后点击 button 让 winform 假死,可以看到 procdump 在 5s 之后自动输出了dump。


C:\Windows\system32>procdump -ma -h -w WindowsFormsApp1.exe E:\net5\hungwindow.dmpPress Ctrl-C to end monitoring without terminating the process.[14:49:53] Hung Window:
[14:49:53] Dump 1 initiated: E:\net5\hungwindow.dmp
[14:49:53] Dump 1 writing: Estimated dump file size is 303 MB.
[14:49:53] Dump 1 complete: 303 MB written in 0.7 seconds
[14:49:54] Dump count reached.

然后用 windbg 看看每一个线程都在做什么?


0:000> ~*e !clrstack
OS Thread Id: 0x6698 (0)
Child SP       IP Call Site
00cfeb60 7722327c [HelperMethodFrame: 00cfeb60] System.Threading.Thread.SleepInternal(Int32)
00cfebe4 5da9be7b System.Threading.Thread.Sleep(Int32)
00cfebec 02d1238d WindowsFormsApp1.Form1.button1_Click(System.Object, System.EventArgs) [E:\net5\ConsoleApp1\WindowsFormsApp1\Form1.cs @ 23]
00cfec04 5a3b95bb System.Windows.Forms.Control.OnClick(System.EventArgs)
00cfec18 5a3bbe57 System.Windows.Forms.Button.OnClick(System.EventArgs)
...

三:意外退出

1. 概念

意外退出 我想很多朋友都遇到过,本来 Console 程序跑的好好地,半夜收到报警短信....  还有用户反馈,你那终端可行呀,点了几下就挂掉了。。。????????????

有些朋友可能在想,sd,这问题还不简单,加一个全局 未处理异常 不就好啦???真搞不懂怎么想的 ????????????。

哈哈,总以为 全局异常处理 能够包治百病,还是太年轻了,记得上一家公司用了阿里的sdk,底层用了 C++ 封装,程序莫名退出了,全局异常处理也没任何日志,说到这里我想你也知道了,非托管层抛出的异常,托管层这时候就是弟弟,就这么简单????????????

2. 演示

我准备在程序中抛出一个简单的 DivideByZeroException ,方便让程序退出。

public class Program{public static void Main(string[] args){var result = CalcDAL();Console.WriteLine($"result={result}");Console.ReadLine();}public static int CalcDAL(){try{var query = "0";Thread.Sleep(2000);  //do sth...return 0 / Convert.ToInt32(query);}catch (Exception ex){Console.WriteLine(ex.Message);throw;}}}

程序跑起来后,在 procdump 上用 -e 命令抓取。


C:\Windows\system32>procdump -ma -e  -w ConsoleApp1.exe E:\net5\test.dmpProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.comWaiting for process named ConsoleApp1.exe...Press Ctrl-C to end monitoring without terminating the process.[15:29:56] Exception: 04242420
[15:29:58] Exception: C0000094.INT_DIVIDE_BY_ZERO
[15:29:58] Exception: C0000094.INT_DIVIDE_BY_ZERO
[15:29:58] Exception: C0000094.INT_DIVIDE_BY_ZERO
[15:29:58] Unhandled: C0000094.INT_DIVIDE_BY_ZERO
[15:29:58] Dump 1 initiated: E:\net5\test-2.dmp
[15:29:58] Dump 1 writing: Estimated dump file size is 50 MB.
[15:29:59] Dump 1 complete: 50 MB written in 0.2 seconds
[15:29:59] Dump count reached.

从输出看,万事ok。

3. 拓展

不知道有没有朋友还记得 VS 有一个 异常断点 吗?表示当某种异常抛出时,程序自动进入断点处调试状态,这是一个帮助找到bug的利器,但还是有一定限制的,毕竟程序都跑在生产上,你也不能把 vs 搬过去,也不可能搞个远程调试啥的,所以当程序抛出了某一种异常后,怎么自动生成一个 dump 呢???

在强大的 procdump 面前这些都是弟弟,????????,主要通过下面两种方式进行异常碰撞检索。

  • 通过 异常类型 抓取

何为 异常类型,比如本节的 DivideByZeroException 异常,通过在 procdump 中设置 -e 1 -f DivideByZeroException 即可。

CalcDAL() 方法中的 throw 去掉,保证程序不异常退出。

public static int CalcDAL(){try{var query = "0";Thread.Sleep(2000);  //do sth...return 0 / Convert.ToInt32(query);}catch (Exception ex){Console.WriteLine(ex.Message);return 0;}}

然后用 proddump 输入如下命令。


C:\Windows\system32>procdump -ma  -w -e 1 -f   "divide by zero"  -w ConsoleApp1.exe E:\net5\test.dmpProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.comWaiting for process named ConsoleApp1.exe...Press Ctrl-C to end monitoring without terminating the process.CoreCLR Version: v5.0.3[15:44:15] Exception: E0434F4D.System.DivideByZeroException ("Attempted to divide by zero.")
[15:44:15] Dump 1 initiated: E:\net5\test-3.dmp
[15:44:16] Dump 1 writing: Estimated dump file size is 50 MB.
[15:44:16] Dump 1 complete: 50 MB written in 0.2 seconds
[15:44:16] Dump count reached.

看到上面的 Exception: E0434F4D.System.DivideByZeroException ("Attempted to divide by zero.") 了嘛?哈哈,已经成功捕获啦,是不是挺有意思????。

  • 通过 异常信息 抓取

异常信息 的话,我觉得更加灵活,比如我搜索一下:divide by zero 关键词就能成功捕获。


C:\Windows\system32>procdump -ma  -w -e 1 -f   "divide by zero"  -w ConsoleApp1.exe E:\net5\test.dmp[15:46:34] Exception: E0434F4D.System.DivideByZeroException ("Attempted to divide by zero.")
[15:46:34] Dump 1 initiated: E:\net5\test-4.dmp
[15:46:34] Dump 1 writing: Estimated dump file size is 49 MB.
[15:46:34] Dump 1 complete: 49 MB written in 0.2 seconds
[15:46:35] Dump count reached.

四:总结

混混沌沌写了这么多,上下两篇四种抓取方法我想你都学会了吧,万事开头难,有了dump,接下来就是好好研究咯!

如何在 NET 程序万种死法中有效的生成 Dump (下)相关推荐

  1. 如何在 .NET 程序万种死法中有效的生成 Dump (上)

    一:背景 相信很多人都知道通过 任务管理器 抓取dump,虽然简单粗暴,但无法满足程序的无数种死法,比如: 内存膨胀,程序爆炸 CPU爆高,程序累死 应用无响应,用户气死 意外退出,和人生一样 既然手 ...

  2. [转载]创业者的N种死法

    现在什么最多?创业者最多,CEO最多,在创业大街上随便拉住人问,十个人里有九个是CEO.但是自己创业当老板固然有当老板的风光,但是当了老板才发现,老板也不容易.其中最糟的情况,大约是今天是这家公司的老 ...

  3. 民营企业的13种死法

    "我粗粗地算了一下,要搞死一个民营企业,至少有十三种方法."史玉柱说,"这里面还不包括出于企业内部的原因,比如经营不善等." 不正当竞争是第一种死法." ...

  4. 曾李青:早期创业公司九种死法

    曾李青:早期创业公司九种死法 第一,跨行业创业 比如原来做游戏的人要做电商,原来做互联网社区的要做游戏.现在的互联网环境下,这种跨行业创业失败概率都会比较高. 在演讲中,他谈到:可能有人会有问题说&q ...

  5. 互联网公司的几种“死法”

    互联网公司的几种"死法" 提交 我的评论 加载中 已评论 互联网公司的几种"死法" 轻码云通讯 微信号 qingmayun 功能介绍 中国首个社交通讯应用云平台 ...

  6. 计算机专业学不会C语言的 N 种死法!赶紧看看,你中了几条?

    以下是计算机专业学不会C语言的 N 种死法!学生党请进,老师们请绕路!(以免看到你学生学C语言时的真实情况) 1.听说明天就要开始学习C语言了,晚上睡不着觉兴奋死! 2.在C语言课上,老师讲得口沫横飞 ...

  7. 架构修炼之道 | 一个传统网关系统有几种 “死” 法

    本文节选自<架构修炼之道>,作者京东王新栋. 图 | meghan-holmes-779221-unsplash 这里说的传统,是按照网关技术演进的阶段划分的,从同步到半同步,再到全异步, ...

  8. 智简全渠道孟伟:做CRM十六年,企业的一百种死法

    "业内有这么一句话:不上CRM是等死,上CRM是找死.我知道企业上CRM的100种死法."孟伟这样谈他做智简全渠道CRM初衷.他2000年开始从事零售电商信息系统规划设计,精耕16 ...

  9. 民营企业的十三种死法

    第一种死法是不正当竞争."竞争对手如想整你,你在明处,他在暗处,很容易整死一家企业.诬告.打官司等破坏你声誉的方法很多.2000年秋天,全国有一半省会城市的人大.政协突然每天都能接到有关脑白 ...

最新文章

  1. 我用python10年后,我发现学python必看这三本书!
  2. “神仙”打架,“凡人”遭殃
  3. short s1 = 1; s1 = s1 + 1;和short s1 = 1; s1 += 1;的区别
  4. makefile的选项CFLAGS和LDFLAGS
  5. 1.1 了解web性能
  6. 集中化Linux日志管理系统
  7. 组合优化问题的典型事例
  8. Web 自动化神器 TestCafe(二)—元素定位篇
  9. ibmRaid5服务器换硬盘,IBM 小型机更换硬盘过程: raid5
  10. 简易网页(HTML)
  11. exadata的infiniband交换机的ilom
  12. 智能合约隐私计算之同态加密应用举例
  13. 测试面试题集-性能测试
  14. android编译错误
  15. toArray()和toArray(Object a[ ]) 区别
  16. 用H5和原生JS制作一款简单的视频播放器
  17. python:查找兄弟单词
  18. (14)主流WLAN标准及用途
  19. 艾泰转发规则虚拟服务器,艾泰HiPER 510典型配置案例详解
  20. @Primary 使用

热门文章

  1. python 安装xpath_Python网络爬虫(四)- XPath1.XPath2.XPath在python中的应用
  2. 编译安装PHP出现configure: error: MySQL configure failed. Please check config.log的解决方法
  3. [Codeforces700E Cool Slogans]
  4. Python -bs4介绍
  5. Shell_mysql命令以及将数据导入Mysql数据库
  6. NUMPY数据集练习 ----------SKLEARN类
  7. HTML5 Canvas 绘制六叶草
  8. 专题2-通过按键玩中断\第1课-中断处理流程深度剖析-lesson1
  9. JDeveloper中文乱码问题
  10. vue-router query,parmas,meta传参