dump解析入门-用VS解析dump文件进行排障

摘要:
接下来我们用几个实际的例子来看看如何用vs2017来分析dump文件吧dump文件的收集应用挂是一瞬间的事情,挂了之后就没办法生成dump文件了。CPU100和死锁导致的crash解析由于系统可以配置crash自动生成dump文件。这个时候就需要我们手动提取dump文件了。

突然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开

dump解析入门-用VS解析dump文件进行排障第1张

【事件查看器】查看下,好不容易找到了打开后一脸懵逼

dump解析入门-用VS解析dump文件进行排障第2张

事件查看器查到的内容根本对我们排障没有任何作用。

在这个时候如果有对应的dump文件就能派上用场了,

只要有dump文件就能查到应用挂掉那刻的一手情报,可能有人认为分析dump文件是非常难的事情,

但是最近不断有新的dump分析工具出来,例如用vs2017就能够很简单的分析dump文件。

接下来我们用几个实际的例子来看看如何用vs2017来分析dump文件吧

dump文件的收集

应用挂是一瞬间的事情,挂了之后就没办法生成dump文件了。所以首先要设置一下自动生成dump文件。

打开注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsWindows Error Reporting

dump解析入门-用VS解析dump文件进行排障第3张

在Windows Error Reporting下新建一个 LocalDumps文件夹

然后在这项里面新增 DumpCount DumpFolder DumpType 这三项

dump解析入门-用VS解析dump文件进行排障第4张

演示stackoverflow错误导致的crash

我们有创建一个简单的console程序

class Program

{

static void HogeHoge(string s)

{

HogeHoge(s);

}

static void Main(string[] args)

{

HogeHoge("hoge-");

}

}

编译成exe 后运行 毫无疑问会出现如下错误

dump解析入门-用VS解析dump文件进行排障第5张

查看下dump文件果然生成了

dump解析入门-用VS解析dump文件进行排障第6张

那我们分析下这个dump文件,用VS2017打开它,会出现它的概要信息

dump解析入门-用VS解析dump文件进行排障第7张

你会发现异常信息处写了 【该线程已用完其堆栈】就可以很明显看出来是stackoverflow。

而且看右侧【操作】处 有[使用 仅限托管 进行调试] 和 [使用 混合 进行调试] 和 [使用 仅限本机 进行调试]

这里牵扯出3个名词

托管 ======> 适用于在公共语言运行时下运行的代码 所谓托管是指内存管理由系统而不是由程序员管理 大家都知道c#有关内存都是CLR来管理的

混合 ======>对托管代码和非托管代码都调用调试器

本机 ======>适用于非托管代码

如果你的代码里面没有调用非托管代码的话 点击 前面2个按钮都可以的

点击后会直接进入

dump解析入门-用VS解析dump文件进行排障第8张

这样错误源码级别看的非常清楚了。因为是我们本机创建的工程 pdb 和 源码都有。所以才能直接定位到。但是实际上crash都是发生在服务器上,把服务器上的dump文件打开的话还会是这样吗

下面我们来做一个模拟

用Relase编译 然后把 Program.cs文件也给删除掉。然后重新执行crash生成dump文件

然后用同样的步骤vs打开点击调试就会提示找不到 Program.cs

dump解析入门-用VS解析dump文件进行排障第9张

这样一来可供我们排障的情报就少了很多。在这种情况下 我们可以利用vs 提供的几个窗口来观察

分别是以下三个

dump解析入门-用VS解析dump文件进行排障第10张

第一个窗口:线程窗口

dump解析入门-用VS解析dump文件进行排障第11张

实际的程序往往有很多线程在运行,每个线程的切换等重要信息可以在这个窗口进行观察。

第二个窗口:调用堆栈窗口

dump解析入门-用VS解析dump文件进行排障第12张

调用堆栈窗口是和线程窗口联动的。

第三个窗口也是最重要的窗口:并行堆栈

dump解析入门-用VS解析dump文件进行排障第13张

如图所示,每个线程和它的堆栈内容展示的很清楚。只不过本例子是比较简单的,即使不看这个看前2个窗口就能知道原因了。

但是实际的应用若超过运行上百个线程的话,将这些线程用图形可视化出来对于我们排查复杂问题是非常有用的!

