簡體   English   中英

UWP 未處理異常僅在 Release 模式下

[英]UWP unhandled exception only in Release mode

我已經為我發布的 UWP 應用程序中的一個錯誤苦苦掙扎了一個星期,該錯誤似乎只在部署在手機(ARM 目標)上時才以發布模式表現出來。 從一個特定頁面導航到另一個頁面時,它會隨機使應用程序崩潰。 它只影響這兩個特定頁面,即使它們的結構與項目中從不顯示此行為的許多其他頁面相同(使用 OnNavigatedTo 和 OnLoaded 來呈現內容並填充 ViewModel 等)

我唯一的線索(因為我無法獲得完整的堆棧跟蹤)是這個錯誤消息,我可以通過反復試驗很難得到它:

例外

它似乎非常通用,我在尋找它時嘗試了幾件事:

  • 確保我的 IValueConverters 永遠不會返回空值或意外值。
  • 確保沒有變量未初始化。
  • 在訪問其任何組件之前確保 UI 已完全加載。
  • 確保在 Dispatcher 線程之外沒有 UI 操作。
  • 更新我的項目庫(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:

我注意到當崩潰發生時,我的視圖中的幾個圖像都沒有加載。 有一些從捆綁內容 (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:

激活本機調試為我提供了以下stacktrace 當 DispatcherTimer 滴答時引發異常(我認為沒有,一切都是內部的)。 除此之外,我無法理解它。

我已經嘗試了我能想到的所有方法,並且還重構了我的整個視圖。 我正在做的唯一“奇怪”的事情是容器內的 ListView 打破了它的虛擬化,但我並不關心性能,因為列表真的很小。

這非常奇怪(至少對我而言),但顯然上面顯示的導航代碼沒有在 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 線程問題時,拋出的異常都會被管理並且易於重現......在編譯器優化過程中可能會發生什么可能會觸發這個問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM