首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 程式「未回應」如何定位卡死位置:斷點、執行緒、Dump 分析三步走

     編輯:程式設計綜合問答

現場快速排查

  1. Visual Studio 斷點法:
    按 Ctrl+Alt+Break 中斷執行 → 偵錯 → 視窗 → 執行緒 → 逐一切換執行緒查看呼叫堆疊,找到卡住的執行緒位置。
  2. 輸出診斷日誌:
    關鍵路徑加 Debug.WriteLine 或 log4net,觀察最後一條輸出位置。
  3. 任務管理員 → 建立傾印檔:
    右鍵進程 → 建立傾印檔案 → 用 WinDbg / Visual Studio 開啟 .dmp,指令 !clrstack 查看托管堆疊。

常見卡死原因

原因徵兆對策
UI 執行緒同步等待.Result / .Wait() / Task.Run(...).Result全面改 async/await,避免同步阻塞
死鎖多執行緒互相等待 lock統一鎖順序、使用 Concurrent 集合、縮小臨界區
大量運算未分頁CPU 100%、UI 凍結BackgroundWorker / Task.Run 分批、報告進度
非托管資源洩漏記憶體持增、最終 OOMIDisposable 模式、SafeHandle、定期 GC.Collect 觀察
例外被吞沒無提示直接退出AppDomain.CurrentDomain.UnhandledException 統一記錄

最佳實踐

  • 所有耗時操作 (IO、網路、計算) 必須放入背景執行緒。
  • UI 更新回主執行緒:Invoke/BeginInvoke (WinForms) 或 Dispatcher.Invoke (WPF)。
  • 啟用 Debug → Options → Enable Just My Code 取消勾選,以便進入框架原始碼除錯。
  • 生產環境部署 .pdb 符號檔,便於 Dump 分析定位原始碼行號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved