【发布时间】: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