UWP 未处理的异常仅在发布模式下

UWP unhandled exception only in Release mode

我已经为我发布的 UWP 应用程序中的一个错误苦苦挣扎了一个星期,当部署在 phones(ARM 目标)上时,它似乎只在发布模式下表现出来。从一个特定页面导航到另一个页面时,它会随机崩溃应用程序。它只会影响这两个特定页面,即使它们的结构与项目中从未显示此行为的许多其他页面相同(使用 OnNavigatedTo 和 OnLoaded 来呈现内容并填充 ViewModel 等)

我唯一的线索(因为我无法获得完整的堆栈跟踪)是这条错误消息,我通过反复试验很难得到它:

它看起来很普通,我已经尝试了一些我在寻找它时发现的东西:

经过大量阅读,我尝试 fiddle 使用项目设置中的编译选项,发现有问题的配置同时激活了 .NET 本机工具链编译和代码优化复选框。我设法在激活这些选项的情况下在调试模式下重现崩溃(基本上是玩应用程序直到随机出现错误)但是由于这些设置被激活,我没有得到堆栈跟踪。调试器只是在 Unhandled XAML 异常行上中断,甚至启动它的方法的 sender 和 e 参数“目前不可访问”。

另一方面,我的 phone 上有一些我无法在 Visual Studio 2015 中调试的小型转储。它找不到 kenelbase.pdb 符号,甚至如果我在我的配置中检查了 Microsoft 符号服务器。

即使我选中了 .NET 本机编译选项,我也无法将应用程序上传到商店(似乎两者都需要,否则网站会在验证期间抛出错误),所以我的用户最终会 运行进入错误。如果有人有任何指点或想法,我将不胜感激。

编辑 0:

VS Enterprise 2015,W10M 编译 10586.107 运行在 Lumia 925 上运行。但我希望我知道为什么它不更新到 .164。

编辑 1:

我注意到当崩溃发生时,none 我的视图中的几张图片会被加载。有一些从捆绑内容 (png) 加载的 BitmapIcons 和两个使用 IValueConverter 从网络加载的图像,将它们转换为 BitmapImage,因此,ImageSources。我已经检查并重新检查了转换器的空值和异常,应该很清楚。

编辑 2:

父视图,触发导航的事件:

    private void SessionList_ItemClick(object sender, ItemClickEventArgs e)
    {
        Frame.Navigate(typeof(ClubPage), e.ClickedItem); // The collection is binded, so the clicked item is a model
    }

在崩溃视图上执行的代码:

    private void ClubPage_Loaded(object sender, RoutedEventArgs e)
    {
        isInfoShowing = false;
        isLogoZoomed = false;
        compositor = ElementCompositionPreview.GetElementVisual(sender as UIElement).Compositor;
        Visual status = ElementCompositionPreview.GetElementVisual(StatusBlock);
        status.Opacity = 0.0f;
        ClubViewModel.Current.ShowIn = false;
        ClubViewModel.Current.ShowComing = false;
    }

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        if (e.Parameter != null)
        {
            ClubViewModel.Current.Club = e.Parameter as Club;
            SplitViewShellViewModel.Current.Title = ClubViewModel.Current.Club.Name.Replace("_", " ");
            SplitViewShellViewModel.Current.TitleBarOpacity = 1.0f;
            ClubViewModel.Current.InLimit = App.RefreshLimit;
            ClubViewModel.Current.ComingLimit = App.RefreshLimit;
            await ClubViewModel.Current.GetClub(); //I'm positive that up until this point the code is executed
            await ClubViewModel.Current.GetPeopleIn();
            await ClubViewModel.Current.GetClubNotifications();
        }
    }

编辑 3:

激活本机调试为我提供了以下堆栈跟踪:

当 DispatcherTimer 滴答时引发异常(我认为 none,一切都是内部的)。除此之外,我完全看不懂。

我想尽了办法,也重构了我的整个观点。我正在做的唯一“奇怪”的事情是容器内的 ListView 破坏了它的虚拟化,但我不关心性能,因为列表真的很小。

这非常奇怪(至少对我而言),但显然上面显示的导航代码并未在 Dispatcher 线程上执行...即使它是由 UI 事件触发的。按如下方式将呼叫发送给调度员就成功了:

private async void SessionList_ItemClick(object sender, ItemClickEventArgs e)
{
   await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(ClubPage), e.ClickedItem)); 
}

分布在整个应用程序中的相同代码(没有明确的 Dispatcher.RunAsync 包装器)按预期工作。每次我 运行 进入 UI 线程问题时,抛出的异常都得到管理并且易于重现......在编译器优化过程中可能发生什么可以触发这个?