您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > windows

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

时间:2023-04-26 14:06:54  来源:微信公众号  作者:一线码农聊技术
在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相对缺乏,分析起来并不是那么的顺利,今天就聊一个 Windows 崩溃的内核dump 吧,这个 dump 是前几天有位朋友给到我的,让我帮忙看一下,有了dump之后上 windbg 分析。

一:背景

1. 讲故事

在给各位朋友免费分析 .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 manager
Arg2: ffffe607bc53df30, Exception information
Arg3: 0000000000000002, Reserved
Arg4: 0000000000000000, Reserved
...
EXCEPTION_RECORD:  ffffe607bc53eeb8 -- (.exr 0xffffe607bc53eeb8)
ExceptionAddress: fffff80025b04bd0 (nt!RtlDecompressBufferXpressLz+0x0000000000000050)
   ExceptionCode: c0000006 (In-page I/O error)
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 0000000000000000
   Parameter[1]: 0000023f30ee99f0
   Parameter[2]: 00000000c0000185
Inpage operation fAIled at 0000023f30ee99f0, due to I/O error 00000000c0000185

EXCEPTION_PARAMETER1:  0000000000000000

EXCEPTION_PARAMETER2:  0000023f30ee99f0

CONTEXT:  ffffe607bc53e6f0 -- (.cxr 0xffffe607bc53e6f0)
rax=fffff80025b04b80 rbx=ffff9d808d7fa000 rcx=ffff9d808d7fa000
rdx=ffff9d808d7fa000 rsi=0000000000000002 rdi=0000023f30ee99f0
rip=fffff80025b04bd0 rsp=ffffe607bc53f0f8 rbp=0000023f30eea2fe
 r8=0000023f30ee99f0  r9=0000000000000964 r10=ffff9d808d7faea0
r11=0000023f30eea354 r12=ffffe607bc53f368 r13=ffffb402d84d8000
r14=ffff9d808d7fb000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0000  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246
nt!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 000000006d34aca0
Amd64VtoP: Virt 000000006d34aca0, pagedir 00000003d81fb002
Amd64VtoP: PML4E 00000003d81fb002
Amd64VtoP: PML4E read error 0x8000FFFF
Virtual address 6d34aca0 translation fails, error 0x8000FFFF.

2: kd> !pte 000000006d34aca0
                                           VA 000000006d34aca0
PXE at FFFF86432190C000    PPE at FFFF864321800008    PDE at FFFF864300001B48    PTE at FFFF860000369A50
contains 0000000000000000
contains 0000000000000000
not valid

2. 洞察异常前的线程栈

有了这个初步信息之后,接下来就来观察异常时的寄存器上下文和线程栈信息,输出如下:

2: kd> .cxr 0xffffe607bc53e6f0 ; k
rax=fffff80025b04b80 rbx=ffff9d808d7fa000 rcx=ffff9d808d7fa000
rdx=ffff9d808d7fa000 rsi=0000000000000002 rdi=0000023f30ee99f0
rip=fffff80025b04bd0 rsp=ffffe607bc53f0f8 rbp=0000023f30eea2fe
 r8=0000023f30ee99f0  r9=0000000000000964 r10=ffff9d808d7faea0
