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

忽然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开html
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

【事件查看器】查看下,好不容易找到了打开后一脸懵逼程序员
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

事件查看器查到的内容根本对咱们排障没有任何做用。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文件进行排障
文章图片

在Windows Error Reporting下新建一个 LocalDumps文件夹
而后在这项里面新增 DumpCount DumpFolder DumpType 这三项
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

演示stackoverflow错误致使的crash
咱们有建立一个简单的console程序
class Program
{
static void HogeHoge(string s)
{
HogeHoge(s);
}
static void Main(string[] args)
{
HogeHoge("hoge-");
}
}
编译成exe 后运行 毫无疑问会出现以下错误
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

查看下dump文件果真生成了
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

那咱们分析下这个dump文件,用VS2017打开它,会出现它的概要信息
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

你会发现异常信息处写了 【该线程已用完其堆栈】就能够很明显看出来是stackoverflow。
并且看右侧【操做】处 有[使用 仅限托管 进行调试] 和 [使用 混合 进行调试] 和 [使用 仅限本机 进行调试]
这里牵扯出3个名词
托管======> 适用于在公共语言运行时下运行的代码 所谓托管是指内存管理由系统而不是由程序员管理你们都知道c#有关内存都是CLR来管理的
混合======>对托管代码和非托管代码都调用调试器
本机======>适用于非托管代码
若是你的代码里面没有调用非托管代码的话 点击 前面2个按钮均可以的
点击后会直接进入
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

这样错误源码级别看的很是清楚了。由于是咱们本机建立的工程 pdb 和 源码都有。因此才能直接定位到。可是实际上crash都是发生在服务器上,把服务器上的dump文件打开的话还会是这样吗
下面咱们来作一个模拟
用Relase编译 而后把 Program.cs文件也给删除掉。而后从新执行crash生成dump文件
而后用一样的步骤vs打开点击调试就会提示找不到 Program.cs
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

这样一来可供咱们排障的情报就少了不少。在这种状况下 咱们能够利用vs 提供的几个窗口来观察
分别是如下三个
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

第一个窗口:线程窗口
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

实际的程序每每有不少线程在运行,每一个线程的切换等重要信息能够在这个窗口进行观察。
第二个窗口:调用堆栈窗口
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

调用堆栈窗口是和线程窗口联动的。
第三个窗口也是最重要的窗口:并行堆栈
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

如图所示,每一个线程和它的堆栈内容展现的很清楚。只不过本例子是比较简单的,即便不看这个看前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文件进行排障
文章图片

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

用vs打开这个dump文件 点击调试后后
打开并行堆栈这个窗口
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

你们看会有不少分支,该从哪一个开始分析呢,教你们一个小技巧,不知道如何下手的时候就选分支越长的!
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

从HomeController.Index进来,中止在ManualResetEventSlim.Wait
死锁缘由:
服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
文章图片

总结:
说到dump你们立马可能想到的是windbg
可是windbg的各类命令对于新手们仍是比较困难的,Vs工具也能帮助咱们分析dump,可以解决的问题也有不少
【服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障】下一篇文章我将介绍内存泄露dump分析的例子

    推荐阅读