记一次应用程序池崩溃问题分析

这篇具有很好参考价值的文章主要介绍了记一次应用程序池崩溃问题分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题现象:

IIS部署的asp.net core服务,前端进行一些操作后,经常需要重新登陆系统。

初步分析:

根据日志,可以看到服务重新进行了初始化,服务重启应该与IIS应用程序池回收有关,查看IIS相关日志,在windows的事件查看器=>Windows日志=>系统,来源为WAS的日志(参考博客)。

根据IIS日志与服务日志对比发现,每次服务重启对应一次WAS警告信息,详细信息为:“为应用程序池“xxx”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“xxx”。数据字段包含错误号。”。说明应用程序池异常崩溃后重启了。

抓取dump分析

为了找到程序池崩溃的原因,抓取dump进行分析,如何抓取dump见文档,使用DebugDiag工具进行抓取,抓取后使用DebugDiag进行初步分析,如下图:
记一次应用程序池崩溃问题分析

可以看出是线程池中的线程抛出了异常,应为异步代码导致,但没有指出具体引发异常的服务代码。尝试使用WinDbg进行进一步分析,然而并不能看懂卦象,进行了一波操作后并没有找到问题原因。

反编译调试

由于dump的分析报告没有给出根本原因,也不熟悉如何深入分析dump,因此换个思路,通过测试找到了问题必现的某个请求操作后,尝试进行反编译调试,看能不能找到引发异常的根本原因。为什么不直接用VS调试呢,因为出问题的项目请求代码没看出来啥问题,本地也没有复现。公司框架代码看不到源码,框架近期进行了大的修改,怀疑框架代码导致的问题。因此模拟环境进行反编译调试,应该更容易找到问题原因。

首先创建虚拟机,部署服务,搭建测试环境,与生产环境保持一致。然后使用dnSpy工具反编译调试,将项目文件拖到dnSpy中,调试-附加到进程(w3wp),打断点进行跟踪。

然而进行了多次调试操作后,因为异常是在某个线程中触发的,并没有跟踪到异常产生的位置。结合dump分析结果给出的信息,尝试在一些异步的操作位置打断点,也没有跟踪到导致程序池崩溃的异常。

排除法

进行了多次反编译调试后,没发现原因,因此重新梳理思路,采用排除法继续测试。将可疑的代码片段注释掉,然后编译放到测试环境中进行调试。经过几次测试,锁定了导致崩溃的代码片段。跟踪这段代码,发现了一个空指针异常。其实这个异常在反编译调试的时候就发现了,抛出后clr捕获了异常,请求继续往下走,请求走完后又在clr代码中抛出了异常,然后程序池挂掉。现在锁定了就是这段代码导致,需要进一步查看代码分析为什么会导致应用程序池崩溃。

通过反编译调试获取导致异常的条件后,在本地进行模拟复现。发现异常首次出现后,程序继续运行,当请求结束后,又回到了异常出现的位置,然后崩溃。仔细检查这段代码,发现竟然使用了async void...

异常模拟

熟悉C#异步编程的都知道,应避免使用async void,返回void是为了支持异步事件处理程序,参见官方文档。当async Task或async Task方法引发异常时,会捕获该异常并将其置于Task对象上。 对于async void方法,没有Task对象,因此async void方法引发的任何异常都会直接在SynchronizationContext(在 async void 方法启动时处于活动状态)上引发。来自async void方法的异常无法使用catch捕获,因为不是同一个线程引发的异常。通过调试可以发现,第一次异常抛出时是在当前线程,Task内部捕获了该异常,因此请求继续执行。第二次异常抛出是在其它线程中,由于异常没有处理,导致程序崩溃。

异常模拟如下,项目中异常引发的位置非常隐蔽,因此很难发现:

try
{
    TestAsyncVoid();
}
catch(Exception ex)
{
    Console.WriteLine(ex);
}

async void TestAsyncVoid()
{
    throw new Exception("------------test-------------");
}

运行截图如下:
记一次应用程序池崩溃问题分析

总结与反思

之所以导致应用程序池崩溃,需要具备如下条件:

  • 使用了async void;
  • 在async void内部出现了异常且没有处理;

应避免使用async void,只有在异步事件处理时才返回void,否则应该返回Task或Task。async void引发的异常catch捕获不到,可以在AppDomain.CurrentDomain.UnhandledException中获取到异常打印异常信息。