CPU100和死锁导致的crash解析

由于系统可以配置crash自动生成dump文件。但是有些情况比如部署在iis上web服务cpu飙到100%下不来导致为web停止服务。这个时候就需要我们手动提取dump文件了。

下面我们来模拟一下这种场景:

新建一个asp.net mvc程序

public classHomeController : Controller
{
    async Task<string>GetAsync()
    {
        var str = await new HttpClient().GetStringAsync("http://www.baidu.com/");
        returnstr;
    }
    publicActionResult Index()
    {
        var s =GetAsync().Result;
        returnView();
    }
}

以上代码 async/await会造成死锁

我们用iis来启动这个web应用后页面圈圈一直在转网页空白一片

打开Windows任务管理器找到w3wp

dump解析入门-用VS解析dump文件进行排障第14张

dump解析入门-用VS解析dump文件进行排障第15张

用vs打开这个dump文件 点击调试后后

打开并行堆栈这个窗口

dump解析入门-用VS解析dump文件进行排障第16张

大家看会有很多分支,该从哪个开始分析呢,教大家一个小技巧,不知道如何下手的时候就选分支越长的!

dump解析入门-用VS解析dump文件进行排障第17张

从HomeController.Index进来,停止在ManualResetEventSlim.Wait

死锁原因:

dump解析入门-用VS解析dump文件进行排障第18张

总结:

说到dump大家立马可能想到的是windbg

但是windbg的各种命令对于新手们还是比较困难的,Vs工具也能帮助我们分析dump,能够解决的问题也有很多

下一篇文章我将介绍内存泄露dump分析的例子

免责声明:文章转载自《dump解析入门-用VS解析dump文件进行排障》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇更新CSS缓存的办法【Linux】使用fsck对磁盘进行修复下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端worker之web worker

web worker 背景 众所周知javascript是单线程的,同一时间内只能做一件事情。这是十分必要的,设想,如果js是多线程的。有个dom元素两个线程同时做了改变,一个display:none,另一个display:block,这样让浏览器就无所适从了。出于此种考虑,单线程的js就这样一直延续下来,但是凡事必有两面性,虽然单线程保证了一些ui操作的...

正确使用Android性能分析工具——TraceView

TraceView界面 现来看一下整个界面的图,整个界面包括上下两部分,上面是你测试的进程中每个线程的执行情况,每个线程占一行;下面是每个方法执行的各个指标的值 上面一部分是你测试进程的中每个线程运行的时间线,下图中可以可以看到,主要只有一个main线程在执行,因为我滑动了一下列表,main线程(UI线程)正在进行绘制View呢~~ 然后我点击了序号为13...

redisson实现分布式锁(spring整合redisson)

由于redis实现分布式锁不完美: 加锁的代码: /** * 加锁 * @param locaName 锁的key * @param acquireTimeout 获取超时时间 * @param timeout 锁的超时时间 * @return 锁标识 */ public stat...

深入MySQL复制(一)

本文非常详细地介绍MySQL复制相关的内容,包括基本概念、复制原理、如何配置不同类型的复制(传统复制)等等。在此文章之后,还有几篇文章分别介绍GTID复制、半同步复制、实现MySQL的动静分离,以及MySQL 5.7.17引入的革命性功能:组复制(MGR)。 本文是MySQL Replication的基础,但却非常重要。对于MySQL复制,如何搭建它不是重...

C#并发编程

最近看C# 并发编程··,这里做一下总结··多线程,异步,并行,大部分都是最近看C#并发编程这个书涉及到的··这里仅仅列出实现方式,书里边介绍的其他的东西没有涉及比如取消操作,同步操作,集合之类的东西 线程:Thread,ThreadPool,BackgroundWorker, Thread 可以又更多控制··ThreadPool就是丢进去系统好管理线程,...

Android中的Handler机制

在android主线程中做太耗时的操作会引起ANR崩溃,为了进行线程间通信,就需要用到handler消息处理机制。消息传递分为两类,一种是从MainThread向WorkerThread传递消息,而另外一种是从WorkerThread向MainThread传递消息。由于主线程主要负责UI相关的事件,如用户的点击事件,屏幕触摸事件等,当捕捉到用户动作后将会分...