c# - UWP 未处理的异常仅在 Release模式下

标签 c# optimization win-universal-app release-mode .net-native

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

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

[Exception](http://i.imgur.com/9Mpejje.jpg)

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

  • 确保我的 IValueConverters 永远不会返回空值或意外值。
  • 确保没有变量未初始化。
  • 确保 UI 在访问其任何组件之前已完全加载。
  • 确保在 Dispatcher 线程之外没有 UI 操作。
  • 更新我的项目库(Newtonsoft JSON 和 winfbsdk,而后者在两个 View 中均未使用)。

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

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

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

编辑0:

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

编辑 1:

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

编辑2:

父 View ,触发导航的事件:

    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
    }

在崩溃 View 上执行的代码:

    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:

激活 native 调试会给我以下堆栈跟踪:

enter image description here

当 DispatcherTimer 计时时会引发异常(我认为没有,一切都是内部的)。除此之外,我无法理解它。

我把我能想到的都试过了,我也重构了我的整个 View 。我正在做的唯一“奇怪”的事情是容器内的 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 线程问题时,抛出的异常都得到管理并且易于重现...在编译器优化过程中可能发生什么可能触发此问题?

关于c# - UWP 未处理的异常仅在 Release模式下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235551/

相关文章:

windows-store-apps - 手动更改 package.appxmanifest 而不是将 UWP 应用程序与商店关联

c# - ASP.NET Web API 上 HttpActionContext.RequestContentKeyValueModel 的替代方案

c# - 从字符串格式化 Html 代码

c# - 在什么时候我需要将查询工作卸载到数据库?

python - 使用许多属性和字典查找优化 Python 代码

Mysql查询优化以在没有DISTINCT的情况下转换连接中的子查询

c# - 手动打包字节以在网络上发送

html - 如何提高同时播放的多个相同视频标签的性能

c# - GridView 水平方向中的 FooterTemplate

win-universal-app - 从 Assets 文件夹 uwp 写入文件