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

时间:2016-03-26 12:56:14

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

在我发布的UWP应用程序中,我一直在努力工作一周,但在手机(ARM目标)上部署时,它似乎只能在发布模式中体现出来。当从一个特定页面导航到另一个页面时,它会使应用程序崩溃。它只会影响这两个特定页面,即使它们的结构与项目中从未显示此行为的许多其他页面相同(使用OnNavigatedTo和OnLoaded来呈现内容并填充ViewModel等)

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

Exception

这似乎很通用,我在尝试时尝试了几件事:

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

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

另一方面,我的手机上有一些minidump,我无法在Visual Studio 2015中调试。它找不到kenelbase.pdb符号,即使我在配置上检查了Microsoft Symbol Servers

我无法将应用程序上传到商店,即使我选中了.NET本机编译选项(它似乎需要两者,否则网站会在验证过程中抛出错误),所以我的用户最终会遇到错误。如果有人有任何指示或想法,我将非常感激。

Edit0:

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

EDIT1:

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

EDIT2:

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

    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();
        }
    }

EDIT3:

激活本机调试会给我以下stacktrace。 DispatcherTimer勾选时会引发异常(我的视图中没有,一切都是内部的)。除此之外,我无法理解它。

我已经尝试了所有我能想到的东西,并且我也重构了我的全部观点。我正在做的唯一“奇怪”的事情是容器中的ListView打破了它的虚拟化,但我并不关心性能,因为列表非常小。

1 个答案:

答案 0 :(得分:2)

这非常奇怪(至少对我而言),但显然上面显示的导航代码并没有在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线程问题时,抛出的异常都被管理并且易于重现......在编译器优化过程中可能会发生什么,可能会触发这个?