记一次 Windows10 内存压缩 崩溃分析-世界聚焦
在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相对缺乏,分析起来并不是那么的顺利,今天就聊一个Windows崩溃的内核dump 吧,这个 dump 是前几天有位朋友给到我的,让我帮忙看一下,有了dump之后上 windbg 分析。
二:WinDbg 分析1. 从哪里入手只要是 Windows 平台上的崩溃,操作系统都会维护一个EXCEPTION_POINTERS结构体,这个结构体的解读对分析问题非常重要,使用!analyze -v命令简要输出如下:
2: kd> !analyze -v******************************************************************************** ** Bugcheck Analysis ** ********************************************************************************UNEXPECTED_STORE_EXCEPTION (154)The store component caught an unexpected exception.Arguments:Arg1: ffffb402b9851000, Pointer to the store context or data managerArg2: ffffe607bc53df30, Exception informationArg3: 0000000000000002, ReservedArg4: 0000000000000000, Reserved...EXCEPTION_RECORD: ffffe607bc53eeb8 -- (.exr 0xffffe607bc53eeb8)ExceptionAddress: fffff80025b04bd0 (nt!RtlDecompressBufferXpressLz+0x0000000000000050) ExceptionCode: c0000006 (In-page I/O error) ExceptionFlags: 00000000NumberParameters: 3 Parameter[0]: 0000000000000000 Parameter[1]: 0000023f30ee99f0 Parameter[2]: 00000000c0000185Inpage operation failed at 0000023f30ee99f0, due to I/O error 00000000c0000185EXCEPTION_PARAMETER1: 0000000000000000EXCEPTION_PARAMETER2: 0000023f30ee99f0CONTEXT: ffffe607bc53e6f0 -- (.cxr 0xffffe607bc53e6f0)rax=fffff80025b04b80 rbx=ffff9d808d7fa000 rcx=ffff9d808d7fa000rdx=ffff9d808d7fa000 rsi=0000000000000002 rdi=0000023f30ee99f0rip=fffff80025b04bd0 rsp=ffffe607bc53f0f8 rbp=0000023f30eea2fe r8=0000023f30ee99f0 r9=0000000000000964 r10=ffff9d808d7faea0r11=0000023f30eea354 r12=ffffe607bc53f368 r13=ffffb402d84d8000r14=ffff9d808d7fb000 r15=0000000000000000iopl=0 nv up ei pl zr na po nccs=0010 ss=0000 ds=002b es=002b fs=0053 gs=002b efl=00050246nt!RtlDecompressBufferXpressLz+0x50:fffff800`25b04bd0 418b08 mov ecx,dword ptr [r8] ds:002b:0000023f`30ee99f0=????????Resetting default scope...
从卦中信息看,是由于将地址0000023f30ee99f0所映射的物理内存页换入到内存中,抛了一个IO错误,从汇编指令ecx,dword ptr [r8] ds:002b:0000023f30ee99f0=????????上也能看的出来。
(资料图)
如果大家不信,可以用!vtop和!pte观察下它们对应的物理地址和物理页号,都是找不到的。
2: kd> !vtop 0 000000006d34aca0Amd64VtoP: Virt 000000006d34aca0, pagedir 00000003d81fb002Amd64VtoP: PML4E 00000003d81fb002Amd64VtoP: PML4E read error 0x8000FFFFVirtual address 6d34aca0 translation fails, error 0x8000FFFF.2: kd> !pte 000000006d34aca0 VA 000000006d34aca0PXE at FFFF86432190C000 PPE at FFFF864321800008 PDE at FFFF864300001B48 PTE at FFFF860000369A50contains 0000000000000000contains 0000000000000000not valid
2. 洞察异常前的线程栈有了这个初步信息之后,接下来就来观察异常时的寄存器上下文和线程栈信息,输出如下:
2: kd> .cxr 0xffffe607bc53e6f0 ; krax=fffff80025b04b80 rbx=ffff9d808d7fa000 rcx=ffff9d808d7fa000rdx=ffff9d808d7fa000 rsi=0000000000000002 rdi=0000023f30ee99f0rip=fffff80025b04bd0 rsp=ffffe607bc53f0f8 rbp=0000023f30eea2fe r8=0000023f30ee99f0 r9=0000000000000964 r10=ffff9d808d7faea0r11=0000023f30eea354 r12=ffffe607bc53f368 r13=ffffb402d84d8000r14=ffff9d808d7fb000 r15=0000000000000000iopl=0 nv up ei pl zr na po nccs=0010 ss=0000 ds=002b es=002b fs=0053 gs=002b efl=00050246nt!RtlDecompressBufferXpressLz+0x50:fffff800`25b04bd0 418b08 mov ecx,dword ptr [r8] ds:002b:0000023f`30ee99f0=???????? *** Stack trace for last set context - .thread/.cxr resets it # Child-SP RetAddr Call Site00 ffffe607`bc53f0f8 fffff800`25a5bc10 nt!RtlDecompressBufferXpressLz+0x5001 ffffe607`bc53f110 fffff800`25a5bb14 nt!RtlDecompressBufferEx+0x6002 ffffe607`bc53f160 fffff800`25a5b9a1 nt!ST_STORE::StDmSinglePageCopy+0x15003 ffffe607`bc53f220 fffff800`25b56ff0 nt!ST_STORE::StDmSinglePageTransfer+0xa504 ffffe607`bc53f270 fffff800`25b57904 nt!ST_STORE::StDmpSinglePageRetrieve+0x18005 ffffe607`bc53f310 fffff800`25b57aed nt!ST_STORE::StDmPageRetrieve+0xc806 ffffe607`bc53f3c0 fffff800`25a5c071 nt!SMKM_STORE::SmStDirectReadIssue+0x8507 ffffe607`bc53f440 fffff800`25aad478 nt!SMKM_STORE::SmStDirectReadCallout+0x2108 ffffe607`bc53f470 fffff800`25a5cb57 nt!KeExpandKernelStackAndCalloutInternal+0x7809 ffffe607`bc53f4e0 fffff800`25a5713c nt!SMKM_STORE::SmStDirectRead+0xc70a ffffe607`bc53f5b0 fffff800`25a56b70 nt!SMKM_STORE::SmStWorkItemQueue+0x1ac0b ffffe607`bc53f600 fffff800`25b58727 nt!SMKM_STORE_MGR::SmIoCtxQueueWork+0xc00c ffffe607`bc53f690 fffff800`25b2b94b nt!SMKM_STORE_MGR::SmPageRead+0x1670d ffffe607`bc53f700 fffff800`25ad1020 nt!SmPageRead+0x330e ffffe607`bc53f750 fffff800`25ad023d nt!MiIssueHardFaultIo+0x10c0f ffffe607`bc53f7a0 fffff800`25a6e818 nt!MiIssueHardFault+0x29d10 ffffe607`bc53f860 fffff800`25c0b6d8 nt!MmAccessFault+0x46811 ffffe607`bc53fa00 00007ff8`c3089fa2 nt!KiPageFault+0x35812 00000067`4ca7f270 00000000`00000000 0x00007ff8`c3089fa2
从卦中的调用栈信息看,代码的源头是用户态 (0x00007ff8c3089fa2)过来的,应该是访问用户态地址0000023f30ee99f0上的内容,由于对应的物理页不在内存中,触发了nt!KiPageFault中断,也就是 idt 表中的0xe号标记的 缺页中断, 输出如下:
lkd> !idtDumping IDT: fffff8050ce8700000: fffff80506206400 nt!KiDivideErrorFault...0e: fffff80506209980 nt!KiPageFault
在缺页中断中触发了 IO 操作MiIssueHardFaultIo要从pagefiles 中捞页面,接下来就是页读取逻辑SmPageRead,最后在RtlDecompressBufferXpressLz中引发了蓝屏。
如果心比较细的话,你会发现有一个关键词Decompress,对,就是解压缩,为什么换入的page还要解压缩呢?这就是我们的突破点。
3. 为什么会解压缩要找到这个问题的答案,需要观察下这个异常线程的详细信息,可以用.thread切到异常的线程上下文,再用!thread观察。
2: kd> .threadImplicit thread is now ffffb402`be04a0802: kd> !thread ffffb402`be04a080THREAD ffffb402be04a080 Cid 0594.2228 Teb: 000000674c5b8000 Win32Thread: 0000000000000000 RUNNING on processor 2Not impersonatingGetUlongFromAddress: unable to read from fffff8002641152cOwning Process ffffb402b8d58080 Image: Attached Process ffffb402b984a040 Image: MemCompressionfffff78000000000: Unable to get shared dataWait Start TickCount 649763 Context Switch Count 9 IdealProcessor: 0 ReadMemory error: Cannot get nt!KeMaximumIncrement value.UserTime 00:00:00.000KernelTime 00:00:00.000Win32 Start Address 0x00007ff8c808afb0Stack Init ffffe607bc53fb90 Current ffffe607bc53e800Base ffffe607bc540000 Limit ffffe607bc539000 Call 0000000000000000Priority 8 BasePriority 7 PriorityDecrement 0 IoPriority 2 PagePriority 2Child-SP RetAddr : Args to Child : Call Siteffffe607`bc53de78 fffff800`25d9856e : 00000000`00000154 ffffb402`b9851000 ffffe607`bc53df30 00000000`00000002 : nt!KeBugCheckExffffe607`bc53de80 fffff800`25c189db : ffffb402`b9851000 ffffe607`bc53df30 ffffe607`00000002 ffffe607`bc53dfe0 : nt!SMKM_STORE::SmStUnhandledExceptionFilter+0x7effffe607`bc53ded0 fffff800`25bcfb1f : fffff800`00000002 fffff800`258d905c ffffe607`bc539000 ffffe607`bc540000 : nt!`SMKM_STORE::SmStDirectReadIssue"::`1"::filt$0+0x22ffffe607`bc53df00 fffff800`25c062ff : fffff800`258d905c ffffe607`bc53e4e0 fffff800`25bcfa80 00000000`00000000 : nt!_C_specific_handler+0x9f...
从卦中信息看,异常线程还有一个附加的进程ffffb402b984a040,来自于MemCompression模块,从名字上看所谓的压缩解压缩逻辑应该和它有关系,接下来到网上去搜一下,有一篇文章说的非常好:https://www.howtogeek.com/319933/what-is-memory-compression-in-windows-10/
大意:这是 Windows10 新增的一个功能,用内存压缩技术让RAM中可以存储更多的内存页,相比传统的交换到 PageFiles.sys 有更高的性能,缺点就是需要耗费一些解压缩需要的 CPU 时间。
在 Windows10 上也能窥探一二:
4. 问题解决解决办法很简单,学 4S 店的问题解决之道,能换的就坚决不修,让朋友把内存压缩给关掉,这样就不走RtlDecompressBufferXpressLz逻辑,理论上就不会有什么问题了。
关闭之后,据朋友反馈,这几天没有崩溃了。
三:总结分析内核态相比用户态难度要大的多,需要对操作系统以及CPU的相关知识有一个比较深度的理解,任重道远。。。
关键词:
下一篇:最后一页
精心推荐
- 圆通速递发布2022年4月快递业务主要经营数据
- 4月沿海港口货物吞吐量同比减少1.4% 天津港增速超20%
- 去年京津冀工信部门推进签约570多项高端高新项目
- 京津冀区域协同创新指数增长迅速
- 1至2月河北省工业生产平稳开局 规模以上工业增加值同比增长6.0%
- 浙江绍兴15日0-21时新增41例确诊病例
- 沈阳大气优良天数达近5年来最好水平
- 辽宁实行市级政府集中监管 首站定点冷库加强疫情防控
- 辽宁省25个博士后团队冲刺全国博士后创新创业大赛
- 安徽省宿州市埇桥区大营镇大营新村调整为中风险地区
- 云南哀牢山4名地质调查人员因公殉职原因查明
- 全国首部涉及“非现场执法”的法规施行 浦东新区打造引领区数字化城市治理样板
- 杭州一封控小区完成第三轮核酸检测 前两轮检测均为阴性
- 集采未中选药品现在怎么样了?这组数据告诉你
-
(四川统战人说统战事)“海归”博士后王暾:专注灾害预警科技创新 打通灾害预警“最后一公里” 中新网成都12月15日电 (起钰婷)“国
-
中新网福建平和12月15日电 (周晓彬 马淑惠)12月15日,福建省平和县人民法院依法宣判蔡某金等10人涉恶犯罪案件。 法院审理查明,20
-
中新网郑州12月15日电 (记者 韩章云)针对近日网友实名举报中国农业发展银行太康县支行员工夏某华吃空饷一事,中国农业发展银行河南省
-
中新网宿迁12月15日电 (记者 刘林)“房子干净又敞亮,社区漂亮又整洁。”15日,家住江苏宿迁牛角淹社区的袁有亮谈起新家,兴奋的心情
-
中新网通辽12月15日电 (记者 张林虎)15日,记者从内蒙古自治区通辽市科左后旗公安局获悉,该局打掉一个帮助网络犯罪转账的“跑分团队
X 关闭
X 关闭
产业
-
记一次 Windows10 内存压缩 ...
一:背景1 讲故事在给各位朋友免费分析 NET程序各种故障的同时,...
-
热血无赖结局_热血无赖简介-动态焦点
欢迎观看本篇文章,小柴来为大家解答以上问题。热血无赖结局,热血...
-
异动快报:贵人鸟(603555)4月2...
4月26日盘中消息,13点17分贵人鸟(603555)触及跌停板。目前价格2...
-
世界热推荐:三分球11中1!塔图...
北京时间4月26日,NBA季后赛首轮G5,凯尔特人主场117-119不敌老鹰,...
-
每日热讯!破发股浙江恒威收年报...
破发股浙江恒威收年报问询函上市即巅峰招商证券保荐
-
世界要闻:巢湖社保缴20年退休金...
退休能够拿到多少养老金,这跟很多因素有关系,有的人可能只能领几...
-
天天热点评!4月26日贵金属市场...
截止4月25日收盘,COX黄金6月合约亚市收盘于2007 9美元 盎司,涨...
-
一季度全国免征新能源车辆购置税...
国家税务总局25日发布数据,2023年一季度,全国共有125 7万辆新能...
-
资讯:开泰石化终止北交所IPO ...
开泰石化终止北交所IPO保荐机构为中信证券
-
开展中小学春季教学视导检查
宁津县教体局——开展中小学春季教学视导检查宁津讯(刘连杰)近日...