我已经苦恼了一个星期,因为我的发布的UWP应用程序中有一个bug,只在部署到手机(ARM目标)上的发布模式下才会表现出来。当从一个特定页面导航到另一个页面时,它会随机崩溃应用程序。即使这两个特定页面的结构与项目中的许多其他页面完全相同,也只影响这两个页面(使用OnNavigatedTo和OnLoaded来呈现内容并填充ViewModel等)。
我唯一拥有的线索(因为我无法获得完整的堆栈跟踪)是这个错误消息,我只能通过反复试错来很困难地获得: 看起来这个问题很普遍,我试了几种方法:
另一方面,我有一些电话上的 minidump,无法在 Visual Studio 2015 上进行调试。即使我已经在配置中选中了 Microsoft 符号服务器,它也无法找到 kenelbase.pdb 符号。
即使我选择了 .NET native 编译选项(似乎需要两个),我也无法将应用上传到商店(否则,在验证期间网站会出现错误),因此我的用户最终会遇到这个 bug。如果有人有任何指针或想法,我会非常感激。
编辑0:
VS Enterprise 2015,W10M 编译 10586.107 在 Lumia 925 上运行。我希望我知道为什么它没有更新到 .164。
编辑1:
我注意到当崩溃发生时,我的视图中的几个图像都没有加载。有一些 BitmapIcons 从捆绑内容(png)加载,并使用 IValueConverter 从网络加载两个图像,并因此将它们转换为 BitmapImage 和 ImageSources。我检查过转换器是否为空和是否有异常,应该是清晰的。
编辑2:
父视图,触发导航的事件:
我已经尝试了我能想到的一切,并重新设计了整个视图。我唯一做的“奇怪”事情是在容器内使用ListView破坏其虚拟化,但我不担心性能问题,因为列表非常小。
我唯一拥有的线索(因为我无法获得完整的堆栈跟踪)是这个错误消息,我只能通过反复试错来很困难地获得: 看起来这个问题很普遍,我试了几种方法:
- 确保我的IValueConverters永远不会返回null或意外的值。
- 确保没有变量未初始化。
- 确保在访问任何组件之前完全加载UI。
- 确保没有在Dispatcher线程之外进行UI操作。
- 更新我的项目库(Newtonsoft JSON和winfbsdk,尽管后者在两个视图中都没有使用)。
另一方面,我有一些电话上的 minidump,无法在 Visual Studio 2015 上进行调试。即使我已经在配置中选中了 Microsoft 符号服务器,它也无法找到 kenelbase.pdb 符号。
即使我选择了 .NET native 编译选项(似乎需要两个),我也无法将应用上传到商店(否则,在验证期间网站会出现错误),因此我的用户最终会遇到这个 bug。如果有人有任何指针或想法,我会非常感激。
编辑0:
VS Enterprise 2015,W10M 编译 10586.107 在 Lumia 925 上运行。我希望我知道为什么它没有更新到 .164。
编辑1:
我注意到当崩溃发生时,我的视图中的几个图像都没有加载。有一些 BitmapIcons 从捆绑内容(png)加载,并使用 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破坏其虚拟化,但我不担心性能问题,因为列表非常小。