记一次 .NET 某企业内部系统 崩溃分析 - 行业资讯 -

当前位置:首页  >  行业资讯  > 正文

记一次 .NET 某企业内部系统 崩溃分析

记一次 .NET 某企业内部系统 崩溃分析
2023-06-29 05:53:16 来源:哔哩哔哩

一:背景

1. 讲故事

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

二:Windbg 分析

1. 崩溃原因是什么

如果dump中塞了异常,用 windbg 打开的时候会有一个提示 This dump file has an exception of interest stored in it,输出如下:


(资料图片)

************* Path validation summary **************Response                         Time (ms)     LocationDeferred                                       SRV*C:\mysymbols*/download/symbolsSymbol search path is: SRV*C:\mysymbols*/download/symbolsExecutable search path is: Windows 7 Version 7601 (Service Pack 1) MP (4 procs) Free x64Product: Server, suite: Enterprise TerminalServer SingleUserTSDebug session time: Wed Jun 14 13:34: 2023 (UTC + 8:00)System Uptime: 0 days 3:28: Uptime: 0 days 0:00:......................................................................................................................................................................................This dump file has an exception of interest stored in stored exception information can be accessed via .ecxr.(): Stack overflow - code c00000fd (first/second chance not available)For analysis of this file, run !analyze -vclr!SlowAllocateString+0x11:000007fe`f9236451 48c785b0fffffffeffffff mov qword ptr [rbp-50h],0FFFFFFFFFFFFFFFEh ss:00000000`123d5fd0=0000000000000000

从卦中看当前有一个 Stack overflow - code c00000fd异常,说实话好久都没看到 栈溢出了,甚是想念,既然说栈溢出了,那就看下异常前是个啥情况,使用 .excr即可。

0:028> .excr;krax=00000000123d6048 rbx=00000000123d5d70 rcx=0000000000000001rdx=0000000000000001 rsi=0000000000000000 rdi=00000000123d5880rip=000007fef9236451 rsp=00000000123d5fb0 rbp=00000000123d6020 r8=00000000ffffffff  r9=0000000000000000 r10=00000000123d618er11=0000000000000000 r12=0000000000000000 r13=0000000000000000r14=0000000000000000 r15=0000000000000001iopl=0         nv up ei pl nz na pe nccs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010200clr!SlowAllocateString+0x11:000007fe`f9236451 48c785b0fffffffeffffff mov qword ptr [rbp-50h],0FFFFFFFFFFFFFFFEh ss:00000000`123d5fd0=0000000000000000  *** Stack trace for last set context - .thread/.cxr resets it # Child-SP          RetAddr               Call Site00 00000000`123d5fb0 000007fe`f920a5bd     clr!SlowAllocateString+0x1101 00000000`123d6050 000007fe`f920a9c7     clr!StringObject::NewString+0x2502 00000000`123d6080 000007fe`f920a80d     clr!Int32ToDecStr+0xdf03 00000000`123d6320 000007fe`9ab3bb72     clr!COMNumber::FormatInt32+0x10d04 00000000`123d65f0 000007fe`9ab33e04     0x000007fe`9ab3bb7205 00000000`123d6630 000007fe`9ab3be52     0x000007fe`9ab33e0406 00000000`123d6720 000007fe`9ab3bd2a     0x000007fe`9ab3be5207 00000000`123d6790 000007fe`9ab33e35     0x000007fe`9ab3bd2a08 00000000`123d67f0 000007fe`9ab3be52     0x000007fe`9ab33e3509 00000000`123d68e0 000007fe`9ab3bd2a     0x000007fe`9ab3be52...ff 00000000`123df860 000007fe`9ab3bd2a     0x000007fe`9ab3be52

从卦中看,当前默认的 255 个栈帧全部被打满,看样子是无限死循环了,为了能看到托管部分我们改用 !clrstack命令。

