Необработанное исключение UWP только в режиме выпуска

В течение недели я боролся с ошибкой в ​​моем опубликованном приложении 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 внутри контейнера, который нарушает его виртуализацию, но я не беспокоюсь о производительности, поскольку список действительно мал.


person Gregorio Juliana    schedule 26.03.2016    source источник
comment
blogs.msdn.microsoft.com/ntdebugging/2014/01/13/   -  person Hans Passant    schedule 26.03.2016
comment
Вы сериализуете что-то при переходе на/со страницы? Если да, то вам следует добавить это пространство имен\классы\и т. д. в файл [ProjectName].rd.xml в свойствах.   -  person Mykyta Bondarenko    schedule 26.03.2016
comment
@NikitaBondareko не совсем там, но я вызываю асинхронный метод (ожидаемый, возвращает задачу) из моей модели представления, который может вызвать другой, который, в свою очередь, выполняет некоторые HTTP-вызовы к JSON REST API ... что мне тогда добавить? Структура такая: (сбой) View -> ViewModel -> Сервис, который выполняет вызов и десериализацию.   -  person Gregorio Juliana    schedule 26.03.2016
comment
скорее всего проблема в отсутствии метаданных ваших объектов. Как это сделать, вы можете найти здесь - msdn.microsoft .com/en-us/library/dn600638(v=vs.110).aspx   -  person Mykyta Bondarenko    schedule 26.03.2016
comment
@NikitaBondarenko изменил Properties/Default.rd.xml, но все равно вылетает =/.   -  person Gregorio Juliana    schedule 26.03.2016
comment
Переход по ссылке @HansPassant и, наконец, получение правильных символов (пока не наткнулся на kernelbase.pbd) приводит меня к этому далеко не идеальному трассировка стека   -  person Gregorio Juliana    schedule 26.03.2016
comment
@GregorioJuliana, попробуйте запрос комментариев и анализ -› будет работать нормально или тоже вылетит?   -  person Mykyta Bondarenko    schedule 26.03.2016
comment
e.ClickedItem будет сериализован в файле истории навигации - вам нужно будет добавить его тип в файл rd.xml. (Я имею в виду фактический тип clickedititem.)   -  person Tamás Deme    schedule 26.03.2016
comment
@NikitaBondarenko все еще падает. Однако потребовалось некоторое время, но то же исключение.   -  person Gregorio Juliana    schedule 26.03.2016
comment
@TamásDeme Я добавил все пространство имен моделей (на самом деле их два), но безрезультатно =/   -  person Gregorio Juliana    schedule 26.03.2016
comment
@GregorioJuliana, теперь попробуйте прокомментировать свой xaml шаг за шагом, пока приложение не вылетит   -  person Mykyta Bondarenko    schedule 26.03.2016


Ответы (1)


Это невероятно странно (по крайней мере, для меня), но, очевидно, код навигации, показанный выше, не выполнялся в потоке Dispatcher... даже если он был вызван событием пользовательского интерфейса. Отправка звонка диспетчеру следующим образом сделала свое дело:

private async void SessionList_ItemClick(object sender, ItemClickEventArgs e)
{
   await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(ClubPage), e.ClickedItem)); 
}

Идентичный код (без явной оболочки Dispatcher.RunAsync), распределенный по всему приложению, работает должным образом. Каждый раз, когда я сталкивался с проблемами потока пользовательского интерфейса, выбрасываемые исключения управлялись и легко воспроизводились... что могло произойти во время процесса оптимизации компилятора, что могло вызвать это?

person Gregorio Juliana    schedule 27.03.2016
comment
Привет! Я работаю в команде среды выполнения и компилятора .NET Native. Жаль слышать, что это доставляет тебе неприятности. Похоже, вы можете заставить проблему проявить себя в DEBUG с включенным .NET Native, что должно помочь отследить это. У меня есть одно предложение: останавливаться на всех исключениях первого шанса (Отладка > Окно > Настройки исключений > установите флажок Common Language Runtime). Многие компоненты перехватывают исключения, с которыми они не имеют дела, так что это часто бывает очень полезно. Не стесняйтесь, пишите нам по адресу [email protected]... у других людей могут быть еще идеи. - person MattWhilden; 28.03.2016
comment
@MattWhilden Привет! Спасибо, что заглянули, очень ценю это. Я сделал, как вы сказали (на самом деле я проверил их все, на всякий случай), и все, что я получил после того, как, наконец, воспроизвел ошибку, было это: Исключение. Как указывалось ранее, я нахожу эту проблему только с включенной опцией «Оптимизировать код», помимо собственной компиляции .NET, поэтому я думаю, поэтому я не получаю больше информации. - person Gregorio Juliana; 29.03.2016
comment
Спасибо, Мэтт, это помогло мне, я получал сообщение об ошибке ExcectionHelpers.cs not found, что оказалось проблемой в погодном PCL. - person peterincumbria; 23.04.2016
comment
У меня также есть приложение, которое отлично работает в режиме отладки, но имеет всевозможные ошибки диспетчера в режиме выпуска. Я подозреваю, что это как-то связано с тем, что я вызываю диспетчеров через метод расширения. - person William Jockusch; 17.01.2017
comment
Спасибо! Это очень помогло - person Billy Jake O'Connor; 26.01.2017