C#.NET dump解析入门-用VS解析dump文件进行排障
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
突然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开
【事件查看器】查看下,好不容易找到了打开后一脸懵逼
事件查看器查到的内容根本对我们排障没有任何作用。 在这个时候如果有对应的dump文件就能派上用场了, 只要有dump文件就能查到应用挂掉那刻的一手情报,可能有人认为分析dump文件是非常难的事情, 但是最近不断有新的dump分析工具出来,例如用vs2017就能够很简单的分析dump文件。 接下来我们用几个实际的例子来看看如何用vs2017来分析dump文件吧
dump文件的收集 应用挂是一瞬间的事情,挂了之后就没办法生成dump文件了。所以首先要设置一下自动生成dump文件。 打开注册表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 死锁原因:
该文章在 2024/11/19 9:13:02 编辑过 |
关键字查询
相关文章
正在查询... |