0:028> !clrstackOS Thread Id: 0xbc4 (28)        Child SP               IP Call Site00000000123d63b8 000007fef9236451 [HelperMethodFrame_PROTECTOBJ: 00000000123d63b8] (Int32, , )00000000123d65f0 000007fe9ab3bb72 xxx___symbol00(Byte[])00000000123d6630 000007fe9ab33e04 xxx___symbol00(Byte[], Int64, Int64, Boolean)00000000123d6720 000007fe9ab3be52 xxx___symbol00(Int32, Int32)00000000123d6790 000007fe9ab3bd2a xxx___symbol00(Byte[], Boolean)00000000123d67f0 000007fe9ab33e35 xxx___symbol00(Byte[], Int64, Int64, Boolean)00000000123d68e0 000007fe9ab3be52 xxx___symbol00(Int32, Int32)00000000123d6950 000007fe9ab3bd2a xxx___symbol00(Byte[], Boolean)00000000123d69b0 000007fe9ab33e35 xxx___symbol00(Byte[], Int64, Int64, Boolean)00000000123d6aa0 000007fe9ab3be52 xxx___symbol00(Int32, Int32)00000000123d6b10 000007fe9ab3bd2a xxx___symbol00(Byte[], Boolean)00000000123d6b70 000007fe9ab33e35 xxx___symbol00(Byte[], Int64, Int64, Boolean)00000000123d6c60 000007fe9ab3be52 xxx___symbol00(Int32, Int32)00000000123d6cd0 000007fe9ab3bd2a xxx___symbol00(Byte[], Boolean)00000000123d6d30 000007fe9ab33e35 xxx___symbol00(Byte[], Int64, Int64, Boolean)00000000123d6e20 000007fe9ab3be52 xxx___symbol00(Int32, Int32)00000000123d6e90 000007fe9ab3bd2a xxx___symbol00(Byte[], Boolean)....000000001244db60 000007fe9ab31f0e _symbol00(, , Byte[])000000001244dbc0 000007fe9ab318e5 (, Int32, Int32, , Int32)

从卦中信息看,是代码用 Convertxxxx调用了一个第三方库,在这个库中出现了死递归。

按理说不管外界给了什么参数下去,都不应该用死递归的方式来呈现,所以这类问题可以归于 SDK 的bug,接下来我们的研究方向就是看下这个 SDK 是何方神圣?

[assembly: AssemblyCopyright("© 2008 O2 Solutions")][assembly: AssemblyProduct("PDFxxx4NET")][assembly: AssemblyCompany("O2 Solutions (/)")][assembly: AssemblyTrademark("PDFxxx4NET is a trademark of O2 Solutions")][assembly: AllowPartiallyTrustedCallers][assembly: AssemblyTitle("Print and convert PDF files to images.")][assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)][assembly: AssemblyDescription("Component for rendering pdf files on .NET platform")][assembly: AssemblyConfiguration("")][assembly: AssemblyInformationalVersion("")][assembly: AssemblyKeyName("")][assembly: AssemblyDelaySign(false)][assembly: CompilationRelaxations(8)][assembly: AssemblyVersion("")]

从卦中看还是 2008 年写的 版本,而官网早已出了 2023 年版本,也就是说 15年都没有更新,也是厉害,截图如下:

到这里就可以给到朋友答案了,让他看下能否把 PDFRender4NET升级到最新版本,按理说应该就没有问题了。

2. 为什么会栈溢出

心细的朋友可能会有一个疑问,既然都栈溢出了,按理说异常码应该是 c0000005(访问违例),怎么会是 c00000fd呢?

这是一个非常好的问题,要理解为什么是 c00000fd而不是 c0000005,需要你对栈的布局有一个比较清晰的理解,为了方便讲述,以当前的 w3wp 来绘制一张图。

画完这张图肯定有朋友会提几个反对意见:

1) 线程栈不是 1M 吗? 怎么会是 512k 呢?

这里要说的是 1M 并不是什么公理,可以在 PE 头上随便设定的,截图如下:

2)PAGE_GUARD 不是 1个内存页吗?

很多教科书都是按 1个内存页 讲述的,但这也不是定死的,也可能是多个内存页,比如 2个,5个,要想验证很简单,用 !address -f:Stack观察下便知。

0:121> !address -f:Stack        BaseAddress      EndAddress+1        RegionSize     Type       State                 Protect             Usage--------------------------------------------------------------------------------------------------------------------------       0`001f0000        0`00266000        0`00076000 MEM_PRIVATE MEM_RESERVE                                    Stack      [~0; ]       0`00266000        0`00268000        0`00002000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE | PAGE_GUARD        Stack      [~0; ]       0`00268000        0`00270000        0`00008000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     Stack      [~0; ]       ...       0`15710000        0`15788000        0`00078000 MEM_PRIVATE MEM_RESERVE                                    Stack      [~139; ]       0`15788000        0`1578d000        0`00005000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE | PAGE_GUARD        Stack      [~139; ]       0`1578d000        0`15790000        0`00003000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     Stack      [~139; ]

接下来我们聊一下什么是 PAGE_GUARD,从名字上看就是 哨兵页,说白一点就是 Windows 做 栈伸展的一种系统机制,当 rsp 访问到这个区域时会引发系统的 页中断进而 COMMIT 更多内存页,新的 Commit 页会被 哨兵侵占,同时也会让渡 RSP 所占的内存页给程序使用,这是一种良性机制,一旦 哨兵无法侵占更多新的 COMMIT 页时,也就表示栈空间已经到位了,这时候会将自身的 PAGE_GUARD标签去掉,表示它的使命已完成,如果此时 RSP 访问到了这个弥留的 哨兵区,就会抛出 c00000fd异常,这种异常只是表示 RSP 进入了 哨兵区,不代表栈空间真的用完了,所以这就是不抛 c0000005的真正原因,画个简图如下:

