这段时间,遇到了一些有趣的情况,遇到的几个程序故障都与Windows操作系统或第三方组件有关。今天我要和大家分享的是一家国企的.NET程序出现了崩溃急需分析的案例。
崩溃原因相对来说是比较好找的。双击dump文件之后,错误信息很快就列出来了。根据错误信息显示的内容,该程序崩溃的原因是栈溢出导致的。接下来需要观察是什么代码导致的崩溃,是否涉及死循环等问题。
要想找到是谁诱导的,肯定要看下顶层代码是什么。使用
k 0xffff
即可。
从顶层代码的调用链来看,程序的走势大概是托管 -> webengine4 -> iiscore,然后就死掉了。很显然iiscore是iis的核心组件。进一步观察iiscore并使用
lmvm iiscore
观察下。
到这里就有很大的好奇心了,想了解是什么样的代码导致了底层的iiscore进入死循环。可以使用
!clrstack
观察下托管栈。
接下来观察托管层的
CheckRequest()
的链路。这简直太不可思议了,一句平常无奇的
base.Request.Form != null
代码,居然导致了IIS的崩溃。问题大概率不在托管层。
托管层这条路断了之后,接下来回头观察iiscore处的汇编代码。由于没有iiscore的源代码,也没有做复原的必要,但不管怎么样,可以看到这地方确实存在着死循环。
最后看下当前系统情况。当前是Windows Server 2012 R2,跑的是IIS 8.5。由于IIS是强绑到Windows的,所以能给到的建议就是:使用
SFC /SCANNOW
检修下系统文件,或者升级操作系统提升IIS的版本。
有时候程序崩溃往往不是你代码写的烂,极有可能是底层承载的bug导致的,甚至罪魁祸首是环境中的辐射。分析崩溃类的dump也挺玄学的。以后程序出问题第一时间不要大包大揽的往自己身上背,找出问题才是关键。
未经允许不得转载:大白鲨游戏网 » 软件故障分析:Windows操作系统及第三方组件问题