本文记录某个应用在某台 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 异常及修复方法的更多相关文章

  1. 关于thinkphp5手动抛出Http异常时自定义404页面报错的问题

    在使用HttpException手动抛出异常时,希望跳转到自定义的错误页面,官方的文章中是这样描述的. 可以使用\think\exception\HttpException类来抛出异常 // 抛出 H ...

  2. 将Controller抛出的异常转到特定View

    <!-- 将Controller抛出的异常转到特定View --> <bean class="org.springframework.web.servlet.handler ...

  3. 使用visual studio 2015调用阿里云oss .net sdk 2.2的putobject接口抛出outofmemory异常

    问题描述: 使用阿里云oss .net sdk 2.2版本,使用putobject接口上传文件时,抛出outofmemory异常. 原因分析: 上传时,用于准备上传的数据缓冲区内存分配失败.与应用软件 ...

  4. 捕获Java线程池执行任务抛出的异常

    捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...

  5. 为什么只有在用Visual Studio启动程序时会抛出InvalidOperationException异常

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:为什么只有在用Visual Studio启动程序时会抛出InvalidOperationExceptio ...

  6. java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

    /** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...

  7. druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索

    最近项目中有个定时任务的需求,定时检查mysql数据与etcd数据的一致性,具体实现细节就不说了,今天要说的就是实现过程中遇到了druid抛出的异常,以及解决的过程 异常 异常详细信息 五月 05, ...

  8. 外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常

    shiro权限框架,用户登录方法的subject.login(token)会进入自定义的UserNamePasswordRealm类的doGetAuthenticationInfo身份验证方法 通常情 ...

  9. JavaWeb项目中获取对Oracle操作时抛出的异常错误码

    最近在项目中碰到了这么一个需求,一个JavaWeb项目,数据库用的是Oracle.业务上有一个对一张表的操作功能,当时设置了两个字段联合的唯一约束.由于前断没有对重复字段的校验,需要在插入时如果碰到唯 ...

  10. 多线程状态下调用SimpleDateFormat.format()抛出 ArrayIndexOutOfBoundsException 异常

    本来想在类的顶部设置一个 静态的SimpleDateFormat常量 public final static DateFormat dateFormatGMT = new SimpleDateForm ...

随机推荐

  1. 三维模型3DTile格式轻量化压缩处理重难点分析

    三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决.以下是几个主要的重难点: 1.压缩率和模型质量之间的平衡: ...

  2. 记录--手写一个 v-tooltip 指令

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 日常开发中,我们经常遇到过tooltip这种需求.文字溢出.产品文案.描述说明等等,每次都需要写一大串代码,那么有没有一种简单的方式 ...

  3. docker相关命令杂理

    - 2020.11.16docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #保存现有的镜像 # docker commit -a "r ...

  4. FFmpeg开发笔记(三)FFmpeg的可执行程序介绍

    ​外界对于FFmpeg主要有两种使用途径,一种是在命令行运行FFmpeg的可执行程序,该方式适合没什么特殊要求的普通场景:另一种是通过代码调用FFmpeg的动态链接库,由于开发者可以在C代码中编排个性 ...

  5. [MAUI]集成高德地图组件至.NET MAUI Blazor项目

    @ 目录 前期准备:注册高德开发者并创建 key 登录控制台 创建 key 获取 key 和密钥 创建项目 创建JS API Loader 配置权限 创建定义 创建模型 创建地图组件 创建交互逻辑 项 ...

  6. .NET周刊【3月第3期 2024-03-24】

    国内文章 Garnet: 力压Redis的C#高性能分布式存储数据库 https://www.cnblogs.com/InCerry/p/18083820/garnet_introduce 微软研究院 ...

  7. KingbaseESV8R6延迟提交参数

    前言 队列理论在我们生活中的应用随处可见,例如我们去食堂打饭需要排队,我们生活中随处可见排队的场景. 在计算机领域中,性能诊断等地方使用队列理论的案例也很多.服务器硬件分为动态设备和静态设备.CPU和 ...

  8. async/await 致WPF卡死问题

    问题代码: xmal:一个按钮+一个显示框 1 <Button Width="100" Height="50" Margin="10" ...

  9. WPF实现树形下拉列表框(TreeComboBox)

    前言 树形下拉菜单是许多WPF应用程序中常见的用户界面元素,它能够以分层的方式展示数据,提供更好的用户体验.本文将深入探讨如何基于WPF创建一个可定制的树形下拉菜单控件,涵盖从原理到实际实现的关键步骤 ...

  10. #01背包#洛谷 2340 [USACO03FALL]Cow Exhibition G

    题目 有\(n\)个物品,对于第\(i\)个物品, 有两种属性,第一种属性为\(x_i\),第二种属性为\(y_i\) 问选择若干个物品使得\(\sum{x_j}\geq 0\)且\(\sum{y_j ...