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

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

a0beed315aed508786ab848dbb452661.png

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

6707507e418e85ba3cf66b1819ad1c37.png

事件查看器查到的内容根本对咱们排障没有任何做用。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工具

e15a41a5b2c2a985414fc6849ffdf20b.png

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

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

0d3322ff638df33ba6d936c3b322eef6.png

演示stackoverflow错误致使的crash

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

class Program

{

static void HogeHoge(string s)

{

HogeHoge(s);

}

static void Main(string[] args)

{

HogeHoge("hoge-");

}

}

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

2af1ddb0cb9c7fefaefa48824d0b569a.png

查看下dump文件果真生成了

926fe345099e762cbd4d0272e25571cf.png

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

430a5f872967f5a9e3a037a895cbb924.png

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

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

这里牵扯出3个名词

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

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

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

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

点击后会直接进入

96123bb69b8851776f0c87c1e97ec701.png

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

下面咱们来作一个模拟

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

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

fcad095ae4b2cab065f64914e87299fd.png

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

分别是如下三个

50b4e6095988cc5cee43bcd4be01ca9b.png

第一个窗口:线程窗口

ea065b8e8316a08e3d523f56981a0071.png

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

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

d52720e9a1a09000e0d2ea6d42c52d03.png

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

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

d7fe5740e2bf019c06311b1f492f4d3c.png

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

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

CPU100和死锁致使的crash解析

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

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

新建一个asp.net mvc程序

57eb04daaede4a1c81049dff.html

public classHomeController : Controller

{async TaskGetAsync()

{var str = await new HttpClient().GetStringAsync("http://www.baidu.com/");returnstr;

}publicActionResult Index()

{var s =GetAsync().Result;returnView();

}

}

57eb04daaede4a1c81049dff.html

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

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

打开Windows任务管理器找到w3wp

991ee141c6cafc335e08e7c4ca27603e.png

52ee5796c69f2eafc9fcf7a988e571e1.png

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

打开并行堆栈这个窗口

61923bd258fbc5725dae6f66b7233d5c.png

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

410d37971411f94935774214f23c16e1.png

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

死锁缘由:

725d5781716a34d07104acaea528a343.png

总结:

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值