共用方式為


使用 .NET 診斷分析器對受控記憶體傾印進行偵錯

在此教學課程中,您需要:

  • 開啟記憶體傾印
  • 針對傾印選取和執行分析器
  • 檢閱分析器的結果
  • 瀏覽至有問題的程式碼

在本文所述的範例中,問題在於您的 app 不會及時回應要求。

在 Visual Studio 中開啟記憶體傾印

  1. 使用 [檔案 > 開啟 > 檔案] 功能表命令在 Visual Studio 中開啟記憶體傾印,然後選取您的記憶體傾印。

  2. 請注意,在 [記憶體傾印摘要] 頁面上,有一個稱為執行診斷分析的新動作

    Action - Diagnostics Analysis

  3. 選取此動作以啟動偵錯工具,並開啟新的 [診斷分析] 頁面,其中包含依據基礎徵兆組織的可用分析器選項清單。

針對傾印選取和執行分析器

若要調查這些徵兆,最佳選項可在 [處理回應性] 下取得,因為它最符合此範例中的問題。

Select diagnostics analyzers

  1. 按一下 [分析] 按鈕以啟動調查程序

  2. 分析器會根據記憶體傾印中擷取的處理序資訊和 CLR 資料的組合來呈現結果。

檢閱分析器的結果

  1. 在此情況下,分析器發現兩個錯誤。 選取分析器結果以查看分析摘要和建議的補救

    Diagnostics analyzers results

  2. 分析摘要指出「CLR 執行緒集區正經歷資源用盡」。 此資訊建議 CLR 目前已使用所有可用的執行緒集區執行緒,這表示您的服務在發行執行緒之前無法回應任何新的要求。

    注意

    在此情況下,補救是「不要同步等候監視、事件、工作或任何其他可能封鎖執行緒的物件。 查看您是否可以將方法更新為非同步。」。

我的下一個工作是找出有問題的程式碼。

  1. 按一下 [顯示呼叫堆疊] 連結,Visual Studio 會立即切換至顯示此行為的執行緒。

  2. [呼叫堆疊] 視窗會顯示可能快速地區分我的程式碼 (SyncOverAsyncExmple.) 與 Framework 程式碼 (System.) 的方法。

    Diagnostics analyzers link to call stack

  3. 每個呼叫堆疊框架都會對應至一個方法,按兩下堆疊框架 Visual Studio 會瀏覽至直接導致此執行緒上此情況的程式碼。

  4. 在此範例中,沒有符號或程式碼,不過,您可以在 [未載入的符號] 頁面上選取 [反向組譯原始程式碼] 選項。

    Decompilation

  5. 在下面的反向組譯來源中,很明顯非同步工作 (ConsumeThreadPoolThreadThread) 正在呼叫同步封鎖函式。

    注意

    包含 WaitHandle.WaitOne 方法的 "DoSomething()" 方法,會封鎖目前執行緒集區執行緒,直到收到訊號為止。

    若要改善應用程式的回應性,請務必從所有非同步內容中移除封鎖同步程式碼。

    Analyze decompiled code