是什么导致 UWP 应用程序间歇性崩溃并抛出 Windows.UI.Xaml.dll!CfocusRectManager 错误
What is causing UWP app to intermittently crash and throw Windows.UI.Xaml.dll!CfocusRectManager error
我们正在开发 UWP 应用程序,并注意到在 Visual Studio 中启动调试过程时出现间歇性崩溃。
Exception Unhandled
Unhandled exception at 0x00007fff8f9ac10c (Windows.UI.Xaml.dll) in
[ourAppName].exe: 0xC0000005: Access violation reading location
0x0000000000000000
我们还发现,在将 AppX 包旁加载到特定机器上(而非其他机器)后,应用程序的发布版本在启动时崩溃。当调试器附加到该机器上的进程时,错误是:
(7ebc.7298): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
Windows_UI_Xaml!CFocusRectManager::GetFocusOptionsForElement+0x158:
00007ff9`43d7c10c 488b01 mov rax,qword ptr [rcx]
ds:00000000`00000000=????????????????
我们的应用程序是一个相当简单的两页益智游戏应用程序,其中第一页基本上是用于启动游戏板的主页。
第一页在应用程序崩溃前短暂显示。
我们已经尝试通过注释来隔离页面构造函数中的任何异步代码,但崩溃仍然发生。
对可能导致崩溃的原因有什么想法吗?
经过进一步的实验,我偶然发现了这个问题,并找到了一个超级简单的重现,它展示了崩溃的原因,也验证了我们的解决方法。
罪魁祸首是具有以下 属性 设置的按钮控件:
FocusVisualPrimaryBrush="{x:Null}"
重现问题:
- 创建一个全新的 Windows 类型为空白应用程序的通用项目(通用 Windows)
- 向现有的网格控件添加一个按钮
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="{x:Null}" />
请注意,如果您按 F5 开始调试,您可能看不到错误。
但是,如果您通过按 Ctrl-F5 启动而不进行调试,则新应用程序将在启动几秒钟后崩溃。
我们的应用程序使用 Eye Control,因此 Tab 键顺序中第一个控件周围的可见焦点矩形会分散注意力,因此我将属性 window 中的 FocusVisualPrimary 设置为无画笔,这是按钮的 Xaml 定义中的 {x:Null} 值。
作为解决方法,我能够将该行更改为:
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="Transparent" />
焦点矩形不会分散注意力,应用程序也不会崩溃。
作为后续行动,我在我的代码中搜索了所有将 FocusVisualPrimaryBrush 设置为 Null 的事件,并在应用程序中发现了它的其他一些实例,这些实例可能是由于原始按钮的 copy/paste 而发生的。除了在启动时崩溃外,我还发现使用 Tab 键切换到 FocusVisualPrimaryBrush 设置为 Null 的控件也会导致应用程序突然崩溃。从那以后,我用 "Transparent".
删除或替换了所有出现的“{x:Null}”
我们正在开发 UWP 应用程序,并注意到在 Visual Studio 中启动调试过程时出现间歇性崩溃。
Exception Unhandled
Unhandled exception at 0x00007fff8f9ac10c (Windows.UI.Xaml.dll) in
[ourAppName].exe: 0xC0000005: Access violation reading location
0x0000000000000000
我们还发现,在将 AppX 包旁加载到特定机器上(而非其他机器)后,应用程序的发布版本在启动时崩溃。当调试器附加到该机器上的进程时,错误是:
(7ebc.7298): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
Windows_UI_Xaml!CFocusRectManager::GetFocusOptionsForElement+0x158:
00007ff9`43d7c10c 488b01 mov rax,qword ptr [rcx]
ds:00000000`00000000=????????????????
我们的应用程序是一个相当简单的两页益智游戏应用程序,其中第一页基本上是用于启动游戏板的主页。
第一页在应用程序崩溃前短暂显示。
我们已经尝试通过注释来隔离页面构造函数中的任何异步代码,但崩溃仍然发生。
对可能导致崩溃的原因有什么想法吗?
经过进一步的实验,我偶然发现了这个问题,并找到了一个超级简单的重现,它展示了崩溃的原因,也验证了我们的解决方法。
罪魁祸首是具有以下 属性 设置的按钮控件:
FocusVisualPrimaryBrush="{x:Null}"
重现问题:
- 创建一个全新的 Windows 类型为空白应用程序的通用项目(通用 Windows)
- 向现有的网格控件添加一个按钮
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="{x:Null}" />
请注意,如果您按 F5 开始调试,您可能看不到错误。 但是,如果您通过按 Ctrl-F5 启动而不进行调试,则新应用程序将在启动几秒钟后崩溃。
我们的应用程序使用 Eye Control,因此 Tab 键顺序中第一个控件周围的可见焦点矩形会分散注意力,因此我将属性 window 中的 FocusVisualPrimary 设置为无画笔,这是按钮的 Xaml 定义中的 {x:Null} 值。
作为解决方法,我能够将该行更改为:
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="Transparent" />
焦点矩形不会分散注意力,应用程序也不会崩溃。
作为后续行动,我在我的代码中搜索了所有将 FocusVisualPrimaryBrush 设置为 Null 的事件,并在应用程序中发现了它的其他一些实例,这些实例可能是由于原始按钮的 copy/paste 而发生的。除了在启动时崩溃外,我还发现使用 Tab 键切换到 FocusVisualPrimaryBrush 设置为 Null 的控件也会导致应用程序突然崩溃。从那以后,我用 "Transparent".
删除或替换了所有出现的“{x:Null}”