如何在 NET 程序万种死法中有效的生成 Dump (下)
一:背景
上一篇我们聊到了如何通过 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.dmp
ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
Waiting for process named WindowsFormsApp1.exe...
启动程序后点击 button 让 winform 假死,可以看到 procdump 在 5s 之后自动输出了dump。
C:\Windows\system32>procdump -ma -h -w WindowsFormsApp1.exe E:\net5\hungwindow.dmp
Press 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.dmp
ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
Waiting 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 面前这些都是弟弟,
如何在 NET 程序万种死法中有效的生成 Dump (下)的更多相关文章
- 如何在 NET 程序万种死法中有效的生成 Dump (上)
一:背景 相信很多人都知道通过 任务管理器 抓取dump,虽然简单粗暴,但无法满足程序的无数种死法,比如: 内存膨胀,程序爆炸 CPU爆高,程序累死 应用无响应,用户气死 意外退出,和人生一样 既然手 ...
- Windows编程 Windows程序的生与死(中)
<pre style=""><pre class="cpp" name="code">1 #include < ...
- [注]一将功成万骨枯!App的七种死法
一将功成万骨枯,这种事在有泡沫的行业总是会发生的.移动互联网尤甚.从<愤怒的小鸟>到<植物大战僵尸>.<捕鱼达人>.<唱吧>.<陌陌>……一 ...
- 深入学习c++--多线程编程(三)thread的两种死法
1. 生成了一个线程,需要告诉编译器是否管理 必须告诉编译器是不管理还是管理,否则直接down了 #include <iostream> #include <thread> # ...
- MHA的几种死法-叶良辰
master不通 找到最新slave 找到有所有其他slave缺失relay log的 slave 选主 配置文件指定 ...
- 你做电商死法TOP10:你中了几枪?
有相关报道说淘宝目前只有3%的店铺能够盈利,其余97%的店铺基本上都成了炮灰.这是一个非常可怕的数字,都说不赚钱的电商是犯罪,那么,是什么原因导致了会有如此庞大的电商群体一如既往的走在这千军万马的不归 ...
- 社交APP经典死法18种,听野路子产品菜狗怎么说
点这里 社交APP经典死法18种,听野路子产品菜狗怎么说 时间 2015-04-06 11:24:53 虎嗅网相似文章 (4)原文 http://www.huxiu.com/article/112 ...
- Windows编程 Windows程序的生与死(下)
再谈程序之“死” 记得在第二回中我对程序的“死”只是一句话带过,因为我还没有铺垫好,好了现在我们可以详细的分析一下这个过程了. 这还要从while消息循环说起,还记得GetMessage函数吗?它是一 ...
- 【第1期】腾讯云的1001种玩法征集,Ipad mini和Kindle 等你拿!(文章评审中)
版权声明:本文由阁主的小跟班原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/695994001482226944 来源:腾云 ...
随机推荐
- 1080 Graduate Admission——PAT甲级真题
1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...
- luogu4464:莫比乌斯反演,积性函数和伯努利数
题目链接:https://www.luogu.com.cn/problem/P4464 简记$gcd(x,y)=(x,y)$. 推式子: $\sum_{i=1}^{n}{(i,n)^xlcm(i,n) ...
- js引入jquery问题
写jsp的时候明明已经引入了jquery组件,但是总是报错如下图 jsp代码如下 <%@ page language="java" contentType="tex ...
- 安鸾渗透实战平台-PHP代码练习
0x00 前言 --工欲善其事,必先利其器 0x01 代码理解 (1)linux命令 pwd 查看当前工作目录的完整路径 cd / 切换到根目录 ls / 查看根目录下的所有目录和文件 cat /[f ...
- 【Azure Redis 缓存】Azure Redis 功能性讨论二
继承上一次讨论了Azure Redis的可用性,可靠性,稳定性,安全性,监控方面的九大功能点.详情可回顾文章:[Azure Redis 缓存]Azure Redis功能性讨论 这次我们继续讨论Azur ...
- css 超过一行省略号
//超过一行省略号 overflow: hidden; white-space: nowrap; text-overflow: ellipsis; //超过两行省略号 overflow: hidden ...
- MongoDB4.2 副本集扫盲说明
说明: 在扫盲MongoDB相关的一些知识的时候,顺手做下笔记.本文将说明副本集相关的内容.在比较早之前已经对这些有过说明,可以看MongoDB 副本集的原理.搭建.应用.MongoDB中的副本集是一 ...
- pytorch(05)计算图
张量的一系列操作,增多,导致可能出现多个操作之间的串行并行,协同不同的底层之间的协作,避免操作的冗余.计算图就是为了解决这些问题产生的. 计算图与动态图机制 1. 计算图 计算图用来描述运算的有向无环 ...
- OWASP TOP 10 详解
OWASP--开放式web应用程序安全项目 参考文献:袁鸣凯.OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防.2016-9-18. https://blog.csdn.n ...
- Windows-Redis占用C盘系统空间
发现redis在电脑死机蓝屏的情况下,就是非正常退出redis会导致redis的缓存文件不会回收,占用系统空间, 下次在启动的时候,会再次创建一个10G多的缓存文件,极度占用磁盘空间. 现说明解决办法 ...