是什么导致UWP应用间歇性崩溃并引发Windows.UI.Xaml.dll!CfocusRectManager错误

时间:2019-02-15 02:23:34

标签: c# visual-studio uwp-xaml

我们正在开发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=????????????????

我们的应用程序是一个相当简单的两页益智游戏应用程序,其中第一页基本上是用于启动游戏板的主页。

在应用崩溃之前,第一页确实会暂时显示。

我们尝试通过注释掉页面构造函数中的任何异步代码,但是仍然会发生崩溃。

是否对导致崩溃的原因有任何想法?

1 个答案:

答案 0 :(得分:0)

经过进一步的实验,我偶然发现了这个问题,并找到了一个超级简单的repro,可以演示崩溃原因并验证了我们的工作。

罪魁祸首是具有以下属性设置的按钮控件:

FocusVisualPrimaryBrush="{x:Null}"

重现该问题:

  • 创建类型为Blank App(通用Windows)的全新Windows Universal项目
  • 将按钮添加到现有的Grid控件
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="{x:Null}" />

请注意,如果您通过按F5键开始调试,则可能看不到错误。 但是,如果您通过按Ctrl-F5而不进行调试就开始运行,则新应用将在启动后几秒钟崩溃。

我们的应用程序使用了Eye Control,因此按Tab键顺序排列的第一个控件周围的可见焦点矩形分散了注意力,因此我将Properties窗口中的FocusVisualPrimary设置为No brush,这是{x:Null}值的来源在Button的Xaml定义中。

作为一项变通办法,我能够将该行更改为:

<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="Transparent" />

和焦点矩形不是分散注意力,应用程序停止崩溃。

作为后续,我在代码中搜索了所有将FocusVisualPrimaryBrush设置为Null的情况,并在应用程序中发现了其他一些实例,这些实例可能是由于复制/粘贴原始按钮而发生的。除了在启动时崩溃之外,我还发现,将FocusVisualPrimaryBrush设置为Null的控件也将引起应用程序突然崩溃。从那以后,我已经删除了所有出现的“ {x:Null}”或将其替换为“透明”。