В течение недели я боролся с ошибкой в моем опубликованном приложении UWP, которая, кажется, проявляется только в режиме выпуска при развертывании на телефонах (цель ARM). Это случайным образом приводит к сбою приложения при переходе с одной конкретной страницы на другую. Это влияет только на эти две конкретные страницы, даже если их структура идентична многим другим в проекте, которые никогда не демонстрируют такого поведения (использование OnNavigatedTo и OnLoaded для представления содержимого и заполнения ViewModel и т. д.)
Единственная подсказка, которая у меня есть (поскольку я не могу получить полную трассировку стека), - это сообщение об ошибке, которое я могу получить с большим трудом методом проб и ошибок:
Это кажется довольно общим, и я пробовал несколько вещей, которые нашел при поиске:
- Обеспечение того, чтобы мои IValueConverters никогда не возвращали нулевые или неожиданные значения.
- Убедитесь, что переменные не остались неинициализированными.
- Обеспечение полной загрузки пользовательского интерфейса перед доступом к любому из его компонентов.
- Обеспечение отсутствия манипуляций с пользовательским интерфейсом за пределами потока Dispatcher.
- Обновление моих проектных библиотек (Newtonsoft JSON и winfbsdk, при этом последний не используется ни в одном из представлений).
После большого чтения я попытался поиграться с параметрами компиляции в настройках проекта и обнаружил, что оскорбительная конфигурация активировала как компиляцию собственного набора инструментов .NET, так и флажки оптимизации кода. Мне удалось воспроизвести сбой в режиме отладки с этими активированными параметрами (по сути, играя с приложением до тех пор, пока случайным образом не появится ошибка), но из-за того, что именно эти параметры были активированы, я не получил трассировку стека. Отладчик просто ломается на строке исключения Unhandled XAML, и даже аргументы sender и e метода, который его запускает, «недоступны в данный момент».
С другой стороны, у меня на телефоне есть несколько минидампов, которые я не могу отладить в Visual Studio 2015. Он не может найти символы kenelbase.pdb, даже если в моей конфигурации проверены серверы символов Microsoft.
Я не могу загрузить приложение в магазин, даже если я оставил включенной опцию собственной компиляции .NET (кажется, нужны обе, в противном случае веб-сайт выдает ошибку во время проверки), поэтому мои пользователи в конечном итоге столкнутся с ошибкой. Если у кого-то есть какие-либо указатели или идеи, я был бы очень признателен.
Редактировать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:
Активация встроенной отладки дает мне следующую stacktrace. Исключение возникает, когда тикает DispatcherTimer (на мой взгляд, его нет, все внутреннее). Кроме того, я не мог понять этого.
Я перепробовал все, что мог придумать, а также реорганизовал весь свой вид. Единственная «странная» вещь, которую я делаю, — это ListView внутри контейнера, который нарушает его виртуализацию, но я не беспокоюсь о производительности, поскольку список действительно мал.