r11=0000023f30eea354 r12=ffffe607bc53f368 r13=ffffb402d84d8000
r14=ffff9d808d7fb000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0000  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246
nt!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 Site
00 ffffe607`bc53f0f8 fffff800`25a5bc10     nt!RtlDecompressBufferXpressLz+0x50
01 ffffe607`bc53f110 fffff800`25a5bb14     nt!RtlDecompressBufferEx+0x60
02 ffffe607`bc53f160 fffff800`25a5b9a1     nt!ST_STORE<SM_TRAITS>::StDmSinglePageCopy+0x150
03 ffffe607`bc53f220 fffff800`25b56ff0     nt!ST_STORE<SM_TRAITS>::StDmSinglePageTransfer+0xa5
04 ffffe607`bc53f270 fffff800`25b57904     nt!ST_STORE<SM_TRAITS>::StDmpSinglePageRetrieve+0x180
05 ffffe607`bc53f310 fffff800`25b57aed     nt!ST_STORE<SM_TRAITS>::StDmPageRetrieve+0xc8
06 ffffe607`bc53f3c0 fffff800`25a5c071     nt!SMKM_STORE<SM_TRAITS>::SmStDirectReadIssue+0x85
07 ffffe607`bc53f440 fffff800`25aad478     nt!SMKM_STORE<SM_TRAITS>::SmStDirectReadCallout+0x21
08 ffffe607`bc53f470 fffff800`25a5cb57     nt!KeExpandKernelStackAndCalloutInternal+0x78
09 ffffe607`bc53f4e0 fffff800`25a5713c     nt!SMKM_STORE<SM_TRAITS>::SmStDirectRead+0xc7
0a ffffe607`bc53f5b0 fffff800`25a56b70     nt!SMKM_STORE<SM_TRAITS>::SmStWorkItemQueue+0x1ac
0b ffffe607`bc53f600 fffff800`25b58727     nt!SMKM_STORE_MGR<SM_TRAITS>::SmIoCtxQueueWork+0xc0
0c ffffe607`bc53f690 fffff800`25b2b94b     nt!SMKM_STORE_MGR<SM_TRAITS>::SmPageRead+0x167
0d ffffe607`bc53f700 fffff800`25ad1020     nt!SmPageRead+0x33
0e ffffe607`bc53f750 fffff800`25ad023d     nt!MiIssueHardFaultIo+0x10c
0f ffffe607`bc53f7a0 fffff800`25a6e818     nt!MiIssueHardFault+0x29d
10 ffffe607`bc53f860 fffff800`25c0b6d8     nt!MmaccessFault+0x468
11 ffffe607`bc53fa00 00007ff8`c3089fa2     nt!KiPageFault+0x358
12 00000067`4ca7f270 00000000`00000000     0x00007ff8`c3089fa2

从卦中的调用栈信息看,代码的源头是 用户态 (0x00007ff8c3089fa2) 过来的,应该是访问用户态地址 0000023f30ee99f0 上的内容,由于对应的物理页不在内存中,触发了 nt!KiPageFault 中断,也就是 idt 表中的 0xe 号标记的 缺页中断, 输出如下:

lkd> !idt

Dumping IDT: fffff8050ce87000

00: fffff80506206400 nt!KiDivideErrorFault
...
0e: fffff80506209980 nt!KiPageFault

在缺页中断中触发了 IO 操作 MiIssueHardFaultIo 要从pagefiles 中捞页面,接下来就是页读取逻辑 SmPageRead,最后在 RtlDecompressBufferXpressLz 中引发了蓝屏。

如果心比较细的话,你会发现有一个关键词 Decompress ,对,就是解压缩,为什么换入的page还要解压缩呢?这就是我们的突破点。

3. 为什么会解压缩

要找到这个问题的答案,需要观察下这个异常线程的详细信息,可以用 .thread 切到异常的线程上下文,再用 !thread 观察。

2: kd> .thread
Implicit thread is now ffffb402`be04a080