说了这么说,如何去验证呢?非常简单,我们提取出 StackLimit, StackBase, RSP即可。

0:028> r rsprsp=00000000123d5fb00:028> !tebTEB at 000007fffff70000    ExceptionList:        0000000000000000    StackBase:            0000000012450000    StackLimit:           00000000123d10000:028> !address -f:Stack        BaseAddress      EndAddress+1        RegionSize     Type       State                 Protect             Usage--------------------------------------------------------------------------------------------------------------------------       0`123d0000        0`123d1000        0`00001000 MEM_PRIVATE MEM_RESERVE                                    Stack      [~28; ]       0`123d1000        0`12450000        0`0007f000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     Stack      [~28; ]

标签:

(责任编辑:news01)
北京冬奥会已经开始举办人们期待 北京冬奥会已经开始

北京冬奥会已经开始举办人们期待 北京冬奥会已经开始

hello大家好,我是城乡经济网小晟来为大家解答以上问题,北京冬奥会已
06-27 08:06:01
普里戈任发声:瓦格纳注定在7月1日不复存在,我们不是为了推翻俄领导层 速看料

普里戈任发声:瓦格纳注定在7月1日不复存在,我们不是为了推翻俄领导层 速看料

都市快报综合据环球网援引法新社刚刚消息称,普里戈任在“瓦格纳”事件
06-27 07:43:14
国际货币基金组织要求欧盟各国央行积极应对通胀

国际货币基金组织要求欧盟各国央行积极应对通胀

当地时间6月26日,欧洲央行年度经济论坛在葡萄牙辛特拉开幕,国际货币
06-27 06:54:27
推广普通话内容_有哪些宣传口号

推广普通话内容_有哪些宣传口号

欢迎观看本篇文章,小升来为大家解答以上问题。推广普通话内容,有哪些
06-27 05:56:07
服务器操作系统报价_服务器操作系统有哪些|全球时快讯

服务器操作系统报价_服务器操作系统有哪些|全球时快讯

