【问题标题】:UWP unhandled exception only in Release modeUWP 未处理的异常仅在发布模式下
【发布时间】:2022-01-26 22:15:46
【问题描述】:

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

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

它似乎很通用,我已经尝试了几件我在寻找它时发现的东西:

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

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

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

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

编辑 0:

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

编辑 1:

我注意到当崩溃发生时,我的视图中的几张图像都没有加载。有一些从捆绑内容 (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 滴答作响时引发异常(我认为没有,一切都是内部的)。除此之外,我无法理解它。

我已经尝试了我能想到的一切,我也重构了我的整体观点。我正在做的唯一“奇怪”的事情是容器内的 ListView 破坏了它的虚拟化,但我并不关心性能,因为列表真的很小。

【问题讨论】:

  • 导航到/从页面时是否序列化某些内容?如果是 -> 您应该将此 namespace\classes\etc 添加到 Properties 中的 [ProjectName].rd.xml 文件中。
  • @NikitaBondareko 不完全在那里,但我确实从我的视图模型中调用了一个异步方法(等待,返回一个任务),该方法可能会调用另一个方法,而该方法又对 JSON REST API 进行一些 http 调用。 . 那我应该添加什么?结构是:(崩溃)View -> ViewModel -> 执行调用和反序列化的服务。
  • 很可能是缺少对象元数据的问题。你怎么可以在这里找到 - msdn.microsoft.com/en-us/library/dn600638(v=vs.110).aspx
  • @NikitaBondarenko 修改了 Properties/Default.rd.xml 并且它仍然崩溃 =/.

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


【解决方案1】:

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

【讨论】:

  • 您好!我在 .NET Native 运行时和编译器团队工作。很抱歉听到它给你带来麻烦。听起来您可以在启用 .NET Native 的 DEBUG 中显示问题,这应该有助于追踪这一点。我的一个建议是停止所有第一次机会异常(调试>窗口>异常设置>检查公共语言运行时框)。许多组件捕获了它们没有业务处理的异常,因此这通常很有帮助。请随时通过 dotnetnative@microsoft.com 向我们发送电子邮件......其他人可能有更多想法。
  • @MattWhilden 你好!感谢您的光临,非常感谢。我按照你说的做了(实际上我都检查了,以防万一),最终重现错误后得到的只是:Exception。如前所述,除了 .NET 本机编译选项之外,我只在选中“优化代码”选项时才发现此问题,所以我想这就是我没有获得更多信息的原因。
  • 感谢马特这对我有帮助,我收到一个错误 ExcectionHelpers.cs 未找到,原来是天气 PCL 中的问题。
  • 我还有一个应用程序在调试模式下运行良好,但在发布模式下出现各种调度程序错误。我怀疑这与我通过扩展方法调用调度程序这一事实有关。
  • 谢谢!这很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多