dump文件生成及分析

转自:https://yq.aliyun.com/articles/643497
突然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开
dump文件生成及分析
【事件查看器】查看下,好不容易找到了打开后一脸懵逼
dump文件生成及分析
事件查看器查到的内容根本对我们排障没有任何作用。

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

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

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

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

dump文件的收集

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

打开注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
dump文件生成及分析
在Windows Error Reporting下新建一个 LocalDumps文件夹

然后在这项里面新增 DumpCount DumpFolder DumpType 这三项
dump文件生成及分析
然后运行exe
在设定好的目录下面找到dump文件,使用vs2017打开,你会发现异常信息处写了 【该线程已用完其堆栈】就可以很明显看出来是stackoverflow。

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

这里牵扯出3个名词

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

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

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

如果你的代码里面没有调用非托管代码的话 点击 前面2个按钮都可以的
dump文件生成及分析
点击后会直接进入
dump文件生成及分析
这样错误源码级别看的非常清楚了。因为是我们本机创建的工程 pdb 和 源码都有。所以才能直接定位到。但是实际上crash都是发生在服务器上,把服务器上的dump文件打开的话还会是这样吗

下面我们来做一个模拟

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

然后用同样的步骤vs打开点击调试就会提示找不到 Program.cs
dump文件生成及分析
这样一来可供我们排障的情报就少了很多。在这种情况下 我们可以利用vs 提供的几个窗口来观察

分别是以下三个

  1. call stack
  2. Threads
  3. parallel stacks

三者结合查看可以很快定位到错误信息。