记一次 .NET某质量检测中心系统 崩溃分析
一:背景
1. 讲故事
这些天有点意思,遇到的几个程序故障都是和Windows操作系统或者第三方组件有关系,真的有点无语,今天就带给大家一例 IIS 相关的与大家分享,这是一家国企的.NET程序,出现了崩溃急需分析。
二:WinDbg 分析
1. 为什么会崩溃
崩溃原因相对还是好找的,双击dump文件之后错误信息马上就列出来了,参考如下:
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(3950.1890): Stack overflow - code c00000fd (first/second chance not available)
For analysis of this file, run !analyze -v
eax=72ae2290 ebx=00000000 ecx=72afa1c0 edx=00000000 esi=72afa1c0 edi=01cb1d7c
eip=72afa1e6 esp=3e673000 ebp=3e673010 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010246
iiscore+0x1a1e6:
72afa1e6 ff15a064b172 call dword ptr [iiscore!GetProtocolManager+0x9370 (72b164a0)] ds:002b:72b164a0=72af5ab0
从卦中的 Stack overflow - code c00000fd
来看,这又是一个经典的栈溢出导致的崩溃,这里栈溢出崩溃的原理就不说了,接下来观察下是什么代码导致的,难道又是一个死循环吗?
2. 到底是谁诱导的
要想找到是谁诱导的,肯定要看下顶层代码是什么,使用 k 0xffff
即可。
2732 3e6adcc0 72afa1f0 iiscore+0x1a1f0
2733 3e6adcd8 72afa1f0 iiscore+0x1a1f0
2734 3e6adcf0 72afa1f0 iiscore+0x1a1f0
2735 3e6add08 72afa1f0 iiscore+0x1a1f0
2736 3e6add20 72afa1f0 iiscore+0x1a1f0
2737 3e6add38 72afa1f0 iiscore+0x1a1f0
...
273e 3e6ade8c 734e8a9b webengine4!W3_MGD_HANDLER::ReadEntityBody+0x134
273f 3e6adeac 60251594 webengine4!MgdReadEntityBody+0x5b
...
2762 3e6aed0c 601fecc3 System_Web_ni+0x231941
2763 3e6aee00 601fe80f System_Web_ni+0x1decc3
2764 3e6aee28 028fe29a System_Web_ni+0x1de80f
2765 3e6aee48 72cbfa41 0x28fe29a
2766 3e6aeea8 72cbf972 clr!UM2MThunk_Wrapper+0x76
...
276a 3e6af024 7348ab83 webengine4!W3_MGD_HANDLER::ProcessNotification+0x62
276b 3e6af038 72b3bc52 webengine4!ProcessNotificationCallback+0x33
从卦象看,它的走势大概是 托管 -> webengine4 -> iiscore
,然后就死掉了,很显然 iiscore 是 iis 的核心组件,可以用 lmvm 观察下。
0:087> lmvm iiscore
Browse full module list
start end module name
72ae0000 72b1f000 iiscore (export symbols) iiscore.dll
Loaded symbol image file: iiscore.dll
Image path: C:\Windows\System32\inetsrv\iiscore.dll
Image name: iiscore.dll
Browse all global symbols functions data
Timestamp: Fri Sep 8 11:04:45 2023 (64FA8F4D)
CheckSum: 00042ABA
ImageSize: 0003F000
File version: 8.5.9600.21613
Product version: 8.5.9600.21613
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0000.04b0
Information from resource tables:
CompanyName: Microsoft Corporation
ProductName: Internet Information Services
InternalName: iiscore.dll
OriginalFilename: iiscore.dll
ProductVersion: 8.5.9600.21613
FileVersion: 8.5.9600.21613 (winblue_ltsb.230907-1700)
FileDescription: IIS Web Server Core
LegalCopyright: Microsoft Corporation. All rights reserved.
其实到这里就有很大的好奇心,到底是什么代码这么厉害,能导致底层的 iiscore 死循环,可以使用 !clrstack
观察下托管栈。
0:087> !clrstack
OS Thread Id: 0x1890 (87)
Child SP IP Call Site
3e6aded4 72afa1e6 [InlinedCallFrame: 3e6aded4]
3e6aded0 60251594 DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, Byte[], Int32, Int32, Boolean, Int32 ByRef, IntPtr ByRef)
3e6aded4 60250906 [InlinedCallFrame: 3e6aded4] System.Web.Hosting.UnsafeIISMethods.MgdReadEntityBody(IntPtr, Byte[], Int32, Int32, Boolean, Int32 ByRef, IntPtr ByRef)
3e6adf28 60250906 System.Web.Hosting.IIS7WorkerRequest.ReadEntityCoreSync(Byte[], Int32, Int32)
3e6adf64 602508b9 System.Web.Hosting.IIS7WorkerRequest.ReadEntityBody(Byte[], Int32)
3e6adf74 6020dcfc System.Web.HttpRequest.GetEntireRawContent()
3e6adfa0 6020cc50 System.Web.HttpRequest.FillInFormCollection()
3e6adfdc 6020ebb6 System.Web.HttpRequest.EnsureForm()
3e6adfec 6020eb3e System.Web.HttpRequest.get_Form()
3e6adff8 2e17391e xxx.RequestFilterModule.CheckRequest()
接下来观察托管层的 CheckRequest()
的链路,截图如下:
这简直太不可思议了,一句平常无奇的 base.Request.Form != null
代码,居然把IIS给弄崩掉了,很显然问题大概率不在 托管层。
3. iiscore 在执行什么死循环
托管层这条路断了之后,接下来在回头观察 iiscore 处的汇编代码,截图如下:
由于没有 iiscore 的源代码,也没有做复原的必要,但不管怎么样,可以看到这地方确实存在着死循环,我们在用户态没法去做修补,最后看下当前系统情况。
0:087> vertarget
Windows 8.1 Version 9600 MP (8 procs) Free x86 compatible
Product: Server, suite: TerminalServer SingleUserTS
Edition build lab: 6.3.9600.18217 (winblue_ltsb.160124-0053)
Debug session time: Tue Mar 19 10:00:33.000 2024 (UTC + 8:00)
System Uptime: 46 days 1:32:14.541
Process Uptime: 0 days 19:11:55.000
Kernel time: 0 days 0:06:09.000
User time: 0 days 0:14:38.000
可以看到当前是 Windows Server 2012 R2,跑的是 IIS 8.5 ,由于 IIS 是强绑到 Windows的,所以能给到的建议就是:
- 使用
SFC /SCANNOW
检修下系统文件,这是某软 CSS 的那帮人最喜欢用的命令 O(∩_∩)O - 升级操作系统,提升 IIS 的版本。
三:总结
有时候程序崩溃往往不是你代码写的烂,极有可能是底层承载的bug导致的,甚至罪魁祸首是环境中的辐射,所以分析崩溃类的dump也挺玄学的,以后程序出问题第一时间不要大包大揽的往自己身上背,找出问题才是关键。
记一次 .NET某质量检测中心系统 崩溃分析的更多相关文章
- 记一次 .NET 某企业 ERP网站系统 崩溃分析
一:背景 1. 讲故事 前段时间收到了一个朋友的求助,说他的ERP网站系统会出现偶发性崩溃,找了好久也没找到是什么原因,让我帮忙看下,其实崩溃好说,用 procdump 自动抓一个就好,拿到 dump ...
- 记一次 .NET 某自动化集采软件 崩溃分析
一:背景 1.讲故事 前段时间有位朋友找到我,说他的程序在客户的机器上跑着跑着会出现偶发卡死,然后就崩掉了,但在本地怎么也没复现,dump也抓到了,让我帮忙看下到底怎么回事,其实崩溃类的dump也有简 ...
- 记一次 .NET 某医疗住院系统 崩溃分析
一:背景 1. 讲故事 最近收到了两起程序崩溃的dump,查了下都是经典的 double free 造成的,蛮有意思,这里就抽一篇出来分享一下经验供后面的学习者避坑吧. 二:WinDbg 分析 1. ...
- 记一次 .NET 某工控MES程序 崩溃分析
一:背景 1.讲故事 前几天有位朋友找到我,说他的程序出现了偶发性崩溃,已经抓到了dump文件,Windows事件日志显示的崩溃点在 clr.dll 中,让我帮忙看下是怎么回事,那到底怎么回事呢? 上 ...
- 记一次 .NET某医疗器械清洗系统 卡死分析
一:背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题,回过头来看这个案例比较经典,这篇稍微整理一下供后来者少踩坑吧. 二:WinDbg 分析 1. 为什么会卡死 因为是窗体程 ...
- FME之于规划CAD数据质量检测
最近琢磨规划CAD数据转换入库GIS方面的技术问题,看过一些前辈的文章/文献,对于使用FME WorkBench方面,有了一些了解,往往直接转换数据丢失比较严重,而且GIS对图形属性和空间拓扑比较严格 ...
- 代码质量检测-Sonar
一. Sonar简介 sonarqube系统是一个代码质量检测工具 由以下四个组件组成(https://docs.sonarqube.org/display/SONAR/Architecture+an ...
- 银行卡检测中心BCTC
BCTC是Banking Card Test Center的缩写. 银行卡检测中心(下称中心)经中国人民银行总行批准成立于1998年4月,作为一个独立的第三方专业技术检测机构,其主要职责是按照国际.国 ...
- Java代码规范与质量检测插件SonarLint
1. SonarLint SonarLint是一个代码质量检测插件,可以帮助我们检测出代码中的坏味道 下载与安装 在需要检测的单个文件或者单个项目上右键 --> Analyze --> ...
- 如何做好SQLite 使用质量检测,让事故消灭在摇篮里
本文由云+社区发表 SQLite 在移动端开发中广泛使用,其使用质量直接影响到产品的体验. 常见的 SQLite 质量监控一般都是依赖上线后反馈的机制,比如耗时监控或者用户反馈.这种方式问题是: 事后 ...
随机推荐
- nginx 如何代理websocket
前言 下面是配置nginx websocket 的代码. # HTTPS server map $http_upgrade $connection_upgrade { default upgrade; ...
- 笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2
对应于其强大的能力,大语言模型 (LLM) 需要强大的算力支撑,而个人计算机上很难满足这一需求.因此,我们别无选择,只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上. 为何需要将 LL ...
- IaC:实现持续交付和 DevOps 自动化的关键
基础架构即代码(IaC)和 CI/CD 流水线最初似乎并不匹配.因为它们代表了两种不同的流程.IaC 主要关注基础设施的配置和开发,而 CI/CD 则围绕软件开发.测试和部署. 然而,将 IaC 集成 ...
- pid算法函数实现,c语言版
#include <stdio.h> float pid(float setpoint, float process_variable, float kp, float ki, float ...
- async与await暂停作用
1. async function Request () { await new Promise(res => { setTimeout(() => { console.log(1) re ...
- Java集成系列:高效构建自定义插件
前言 随着软件开发的快速发展和需求的不断增长,开发人员面临着更多的压力和挑战.传统的开发方法需要花费大量的时间和精力,而低代码开发平台的出现为开发人员提供了一种更加高效.快速的开发方式.今天小编就以构 ...
- 第三課:信道学习Source Connect Reader & Destinations File Writer
第一步: 切换到主信道(Channels)界面,右键点击新建信道(New Channel) 第二步 : 下面是设置一些信道概要(Summary)信息 其中summary(概要) 界面主要包含 信道名称 ...
- 基于链路思想的SpringBoot单元测试快速写法
简介:本文更偏向实践而非方法论,所提及的SpringBoot单元测试写法亦并非官方解,仅仅是笔者自身觉得比较方便.效率较高的一种写法.每个团队甚至团队内的每位开发可能都有自己的写法习惯和风格,只要能 ...
- 走近Quick Audience,了解消费者运营产品的发展和演变
简介: Quick Audience产品是一款云原生面向消费者的营销产品,自诞生以来,经历了三个发展阶段.每个阶段的转变,都与互联网环境和消费者行为的变迁有着极大的关联. Quick Audien ...
- [GPT] 哪些职业面临 AI 威胁?
随着人工智能技术的不断发展和应用,一些重复性.机械化或标准化程度高的职业可能会面临被自动化取代的威胁.例如: 工厂生产线上的装配工人,因为许多工厂已经开始使用自动化机器人完成装配任务: 行政助理, ...