服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障

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

a0beed315aed508786ab848dbb452661.png

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第1张图片

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

在这个时候若是有对应的dump文件就能派上用场了,c#

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

可是最近不断有新的dump分析工具出来,例如用vs2017就可以很简单的分析dump文件。多线程

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

dump文件的收集asp.net

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

打开注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting工具

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第2张图片

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

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第3张图片

演示stackoverflow错误致使的crash

咱们有建立一个简单的console程序

class Program

{

static void HogeHoge(string s)

{

HogeHoge(s);

}

static void Main(string[] args)

{

HogeHoge("hoge-");

}

}

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第4张图片

查看下dump文件果真生成了

926fe345099e762cbd4d0272e25571cf.png

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第5张图片

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

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

这里牵扯出3个名词

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

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

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

若是你的代码里面没有调用非托管代码的话 点击 前面2个按钮均可以的

点击后会直接进入

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第6张图片

这样错误源码级别看的很是清楚了。由于是咱们本机建立的工程 pdb 和 源码都有。因此才能直接定位到。可是实际上crash都是发生在服务器上,把服务器上的dump文件打开的话还会是这样吗

下面咱们来作一个模拟

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

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第7张图片

这样一来可供咱们排障的情报就少了不少。在这种状况下 咱们能够利用vs 提供的几个窗口来观察

分别是如下三个

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第8张图片

第一个窗口:线程窗口

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第9张图片

实际的程序每每有不少线程在运行,每一个线程的切换等重要信息能够在这个窗口进行观察。

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第10张图片

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

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第11张图片

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

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

CPU100和死锁致使的crash解析

因为系统能够配置crash自动生成dump文件。可是有些状况好比部署在iis上web服务cpu飙到100%下不来致使为web中止服务。这个时候就须要咱们手动提取dump文件了。

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

新建一个asp.net mvc程序

public classHomeController : Controller

{async TaskGetAsync()

{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文件位置,dump解析入门-用VS解析dump文件进行排障_第12张图片

52ee5796c69f2eafc9fcf7a988e571e1.png

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

打开并行堆栈这个窗口

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第13张图片

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

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第14张图片

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

死锁缘由:

服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障_第15张图片

总结:

说到dump你们立马可能想到的是windbg

可是windbg的各类命令对于新手们仍是比较困难的,Vs工具也能帮助咱们分析dump,可以解决的问题也有不少

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

你可能感兴趣的:(服务器dump文件位置)