1、服务器系统是什么服务器系统是指安装在网站服务器上的系统(操作系
06-27 03:53:06
【全球新视野】南通崇川新城桥街道:赓续文化传承 增强文化自信

【全球新视野】南通崇川新城桥街道:赓续文化传承 增强文化自信

中国江苏网6月26日南通讯中华优秀传统文化是中华民族的根和魂。如何让
06-27 01:12:48
三达膜回应“总经理女儿高考喜报”:人文关怀,内控合规没有问题 前沿资讯

三达膜回应“总经理女儿高考喜报”:人文关怀,内控合规没有问题 前沿资讯

三达膜回应“总经理女儿高考喜报”:人文关怀,内控合规没有问题,三达
06-26 23:18:10
旧改、新盘双停滞,合景泰富又遇到了“拦路虎” 环球时快讯

旧改、新盘双停滞,合景泰富又遇到了“拦路虎” 环球时快讯

旧改、新盘双停滞,合景泰富又遇到了“拦路虎”,地王,新盘,李嘉诚,合景
06-26 22:01:59
重庆市级“专精特新”企业新增1366家 今年出诊断报告推动数字化转型

重庆市级“专精特新”企业新增1366家 今年出诊断报告推动数字化转型

6月25日,重庆市经济信息委公布了2023年度市级专精特新企业入选名单,
06-26 21:35:07
国家气候中心:今年以来我国高温过程出现时间早、影响范围广、极端性强

国家气候中心:今年以来我国高温过程出现时间早、影响范围广、极端性强

今年以来,我国高温日数比常年同期偏多1 7天,为1961年以来历史同期最
06-26 20:43:19
什么是心机女的表现(什么是心机)

什么是心机女的表现(什么是心机)

么是心机女的表现,什么是心机这个问题很多朋友还不知道,来为大家解答
06-26 19:52:04
京津冀三地开展二级建造师执业互认|微速讯

京津冀三地开展二级建造师执业互认|微速讯

据河北省住房和城乡建设厅26日消息,为进一步服务企业跨地区发展,
06-26 19:33:45
广州首批“金融村官”领证上岗,进驻花都6镇10村 环球热消息

广州首批“金融村官”领证上岗,进驻花都6镇10村 环球热消息

广州首批“金融村官”领证上岗,进驻花都6镇10村,领证,花都区,广州市,
06-26 18:53:52
定了!8月底开工,总投资1600万元,广元这个广场……

定了!8月底开工,总投资1600万元,广元这个广场……

刚刚发布!四川省2023年普通高考文科成绩分段统计表出炉!刚刚发布!四
06-26 18:29:28
“有喜事分享有什么错?”三达膜董事长回应祝贺高管女儿获高考状元-即时

“有喜事分享有什么错?”三达膜董事长回应祝贺高管女儿获高考状元-即时

央广网北京6月26日消息(记者李墨轩)“三达人有喜事,分享有什么错?
06-26 17:48:48
当前热门:民乐:文旅产业赋能县域经济高质量发展

当前热门:民乐:文旅产业赋能县域经济高质量发展

民乐县以“三抓三促”行动为抓手,按照“全区域谋划、全产业联动、全要
06-26 17:14:59
当前速读:花粉女孩会注意到种子。

当前速读:花粉女孩会注意到种子。

导读1、花粉少女注意报漫画倒是有动漫我也在找学院姐妹的动漫是有。2、
06-26 17:10:13
当前焦点!东方电热:预镀镍材料动力类客户材料性能验证已基本完成

当前焦点!东方电热:预镀镍材料动力类客户材料性能验证已基本完成

2023年6月26日,东方电热(300217 SZ)在接受机构调研时表示,预镀镍材料
06-26 16:57:06
英雄联盟补丁是干嘛的 lol补丁有什么用值得我们下吗-当前头条

英雄联盟补丁是干嘛的 lol补丁有什么用值得我们下吗-当前头条

1、游戏补丁,要么是对游戏的更新,比如更新某些场景、添加新的地图、
06-26 16:02:32
有氧格斗_对于有氧格斗简单介绍|环球今热点

有氧格斗_对于有氧格斗简单介绍|环球今热点

1、有氧格斗是一项与格斗技巧有着密切关系的运动,它结合了拳击、跆拳
06-26 15:54:27
景福集团涨近30%创逾1年半新高 年度归母溢利同比增长逾三成

景福集团涨近30%创逾1年半新高 年度归母溢利同比增长逾三成

景福集团(00280)涨近30%,高见0 47港元创2021年11月以来新高。截至发稿
06-26 15:13:08
消息称盒马最快11月赴港IPO,未来两周或申请分拆,将成阿里改组分拆后首个完成上市的公司 热点在线

消息称盒马最快11月赴港IPO,未来两周或申请分拆,将成阿里改组分拆后首个完成上市的公司 热点在线

据港媒报道,阿里巴巴旗下盒马、菜鸟及阿里云启动上市计划,现时收入已
06-26 14:53:49
逆水寒手游官网地址在哪-逆水寒手游官网入口链接

逆水寒手游官网地址在哪-逆水寒手游官网入口链接

逆水寒手游官网预约游戏可以获得不错的预约奖励,这是玩家上半年热度很
06-26 13:53:52
20岁中国姑娘获高尔夫大满贯冠军 天天百事通

20岁中国姑娘获高尔夫大满贯冠军 天天百事通

北京时间6月26日,女子高尔夫年度第二场大满贯赛事——女子PGA锦标赛结
06-26 13:17:42
中国选手殷若宁夺高尔夫大满贯赛事冠军! 世界微动态

中国选手殷若宁夺高尔夫大满贯赛事冠军! 世界微动态

今天清晨,美国新泽西,高尔夫大满贯赛事——女子PGA锦标赛决胜轮,中
06-26 12:48:45
讯息:尼山对话|一组海报了解盛会四个“看点”

讯息:尼山对话|一组海报了解盛会四个“看点”

舜网山东频道是山东新闻权威发布平台,及时发布山东17地市新闻。
06-26 11:56:12
天天微速讯:河南南阳:中心城区买首套新房契税补贴50%

天天微速讯:河南南阳:中心城区买首套新房契税补贴50%

河南省南阳市人民政府网站消息,6月20日,南阳市在支持中心城区刚需和
06-26 11:13:17
扎克伯格和布雷顿会晤 共同探讨政府评估AI风险和监管AI技术发展 环球速看

扎克伯格和布雷顿会晤 共同探讨政府评估AI风险和监管AI技术发展 环球速看

【ITBEAR科技资讯】6月25日消息,Meta公司负责人马克·扎克伯格(MarkZu
06-25 16:24:17
邮储银行中山市分行落地全市首笔“个人汽车消费贷+数字人民币”业务|焦点播报

邮储银行中山市分行落地全市首笔“个人汽车消费贷+数字人民币”业务|焦点播报

在人民银行中山市中心支行的指导下,邮储银行中山市分行于6月15日成功
06-25 16:00:50
焦点速读:小儿肠系膜淋巴结炎怎么治疗

焦点速读:小儿肠系膜淋巴结炎怎么治疗

1、问:我女儿偶尔叫肚子痛有段时间去儿童医院检查B超显示肠系膜淋巴结
06-25 15:09:32

为您推荐

精彩推送