记 Win8.1 某应用渲染抛出 OutOfMemoryException 异常及修复方法
本文记录某个应用在某台 Windows 8.1 x86 系统上,运行时抛出 OutOfMemoryException 异常,启动失败。应用程序能启动,但是在第一次碰到渲染时,就发现渲染初始化失败,从而让应用程序闪退
此应用是一个 dotnet 6 应用,闪退时好在被系统的事件管理记录了日志,从系统的事件查看器可以看到如下的异常堆栈信息
Application: Doubi.exe
CoreCLR Version: 6.0.121.56705
.NET Version: 6.0.1
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.OutOfMemoryException: Insufficient memory to continue the execution of the program.
at MS.Internal.HRESULT.Check(Int32 hr)
at System.Windows.Media.Composition.DUCE.Channel.SyncFlush()
at System.Windows.Media.MediaContext.CompleteRender()
at System.Windows.Media.MediaContext.CreateChannels()
at System.Windows.Media.MediaSystem.ConnectChannels(MediaContext mc)
at System.Windows.Media.MediaContext..ctor(Dispatcher dispatcher)
at System.Windows.Media.MediaContext.From(Dispatcher dispatcher)
以上的 OutOfMemoryException 异常,不代表一定是内存不足的异常状态。通过堆栈可以看到,这个异常是在 MS.Internal.HRESULT.Check 方法里面根据 hr 参数从而抛出的。通过阅读 WPF 源代码,可以看到这是对应的是在 wgx_render.cs 代码里的如下定义
internal enum NtStatusErrors
{
NT_STATUS_NO_MEMORY = unchecked((int)0xC0000017)
}
/// <summary>
/// HRESULT
/// </summary>
/// <ExternalAPI/>
// [StructLayout(LayoutKind.Sequential)]
internal struct HRESULT
{
/// <summary>
/// If the result is not a success, then throw the appropriate exception.
/// </summary>
/// <param name="hr"></param>
/// <ExternalAPI/>
public static void Check(int hr)
{
if (hr >= 0)
{
// The call succeeded, don't bother calling Marshal.ThrowExceptionForHr
return;
}
else
{
throw ConvertHRToException(hr);
}
}
[SecuritySafeCritical]
internal static Exception ConvertHRToException(int hr)
{
// 忽略其他代码
switch (hr)
{
case (int) NtStatusErrors.NT_STATUS_NO_MEMORY:
return new System.OutOfMemoryException();
}
// 忽略其他代码
}
这里的抛出的异常是由 WPF GFX 层的返回值转换的 dotnet 异常,而 GFX 层具体是哪个模块出现问题,也是无法确定的。在 GFX 层采用的是遇到异常即返回错误码的方式,没有直接的堆栈可以看到是哪个模块
这里的 0xC0000017 是一个常见的 nt 异常,于是又不好调查了,先尝试简单的 demo 能否复现,用来了解是否 WPF 底层的问题
尝试使用空的 dotnet 6 的 WPF 应用程序,可以正常运行和渲染。 证明应该是此应用触发了某些条件才会让渲染挂了,但是此应用过于复杂,先尝试修一下系统,如果修系统不行,再进行二分。因为二分的成本比较高
尝试更新显卡驱动,发现官方没有提供 Win8.1 x86 的驱动
尝试 DX 修复工具,没有找到可以修复的问题
尝试使用系统自带的修复命令,在管理员权限的 cmd 命令行就输入以下代码进行修复
sfc /scannow
命令输出 Windows 资源保护找到了损坏文件并成功修复了它们
接着使用管理员的 PowerShell 进行 Dism 修复,命令如下
dism /online /Cleanup-Image /RestoreHealth
执行输出如下图

修复完成之后,发现应用程序可以正常使用
猜测是系统的某些文件出了问题,具体是什么问题,还不知道
虽然上面的使用 DX 修复工具等步骤没有实际作用,但也不代表着这些步骤毫无作用,说不定这些步骤只是修了一半的问题
记 Win8.1 某应用渲染抛出 OutOfMemoryException 异常及修复方法的更多相关文章
- 关于thinkphp5手动抛出Http异常时自定义404页面报错的问题
在使用HttpException手动抛出异常时,希望跳转到自定义的错误页面,官方的文章中是这样描述的. 可以使用\think\exception\HttpException类来抛出异常 // 抛出 H ...
- 将Controller抛出的异常转到特定View
<!-- 将Controller抛出的异常转到特定View --> <bean class="org.springframework.web.servlet.handler ...
- 使用visual studio 2015调用阿里云oss .net sdk 2.2的putobject接口抛出outofmemory异常
问题描述: 使用阿里云oss .net sdk 2.2版本,使用putobject接口上传文件时,抛出outofmemory异常. 原因分析: 上传时,用于准备上传的数据缓冲区内存分配失败.与应用软件 ...
- 捕获Java线程池执行任务抛出的异常
捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...
- 为什么只有在用Visual Studio启动程序时会抛出InvalidOperationException异常
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:为什么只有在用Visual Studio启动程序时会抛出InvalidOperationExceptio ...
- java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误
/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...
- druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索
最近项目中有个定时任务的需求,定时检查mysql数据与etcd数据的一致性,具体实现细节就不说了,今天要说的就是实现过程中遇到了druid抛出的异常,以及解决的过程 异常 异常详细信息 五月 05, ...
- 外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常
shiro权限框架,用户登录方法的subject.login(token)会进入自定义的UserNamePasswordRealm类的doGetAuthenticationInfo身份验证方法 通常情 ...
- JavaWeb项目中获取对Oracle操作时抛出的异常错误码
最近在项目中碰到了这么一个需求,一个JavaWeb项目,数据库用的是Oracle.业务上有一个对一张表的操作功能,当时设置了两个字段联合的唯一约束.由于前断没有对重复字段的校验,需要在插入时如果碰到唯 ...
- 多线程状态下调用SimpleDateFormat.format()抛出 ArrayIndexOutOfBoundsException 异常
本来想在类的顶部设置一个 静态的SimpleDateFormat常量 public final static DateFormat dateFormatGMT = new SimpleDateForm ...
随机推荐
- 从0开始设计_基于STM32F1的RC522读写卡
从0开始设计_基于STM32F1的RC522读写卡 1.介绍看网上很多RC522的教程都是基于读卡ID的,这个对于很多应用来说其实没有什么用,最近刚好有个项目需要读写卡,而RC522又是非常常用的且不 ...
- go语言漏桶算法思路简单实现
package main import ( "fmt" "time" ) // 桶 type LeakBucket struct { capacity int ...
- linux 时钟同步
yum install ntp -y #cn.pool.ntp.org ntp[1-7].aliyun.com ntpdate ntp1.aliyun.com #把当前系统时间写入到CMOS中 clo ...
- KingbaseES V8R6 集群运维系列 -- 命令行部署repmgr管理集群+switchover测试
本次部署未使用securecmd/kbha工具,无需普通用户到root用户的互信. 一.环境准备 1.创建OS用户 建立系统数据库安装用户组及用户,在所有的节点执行. root用户登陆服务器,创建用户 ...
- 未来已来,OpenHarmony 3.2 Release发布,迈入发展新阶段
2023年4月9日,在社区开发者的期盼中,在春风送暖万物更新的季节里,我们迎来了OpenAtom OpenHarmony(以下简称"OpenHarmony")3.2 Relea ...
- 为 Hugging Face 用户带来无服务器 GPU 推理服务
今天,我们非常兴奋地宣布 部署到 Cloudflare Workers AI 功能正式上线,这是 Hugging Face Hub 平台上的一项新服务,它使得通过 Cloudflare 边缘数据中心部 ...
- Python格式化字符串:%、format、f-string
目前Python格式化字符串的方式有三种: 1. % 2.format 3.f-string % 格式化常用方法: # % 格式化字符串 s1 = 'name is %s' % ('zhangsan' ...
- 基于 Java 编程生成二维码图片
0x01 准备 (1)软件版本 IntelliJ IDEA 2023.1.3 JDK 18 Tomcat 10.1.11 Maven 3.8.6 (2)技术栈 servlet zxing 谷歌项目 生 ...
- Linux系统中查找文件的方法
-name 必须用到的选项.表明要求系统按照文件名查找. 一般格式:find /(dirname) -name filename 具体文件名查找法: 如果知道了某个文件的文件名,而不知道这个文件放到哪 ...
- 润乾报表如何从 mongodb 中取数
MongoDB 属于 NoSql 中的基于分布式文件存储的文档型数据库,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较 ...