此次应用程序池崩溃问题处理耗费了一天多的时间,复盘下问题分析的过程,如果一开始就把注意力放在引起程序崩溃的请求代码上,应该会更快的发现问题。但是之前同事通过修改IIS应用程序池配置,阴差阳错的修复了一个导致崩溃的请求。而且公司框架代码进行过大的调整,导致分析方向出现了错误,关注点放在了公司框架代码上。反编译调试的时候,其实已经发现了项目代码有异常,但认为这种异常不会导致崩溃,且请求继续执行了,因此依然没意识到方向错了。最后通过排除法发现,问题出在项目代码上,才找到根本原因。因此,分析问题的过程中,当发现方向可能不对时,应停下来重新整理信息,梳理思路,从最直接的起因入手进行分析,可以更快的解决问题。文章来源地址https://www.toymoban.com/news/detail-761585.html

到了这里,关于记一次应用程序池崩溃问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次 Windows10 内存压缩模块 崩溃分析

    在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相对缺乏,分析起来并不是那么的顺利,今天就聊一个 Windows 崩溃的内核dump 吧,这个 dump 是前几天有位朋友给到我的

    2023年04月26日
    浏览(39)
  • 记一次 .NET 某企业内部系统 崩溃分析

    前些天有位朋友找到我,说他的程序跑着跑着就崩溃了,让我看下怎么回事,其实没怎么回事,抓它的 crash dump 就好,具体怎么抓也是被问到的一个高频问题,这里再补一下链接: [.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月10日
    浏览(53)
  • 记一次 .NET某股票交易软件 灵异崩溃分析

    在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过 宇宙射线 导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的 列控连锁一体化 程序,所以更加让我确定这是由于 电离辐射 干扰了计算机的 数字信号 导致程

    2024年02月04日
    浏览(43)
  • 记一次 .NET某列控连锁系统 崩溃分析

    过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧。 去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答案,让我看看有没有什么线索,看样子这是一个牛皮藓的问题,既然对方有了

    2024年02月21日
    浏览(55)
  • 记一次 .NET 某埋线管理系统 崩溃分析

    经常有朋友跟我反馈,说看你的文章就像看天书一样,有没有一些简单入手的dump 让我们先找找感觉,哈哈,今天就给大家带来一篇入门级的案例,这里的入门是从 WinDbg 的角度来阐述的,这个问题如果你通过 记日志,分析代码 的方式,可能真的无法解决,不信的话继续往下

    2024年02月11日
    浏览(54)
  • 记一次 .NET某炉膛锅炉检测系统 崩溃分析

    上个月有个朋友在微信上找到我,说他们的软件在客户那边隔几天就要崩溃一次,一直都没有找到原因,让我帮忙看下怎么回事,确实工控类的软件环境复杂难搞,朋友手上有一个崩溃的dump,刚好丢给我来分析一下。 windbg 有一个厉害之处在于双击之后可以帮你自动定位到崩

    2024年04月17日
    浏览(54)
  • 记一次 .NET 某旅行社审批系统 崩溃分析

    前些天有位朋友找到我,说他的程序跑着跑着就崩溃了,让我看下怎么回事,其实没怎么回事,抓它的 crash dump 就好,具体怎么抓也是被问到的一个高频问题,这里再补一下链接: [.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月09日
    浏览(46)
  • windows11 出现SearchHost.exe应用程序崩溃事件原因分析

    3月15日之后,点击搜索框的时候总是卡顿,点不开,查看系统事件,发现系统出现上万条的SearchHost.exe事件。参照微软网站上的回复,重建了索引,重装了应用都不能解决问题。鉴于之前没有出现过这个问题,于是把最近安装的软件全部卸载,依然没解决问题。 最后怀疑是系

    2024年02月11日
    浏览(71)
  • 记一次 .NET某新能源检测系统 崩溃分析

    前几天有位朋友微信上找到我,说他的程序会偶发性崩溃,一直找不到原因,让我帮忙看一下怎么回事,对于这种崩溃类的程序,最好的办法就是丢dump过来看一下便知,话不多说,上windbg说话。 对于一个崩溃类的dump,寻找崩溃点非常重要,常用的命令就是 !analyze -v ,输出如

    2024年02月08日
    浏览(48)
  • 记一次 .NET 某新能源材料检测系统 崩溃分析

    上周有位朋友找到我,说他的程序经常会偶发性崩溃,一直没找到原因,自己也抓了dump 也没分析出个所以然,让我帮忙看下怎么回事,那既然有 dump,那就开始分析呗。 一直跟踪我这个系列的朋友应该知道分析崩溃第一个命令就是 !analyze -v ,让windbg帮我们自动化异常分析。

    2024年02月05日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包