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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 突然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开     【事件查看器】查看下,好不容易找到了打开后一脸懵逼       事件查看器查到的内容根本对我们排障没有任何作用。 在这个时候如果有对应的dump文件就能派上用场了, 只要有dump文件就能查到应用挂掉那刻的一手情报,可能有人认为分析dump文件是非常难的事情, 但是最近不断有新的dump分析工具出来,例如用vs2017就能够很简单的分析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

死锁原因:

 

 

 

总结:

说到dump大家立马可能想到的是windbg

但是windbg的各种命令对于新手们还是比较困难的,Vs工具也能帮助我们分析dump,能够解决的问题也有很多

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


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。
目录
相关文章
|
24天前
|
JavaScript API
深入探索fs.WriteStream:Node.js文件写入流的全面解析
深入探索fs.WriteStream:Node.js文件写入流的全面解析
|
1天前
云解析分享文件
这座建筑结合了现代设计与和谐的自然景观。大面积的玻璃窗让居住者可以充分享受美景和阳光,同时保证了室内充足的自然光线。是体验宁静生活与自然之美的理想之地。图片展现了其优美的自然环境和现代建筑设计的完美融合。
18 6
云解析分享文件
|
7天前
|
JSON 前端开发 JavaScript
解析JSON文件
解析JSON文件
28 9
|
23天前
|
XML 存储 网络安全
ROS入门(二):launch文件解析
该文章是关于ROS入门的第二篇教程,详细解析了ROS中的launch文件,包括其运行方式、XML格式规范、标签使用、参数替代、条件属性以及通过简单和复杂案例来演示launch文件的使用,最后介绍了如何在参数服务器上设置参数。
ROS入门(二):launch文件解析
|
1月前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
15 1
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
|
29天前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
23 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
|
1月前
|
存储 数据采集 数据可视化
深入解析GPS接收机的位置数据文件:项目实战从数据解析到可视化
全球定位系统(GPS)是现代技术的支柱之一,广泛应用于交通导航、科学研究、智能设备等领域。GPS接收机通过接收来自卫星的信号,确定设备的地理位置,并将这些位置信息记录在数据文件中。 这些数据文件通常包含大量的信息,如时间、位置、海拔高度、卫星状态等。本篇文章将通过解析这些数据文件,展示如何利用Python和Folium库实现数据的读取、处理和可视化,帮助读者深入理解GPS数据的处理过程。
|
1月前
|
监控 数据挖掘 Python
python3解析wav文件获取dtmf值
【8月更文挑战第5天】这段Python代码示例展示了如何解析WAV文件并检测其中的双音多频(DTMF)信号。它首先打开并读取WAV文件的内容,接着利用`numpy`和`scipy`库计算频谱图。通过定义标准的DTMF频率对,并在频谱中寻找这些特定的频率组合,从而识别出DTMF值。此代码可用于电话系统监控或音频数据分析项目中,以自动化检测和处理DTMF信号。
|
20天前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
40 0
|
20天前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
58 0

热门文章

最新文章

推荐镜像

更多