首页 > 其他分享 >记一次升级系统补丁导致 VS2022 崩溃分析

记一次升级系统补丁导致 VS2022 崩溃分析

时间:2024-10-08 11:33:35浏览次数:10  
标签:Exception Windows 补丁 System VS2022 崩溃 PrintException

一:背景

1. 讲故事

在最近一两年内Visual Studio 2022会偶发的出现打开即崩溃的情况,本想着把VS卸载重装,但发现这东西想卸载干净还是蛮困难的,又加上我这个人比较懒,所以就直接重装系统了,最近的9月份因为它重装了一次系统,但过了一天又遇到了同样的问题,在这样一个背景下我决定认真的看下到底是什么回事?毕竟一直装系统也不是个事。

二:崩溃分析

1. 崩溃现象

打开VisualStudio之后,会弹出错误信息 Exception has been thrown by the target of an invocation. 大概意思就是在调用目标上发生了异常,截图如下:

熟悉我的朋友都知道,我个人喜欢用 procdump 来捕获异常,这里可以根据指定异常的方式获取,参考命令和截图如下:


procdump -w devenv -e 1 -f TargetInvocationException -ma -o D:\testdump\

从图中的子异常TypeLoadException来看,看样子是加载了某个类型出错的,这里要提醒一下,上面的乱码是因为中文操作系统解析不了这些字符,大家可以把操作系统改成 英文版的,就可以显示全部字符,参考如下:

2. windbg分析

dump成功抓到之后,接下来就是启动 windbg 分析了,因为是托管层抛出的异常,直接用 !t 观察即可。


0:000> !t
ThreadCount:      22
UnstartedThread:  0
BackgroundThread: 20
PendingThread:    0
DeadThread:       2
Hosted Runtime:   no
                                                                                                        Lock  
       ID OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception
   0    1 2840 000001ac95d47e20    a4228 Preemptive  000001AC97806580:000001AC97807218 000001ac95d3a9d0 2     STA System.Reflection.TargetInvocationException 000001ac97804c28
   9    2 31d0 000001ac95da3d60    2b228 Preemptive  000001ACD6F92F00:000001ACD6F94E88 000001ac95d3a9d0 0     MTA (Finalizer) 
   ...

从卦中可以清晰的看到确实存在一个异常,接下来使用 pe 来观察异常详情,参考如下:


0:000> !pe -nested 000001ac97804c28
Exception object: 000001ac97804c28
Exception type:   System.Reflection.TargetInvocationException
Message:          Exception has been thrown by the target of an invocation.
InnerException:   System.TypeInitializationException, Use !PrintException 000001ac97804838 to see more.
StackTrace (generated):
    SP               IP               Function
    0000008618CFC6E0 0000000000000000 mscorlib_ni!System.RuntimeFieldHandle.GetValue(System.Reflection.RtFieldInfo, System.Object, System.RuntimeType, System.RuntimeType, Boolean ByRef)+0xffff80024c1d3360
    0000008618CFC6E0 00007FFDB2CA9F03 mscorlib_ni!System.Reflection.RtFieldInfo.UnsafeGetValue(System.Object)+0xa3

StackTraceString: <none>
HResult: 80131604
0:000> !PrintException /d 000001ac97804838
Exception object: 000001ac97804838
Exception type:   System.TypeInitializationException
Message:          The type initializer for 'System.Windows.Automation.Peers.AutomationPeer' threw an exception.
InnerException:   System.TypeLoadException, Use !PrintException 000001ac978003e8 to see more.
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131534
0:000> !PrintException /d 000001ac978003e8
Exception object: 000001ac978003e8
Exception type:   System.TypeLoadException
Message:          程序集“PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中的类型“MS.Internal.Automation.SelectionProviderWrapper”的方法“GetSelection”没有实现。
InnerException:   <none>
StackTrace (generated):
    SP               IP               Function
    0000008618CFB520 0000000000000000 PresentationCore!System.Windows.Automation.Peers.AutomationPeer.Initialize()+0x1
    0000008618CFB5D0 00007FFD55FDD431 PresentationCore!System.Windows.Automation.Peers.AutomationPeer..cctor()+0x81

StackTraceString: <none>
HResult: 80131522

从卦中可以清晰的看到,原来是SelectionProviderWrapper 类没有 GetSelection 实现,虽然找到了错误原因,但vs不是我们写的,无法修改源码,这个时候直接拿错误信息去网上找咯。

3. 寻找沦落人

在网络上一顿找,终于在 wpf 的仓库里给找到了,链接如下: https://github.com/dotnet/wpf/issues/8056

根据文章描述需要卸载 KB5011048 补丁即可,打开系统补丁列表,还真的有,果断给卸载掉。

卸载完成之后,重启操作系统,我去,还真的就打开了。

4. 为什么会这样

要想找到原因得要知道 KB5011048 补丁是用来干嘛的,链接如下: https://support.microsoft.com/zh-cn/topic/microsoft-net-framework-4-8-1-适用于-windows-10-版本-21h2-windows-10-版本-22h2-windows-11-版本-21h2-windows-server-2022-desktop-azure-editions-azure-stack-21h2-和-azure-stack-22h2-kb5011048-277f9c30-7add-4150-b774-5e3667e02256#:~:text=Microsoft .NET Framework 4.8.1 (KB5011048)

从 MSDN 的描述来看,这个补丁和 .NET Framework 4.8.1 有关,而且还特别提到了 高度兼容 ,看样子没有高度兼容。

