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


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

     

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

     

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

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

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

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

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

    dump文件的收集

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

    打开注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsWindows 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文件,就可以直接定位到出错的代码行。

    步骤

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

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

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

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

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



    作者:那些云
    链接:https://www.jianshu.com/p/bfd4a6a3a6d9
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

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

  • 相关阅读:
    Count Up Down(上下计数)
    TCP与UDP的区别
    xml和json的区别
    java中String,StringBuffer,StringBuilder的区别
    java中访问修饰符public,private,protected,friendly的作用域
    java中的数据类型,基本数据类型及其包装类型
    Collection和Collections的区别
    Java中静态变量和实例变量的区别
    Java中实现多态的条件是什么
    Java中抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/mq0036/p/11503064.html
Copyright © 2020-2023  润新知