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

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

 

 

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

 

 

 

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

 

 

 

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

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

 

 

 

演示stackoverflow错误致使的crash

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

class Program

    {

        static void HogeHoge(string s)

        {

            HogeHoge(s);

        }

        static void Main(string[] args)

        {

            HogeHoge("hoge-");

        }

 }

 

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

 

 

查看下dump文件果真生成了

 

 

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

 

 

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

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

这里牵扯出3个名词

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

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

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

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

 

点击后会直接进入

 

 

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

下面咱们来作一个模拟

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

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

 

 

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

分别是如下三个

 

 

第一个窗口:线程窗口

 

 

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

 

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

 

 

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

 

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

 

 

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

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

 

CPU100和死锁致使的crash解析

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

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

新建一个asp.net mvc程序

复制代码
public class HomeController : Controller
{
    async Task<string> GetAsync()
    {
        var str = await new HttpClient().GetStringAsync("http://www.baidu.com/");
        return str;
    }

    public ActionResult Index()
    {
        var s = GetAsync().Result;
        return View();
    }
}
复制代码

 

 

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

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

打开Windows任务管理器找到w3wp

 

 

 

 

 

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

打开并行堆栈这个窗口

 

 

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

 

 

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

死锁缘由:

 

 

 

总结:

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

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

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

 

出处:https://www.cnblogs.com/yudongdong/p/9687320.html

========================================================================

DebugDiag

获取dump文件

打开debugdiag后,点击add Rule,选择Crash 点击下一步,而后选择A specific process 点击下一步,找到要监听的进程,点击下一步;在Action type for unconfigured first chance一栏,选择Log Stack Trace,而后下面的maximum number...意思是最多建立多少个dump文件,默认10个就好,太多了也分析不过来呀。而后点击下一步,上面的rule name默认就好,下面的dump文件输出位置,能够本身找个位置放好。 再点击下一步,这里默认第一个选择就能够了,点击完成就好了。

按上面的步骤,等到程序发生崩溃的时候,就会有dump文件生成了。

分析dump文件

其实我用debugdiag都没分析出什么能看懂的结果,仍是用Visual Studio比较直接。

注意

使用工具时,一打开这个软件个人电脑就会弹出警告,(error collection COM+ infomation.依赖服务或组没法启动), 各类查找后发现是电脑里COM+ System Application 这个服务未能启动,并且没法手动启动,此时点击该服务->属性->依存关系,能够看到此服务依赖三个服务,挨个在服务里查找,发现是System Event Notification Service服务设置的禁用,改状态为手动,而后启动它,而后再去启动COM+ System Application服务,启动成功,DebugDiag就不会再报错了。


Visual Studio

咱们能够很方便的利用VS分析dump文件,若是有生成dump文件时对应的.pdb文件,就能够直接定位到出错的代码行。

步骤

一、将.exe和.pdb文件与dump文件放在一个文件夹中,而后在VS中,点击 文件->打开->文件,选择dump文件,打开。

二、在解决方案资源管理器右键单击解决方案'Solution0'(这个0会随着你打开的dump文件而增长,不重要),而后选择属性,点击调试源文件,将项目的源代码对应的文件路径添加进去,而后肯定。

三、在工具->选项->调试->常规中,找到“要求源文件与原始版本彻底匹配”这一栏,取消掉勾选,这是由于可能你已经修改过某些地方的代码了,会致使找不到位置,而只显示汇编文件的状况。

四、最后,点击右侧的操做那里,有个使用 仅限本机 进行调试,就能出结果啦。

水平有限,有什么不对的但愿有大佬指教下,我会改正的。



做者:那些云
连接:https://www.jianshu.com/p/bfd4a6a3a6d9
来源:简书
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。 

 

出处:https://www.jianshu.com/p/bfd4a6a3a6d9

相关文章
相关标签/搜索