簡體   English   中英

Windows Store App中的間歇性應用程序在啟動時掛起

[英]Intermittent application hang on startup in Windows Store App

我正在開發Windows應用商店應用程序。 目前,我正在間歇性掛起,如本博客文章所述 問題似乎在於,沒有足夠的空間分配給其余定義的列寬,並且TextBlock嘗試自行格式化(可能是由於省略號處理)。 發生這種情況時,我的應用程序會無限期地掛起。

我所關心的問題與如何解決問題(在博客文章中似乎描述得很好)無關,而與如何找到問題有關。 我在“集線器頁面”上有一個相當定期的(大約五分之一或十個初創企業),所以我一直在那兒瀏覽(因為它是最著名的問題實例),但這是一個真正的Heisenbug,因為它從未出現過在調試時(或尋找時)發生。

那么,如何找到有問題的代碼? 我是否需要尋找一種模式( ColumnWidth="*" ?)。 有沒有更簡單的方法來解決此問題,例如更改基本樣式以刪除博客文章中列出的可能令人討厭的屬性之一?

看來這可能是由另一個問題引起的,但是到目前為止,這似乎是最有可能/最有可能的(因為對於集線器,我所遇到的情況與此處描述的情況類似)。

另外,有沒有辦法跟蹤這種情況何時發生? MSFT在掛起時提供崩潰轉儲,但它們似乎一點也沒有提供任何信息(最重要的是,它們僅在發生后5天才出現,這不理想)。

謝謝!

這是一個復雜的問題。

首先,我認為您已經確定了WinRT的真正問題。 您認為布局子系統似乎在忙於計算布局,並且基於某種情況(大約20%的時間發生),它在任何合理的時間內都沒有完成。 合理的猜測。

問題是,在調試期間未發生此類事件。 以我的個人開發經驗,調試中不會發生的錯誤與99.99%的時序有關。 在第二個過程開始之前,某些事情尚未完成。 調試使那些漫長的過程得以完成。

這是一個真正的計算機科學問題,而不是WinRT或Windows 8問題。 為此,我在沒有任何代碼示例的情況下能給您的最佳答案(為什么沒有代碼示例?)是我遇到相同困境時采用的典型方法。 我希望至少能有所幫助。

從你的大腦開始。

我一直和開發人員開玩笑說,在調試器之外可以進行多少調試-在您的腦海中。 仔細研究應用程序的流程,尋找可能導致死鎖的競爭條件依賴項。 信不信由你,這解決了調試器永遠無法捕獲的許多問題-因為調試器可以消除時序依賴性。

接下來是簡單性。

問題越復雜,您發現罪魁禍首的可能性就越小。 對於XAML應用程序,我傾向於首先刪除或禁用值轉換器。 然后,我希望刪除數據模板。 如果您有元素綁定,那么接下來。 如果簡化XAML確實有幫助-那只是弄清楚它的開始。 如果不是這樣,事情就變得容易了。

您只需敲擊幾下即可禁用后面的代碼,並且有罪或無辜。 我發現這是最有可能解決您問題的地方,也是我們努力保持簡單,整潔和最小化的原因。 在那之后,有視圖模型。 盡管您的視圖模型並非不可能成為一個視圖模型,並且確實仍然需要檢查,但它可能不是邪惡的根源。

最后,應用程序管道可以加載頁面,加載數據或執行其他任何操作。 逐步解決問題的唯一選擇就是從應用中慢慢刪除內容,直到看不到問題為止。 消除問題雖然沒有解決。 這是基於您的應用及其邏輯的案例。 現實情況是,當真正的問題在視圖模型或其他地方時,刪除XAML時您可能會看到問題消失了。

我到底在說什么 您要的銀彈確實不存在。 有幾種Microsoft工具,甚至還有更多第三方工具來尋找瓶頸,延遲問題,緩慢的代碼和其他東西-但實際上,您描述的場景是普通的ole編程。 並不是說您不是錯誤的受害者。 我是說,有了我們掌握的信息,這就是我能為您做的一切。

你會明白的。

第三件事是向您的應用程序添加日志記錄和檢測。

祝你好運。

鑒於Jerry已在較高級別上回答了這個問題,我想我會在較低級別的回答中加上從表達您的問題的方式使我認為您感興趣的答案。我想首先我想談談最后一項轉儲文件。 Microsoft提供了一種通過Windows錯誤報告來“狂野地”獲取進程轉儲文件的機制。 如果您想從失敗的客戶端進程中收集轉儲文件,則可以注冊Windows錯誤報告(我必須承認,我從未真正做過,但是我確實調查了一下,並試圖讓我目前的雇主允許我這樣做,但並未成功結束)。 要注冊,請轉到建立硬件/台式機帳戶頁面

至於轉儲文件的處理方式,您將要下載Windows的調試工具( Windows SDK下載的一部分 )和/或Debug Diag Tool (我必須承認,我的工作更多是調試Windows用戶的工具而不是Debug Diag用戶的工具)。 這些將為您提供工具,以調查底層的情況。 顯然,您只能走到無法訪問Microsoft私有符號的地步,但可以訪問公共符號,通常這些符號足以使您對問題區域有一個很好的了解。

您的主要工具將取決於問題的可重復性。 如果它只能在某些客戶端計算機上再現,則您將不得不依靠查看Windows錯誤報告中可能保存的單個轉儲文件。 在這種情況下,我將使用適當版本的Windbg(x86或x64)打開它,然后查看進行轉儲時發生了什么。 根據您的熟練程度,您可以走多遠。 大概一個簡單的開始就可以運行

.symfix
.reload
.loadby sos clr
!EEStack

這將加載Microsoft公共符號,用於處理托管代碼檢查的sos擴展dll,然后將轉儲進程中每個線程的堆棧內容。 通過查看出現在調用堆棧上的方法的名稱,您可能至少可以很好地了解發生鎖定的代碼區域。

您可以走得更遠,因為Windbg提供了深入進行死鎖分析的能力(例如,Windbg有一個名為sosex的擴展可以提供命令!dlk ,有時可以自動為您檢測死鎖。要將擴展dll加載到Windbg中,您只需下載它,然后調用.load fullpathtodll )。 如果問題可以在本地重現,則使用WPA / WPR可能會更成功,或者如果真的很幸運,可以進行簡單的procmon跟蹤。 這些工具確實需要相當長的入門時間,因為它們需要一些時間來學習。 但是,如果您真的對該主題感興趣,那么最好的資源就是Channel9上的Defrag Tools系列以及Mario Hewardt撰寫的任何文章(特別是他的書“ Advanced .Net Debugging”)。 同樣,熟悉這些工具可能會花費很多時間,但是至少如果您只知道如何從轉儲文件中轉儲堆棧的內容,有時您就可以從中獲得所需的內容,從而對這些工具有了基本的了解。這些工具也可能是有益的。

暫無
暫無

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

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