2: kd> !thread ffffb402`be04a080
THREAD ffffb402be04a080  Cid 0594.2228  Teb: 000000674c5b8000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
GetUlongFromAddress: unable to read from fffff8002641152c
Owning Process            ffffb402b8d58080       Image:         <Invalid process>
Attached Process          ffffb402b984a040       Image:         MemCompression
fffff78000000000: Unable to get shared data
Wait Start TickCount      649763       
Context Switch Count      9              IdealProcessor: 0             
ReadMemory error: Cannot get nt!KeMaximumIncrement value.
UserTime                  00:00:00.000
KernelTime                00:00:00.000
Win32 Start Address 0x00007ff8c808afb0
Stack Init ffffe607bc53fb90 Current ffffe607bc53e800
Base ffffe607bc540000 Limit ffffe607bc539000 Call 0000000000000000
Priority 8 BasePriority 7 PriorityDecrement 0 IoPriority 2 PagePriority 2
Child-SP          RetAddr               : Args to Child                                                           : Call Site
ffffe607`bc53de78 fffff800`25d9856e     : 00000000`00000154 ffffb402`b9851000 ffffe607`bc53df30 00000000`00000002 : nt!KeBugCheckEx
ffffe607`bc53de80 fffff800`25c189db     : ffffb402`b9851000 ffffe607`bc53df30 ffffe607`00000002 ffffe607`bc53dfe0 : nt!SMKM_STORE<SM_TRAITS>::SmStUnhandledExceptionFilter+0x7e
ffffe607`bc53ded0 fffff800`25bcfb1f     : fffff800`00000002 fffff800`258d905c ffffe607`bc539000 ffffe607`bc540000 : nt!`SMKM_STORE<SM_TRAITS>::SmStDirectReadIssue'::`1'::filt$0+0x22
ffffe607`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的相关知识有一个比较深度的理解,任重道远。。。



Tags:Windows10   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
记一次 Windows10 内存压缩 崩溃分析
在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相对缺乏,分析起来并不是那么...【详细内容】
2023-04-26  Search: Windows10  点击:(240)  评论:(0)  加入收藏
Mac VMware虚拟机怎么安装Windows10系统教程
VMware Fusion Pro mac破解版,是一款mac虚拟机软件,跟Parallels Desktop一样,都可以让你的 Mac 同时运行一个或多个不同的操作系统。VMware Fusion Pro mac不仅能让你在Mac苹...【详细内容】
2023-01-03  Search: Windows10  点击:(1448)  评论:(0)  加入收藏
windows10上安装docker
windows10上安装docker: http://www.ujiaoshou.com/xtjc/143941331.html从零开始的Docker Desktop使用: https://blog.csdn.net/qq_39611230/article/details/1086418422.Dock...【详细内容】
2022-11-03  Search: Windows10  点击:(492)  评论:(0)  加入收藏
windows10禁用Onedirve服务,专业版,企业版,家庭版亲测可用
在Windows10 系统中内置了Onedirve 服务,即可以上传甚至可以同步我们的数据,但是有很多用户不想使用该服务,原因是出于数据安全的考虑,同时网速问题着实让人受不了。那么怎么把W...【详细内容】
2022-08-31  Search: Windows10  点击:(488)  评论:(0)  加入收藏
windows10或者windows11家庭版升级专业版密钥及方法
大家新买的电脑现在基本都是windows10家庭版或者windows11家庭版,虽然功能基本够用,但是家庭版对很多功能进行了删减,有很多限制,对一些要求相对较高的人就不是很方便了。下面就...【详细内容】
2022-06-23  Search: Windows10  点击:(1062)  评论:(0)  加入收藏
Windows10系统需要安装360安全套装吗?答案来了
许多人在安装Windows系统之后都会第一时间在电脑上下载一个360安全套装或者其它的杀毒软件。那么,进入Win10时代之后,真得需要安装360安全套装吗?答案来了。 首先可以明确地说,w...【详细内容】
2022-06-08  Search: Windows10  点击:(1078)  评论:(0)  加入收藏
Windows10解除宽带限制
1、win+R运行 输入“gpedit.msc”2、“本地组策略编辑器”对话框 按右键选:“高级QoS设置” 确定后重启电脑。...【详细内容】
2022-06-02  Search: Windows10  点击:(219)  评论:(0)  加入收藏
Windows10下搭建汇编语言开发环境
前言本学期学校安排有汇编语言这门课,需要自己搭建汇编语言开发环境,特此写下本文记录搭建过程.关于搭建汇编语言开发环境的教程,我也找了许多,可看下来却依旧一头雾水,经过...【详细内容】
2022-03-28  Search: Windows10  点击:(352)  评论:(0)  加入收藏
电脑产品密钥Windows10在哪里查看
电脑系统win10密钥怎么查看?在如今,越多的用户选择使用win10系统,但是小伙伴们知道吗,在使用win10系统之前需要先使用密钥激活,这样才可以使用全部功能,那怎么查看自己的密钥呢? 1...【详细内容】
2022-02-16  Search: Windows10  点击:(543)  评论:(0)  加入收藏
Windows10任务栏右下角显示秒的操作方法
在默认状态下,Windows10任务栏右下角的系统时间显示格式:HH:MM,可视如果想显示秒数(HH:MM:SS)呢?其实很简单,只要修改一下系统注册表就可以。步骤一:把鼠标移动到任务栏左下角Win徽...【详细内容】
2022-01-21  Search: Windows10  点击:(499)  评论:(0)  加入收藏
▌简易百科推荐
Win10控制面板,这些必备知识请收好!
Win10控制面板是Windows 10操作系统中的一个重要组件,它为用户提供了一个集中管理和配置系统设置的平台。通过控制面板,用户可以轻松调整计算机的各种设置,从而优化系统性能,提...【详细内容】
2024-04-10  数据蛙恢复专家    Tags:Win10   点击:(1)  评论:(0)  加入收藏
桌面图标不见了怎么恢复?3个轻松恢复方法请记好!
在日常使用电脑的过程中,有时我们会突然发现桌面上的图标不见了,这往往会让人感到困惑和不知所措。不过,别担心,这通常只是一个小问题,有很多方法可以帮助你快速恢复桌面图标。桌...【详细内容】
2024-04-09  数据蛙恢复专家    Tags:桌面图标   点击:(3)  评论:(0)  加入收藏
Win11 24H2狠心封杀!第三方UI修改软件不能用了
快科技4月8日消息,如果你正在用一些可以修改系统UI界面、功能的第三方软件,一定不要升级Windows 11 24H2 RTM正式版,因为它们都被悄无声息地封杀了。据多位网友反馈,Windows 11...【详细内容】
2024-04-08    驱动之家  Tags:Win11   点击:(7)  评论:(0)  加入收藏
Windows 10明年结束免费支持 操作系统付费更新来了
微软宣布,Windows 10操作系统将于明年10月14日正式结束免费的技术支持。自此之后,用户想要获得更新补丁,就需要支付费用。具体而言,企业用户和个人用户将面临不同的收费标准。对...【详细内容】
2024-04-08    中关村在线  Tags:Windows   点击:(9)  评论:(0)  加入收藏
微软已修复 Win10 中 sysprep.exe 系统准备工具无法使用问题
IT之家 4 月 6 日消息,上个月,微软为 Win10 发布了最新的 KB5035941 更新,引入了新的锁屏小部件、用于桌面背景的 Windows 聚焦以及许多其他功能改进。除此之外,此次更新还解决...【详细内容】
2024-04-07    IT之家  Tags:Win10   点击:(7)  评论:(0)  加入收藏
微软 Win11 24H2 设置应用前瞻:加速去控制面板、支持sudo命令等
IT之家 4 月 5 日消息,微软正加速推进 Windows 11 24H2 更新,日前发布了 RTM 候选预览版 Build 26100 更新,而且 Windows 11 LTSC 镜像近日也偷跑现身。Windows Latest 近日发...【详细内容】
2024-04-05    IT之家  Tags:Win11   点击:(9)  评论:(0)  加入收藏
微软 Win11 新增两种键盘快捷方式,方便调整文件资源管理器列宽
IT之家 3 月 24 日消息,虽然 Windows 已经是一个非常成熟的操作系统,但微软仍会不时添加一些新的快捷键。对于用户来说,如果能更多地去了解一些常用键盘快捷键,可能对于提高办公...【详细内容】
2024-03-24    IT之家  Tags:Win11   点击:(17)  评论:(0)  加入收藏
Win11 学院:如何在 Windows 11 Build 226x1.3371 预览版锁屏中扩充财经等内容
3 月 22 日消息,微软今天发布了 Windows 11 226x1.3371 预览版更新,并邀请部分 Release Preview 频道 Windows Insider 用户,测试锁屏扩充功能。微软目前仅邀请部分用户测试,如...【详细内容】
2024-03-22    IT之家  Tags:Win11   点击:(25)  评论:(0)  加入收藏
Win10关闭自带杀毒软件教程,两招彻底把Windows Defender关闭
很多玩辅助的小伙伴电脑一般都会安装第三方杀毒软件,如360、火绒,管家等,但是Win10系统的话还自带了Windows Defender得杀毒软件,在打开一些包含EXE程序的时候,Windows Defender...【详细内容】
2024-02-26  荒野大镖客    Tags:Win10   点击:(1)  评论:(0)  加入收藏
微软 Win11 画图 Canary / Dev 更新,更接近 Photoshop 使用体验
IT之家 2 月 22 日消息,微软画图去年年底为“画图”引入了大量新功能,例如图层、深色模式,以及 DALL-E 3 集成的 AI 生图功能。@PhantomOfEarth 发现,微软最近更新了 Canary / D...【详细内容】
2024-02-23    IT之家  Tags:画图   点击:(55)  评论:(0)  加入收藏
站内最新
站内热门
站内头条