到这里我大概就知道了来龙去脉,VS 用的是 .NETFramwork 4.8 ,但这个补丁导致Windows底层库更新到了 4.8.1, 结果 VS 使用的 GetSelection 方法在新的底层库中找不到方法实现了,最终导致 VS 直接崩溃。

三:总结

这次Visual Studio 2022 的启动崩溃罪魁祸首居然是 Windows 的补丁包导致的,这也太不靠谱了吧,不过这个案例也告诉我们有时候掌握一点dump分析能力,还是很容易找到问题的突破口。
图片名称

标签:Exception,Windows,补丁,System,VS2022,崩溃,PrintException
From: https://www.cnblogs.com/huangxincheng/p/18451352

相关文章

  • 极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8
    本分分享极狐GitLab补丁版本17.4.1、17.3.4、17.2.8的详细内容。近期,极狐GitLab专业技术团队正式发布了17.4.1、17.3.4、17.2.8版本。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLabSaaS,技术团队已......
  • 使用VS2022 Performance Profiler进行Native内存分析
    注:勾选MemoryUsage进行Native内存抓取 不带pdb要进行Native内存抓取点击Start按钮开始进行内存分析 点击“StopCollection”按钮,来结束Profile。 注:如果报如下错误:Failedtoloadmemoryusageview: System.NullReferenceException,需要将VS2022升级到最新或使用VS......
  • 在VS2022上安装pygame模块
    一、安装在vs2022中随便打开或生产一个python项目,找到最右边的“解决方案资源管理器”,并找到“python环境”,点击鼠标右键打开“查看所有python环境”打开以后找到下面的“在PowerShell中打开”,点击打开然后输入”pipinstallpygame“并等待安装即可二、测试输入以下代码并运......
  • 一种使用setdll+HOOK钩子技术+dll为MFC程序ProtocalTool等老旧程序打补丁的思路(含源
    一、引言由于工作原因,需要使用一个很老旧的软件,没有源代码,该软件在XP系统下运行正常,但是需要登录,且在win10系统下使用时IP控件运行不正常,只能输入每个数字只能输入2位数,还有一些其他问题,比如给软件添加一些编辑框,或者对软件进行下面简单梳理一下解决这些问题的思路。二、......
  • PDF 补丁丁 1.0.4 版更新
    亮点简介根据网友的建议,这个版本进一步优化了书签编辑器和阅读器的使用体验。替换字体功能修复了嵌入字体后水平位置发生偏移的问题。在此特别感谢马健(strnghrs)先生在解决该问题过程中所给予的帮助。详细内容新增功能允许替换批注或表单中的字体。编辑器的阅读器增加移动书......
  • 《最终幻想16》游戏启动时崩溃弹窗“找不到api-ms-win-core-com-l1-1-0.dll”文件该怎
    当启动《最终幻想16》时,游戏崩溃并弹窗显示“找不到api-ms-win-core-com-l1-1-0.dll”文件,这严重影响了游戏体验。现在为您细致剖析修复此问题的具体方法,助您顺利解决,畅玩游戏。本篇将为大家带来《最终幻想16》游戏启动时崩溃弹窗“找不到api-ms-win-core-com-l1-1-0.dll”文件......
  • 《地狱之刃2:塞娜的史诗》游戏启动时崩溃黑屏弹窗“找不到api-ms-win-core-console-l1-
    在启动《地狱之刃2:塞娜的史诗》时,崩溃黑屏并弹窗显示“找不到api-ms-win-core-console-l1-2-0.dll”文件,这十分棘手。此问题的解决可能需要特定操作。现在为您详细讲解解决办法,助您摆脱这一困境。本篇将为大家带来《地狱之刃2:塞娜的史诗》游戏启动时崩溃黑屏弹窗“找不到api-ms......
  • 《活侠传》游戏启动时闪退提示“找不到kernel32.dll”文件该怎么处理?活侠传游戏崩溃弹
    玩《活侠传》时,游戏启动就闪退,还提示“找不到kernel32.dll”文件,实在让人烦恼。此问题的解决或许有一定难度。现在为您仔细阐述处理这种情况的有效办法,助您解决难题,顺利开启游戏。本篇将为大家带来《活侠传》游戏启动时闪退提示“找不到kernel32.dll”文件该怎么处理的内容,......
  • 《黑神话:悟空》游戏启动时崩溃提示“找不到d3drm.dll”文件该怎么解决?黑神话悟空游戏
    在启动《黑神话:悟空》游戏时,出现崩溃情况,提示“找不到d3drm.dll”文件,令人十分困扰。别慌,这通常是由于该文件缺失所致。接下来为您详细介绍解决此问题的有效方法,帮助您顺利开启游戏之旅。本篇将为大家带来《黑神话:悟空》游戏启动时崩溃提示“找不到d3drm.dll”文件该怎么解决的......
  • 《星球大战:亡命之徒》游戏启动时崩溃提示“找不到D3DX9_41.dll”该怎么解决?星球大战亡
    启动《星球大战:亡命之徒》游戏时,遭遇崩溃,提示“找不到D3DX9_41.dll”,让人十分苦恼。别着急,这种情况大概率是相关文件缺失引起。下面将为您详细说明解决此问题的有效途径,助力您顺利进入游戏。本篇将为大家带来《星球大战:亡命之徒》游戏启动时崩溃提示“找不到D3DX9_41.dll”该怎......