先來介紹一下我工作的地方的一些環境吧!

我們這邊用 Team Foundation Server 來作版本控管,另每天在指定時間透過 ClickOnce 的方式將寫好的程式發佈出去給各單位使用

而我們有三個環境:

  • 本機測試環境:透過本機架設 Server 端及 Client 端來作測試
  • 遠端測試環境:有架設一台發佈伺服器及 Server ,當進行 ClickOnce 發佈服務時會更新這邊的資料
  • 正式環境:於正常工作日時會在指定時間將 ClickOnce 發佈的資料 Copy 過來發佈到各正式環境的 Server 並更新各單位的 Client 端的資料

這次遇到的問題就是兩個測試環境上執行某指定功能時都正常,但在正式環境點擊指定按鈕時整個畫面就會被 Hang 住...

因為在測試環境上都是正常的,所以增加了我抓取問題的難度,去 Google 後找到了兩個工具

全都下載安裝後就來使用了,首先先用 Debug Diagnostic Tool 來取得除錯用的資料

001

安裝完後在開始工具列的選單,那我就先執行 DebugDiag 2.0 Collection 了

執行後會詢問建立規則

003

那因為我是畫面整個 hang 不動,所以我就選 Crash 並設定他是哪個執行緒,讓他依規則去監控

002

建完後規則就像圖示那樣,然後我就在正式環境執行該功能了

另還可以在 hang 時跳到 Process 找到該執行緒上按右鍵,選擇 Create Full Userdump亦可

在設定的目錄下,正常 Crash 時會有產生一個 txt 的 Log 檔及一個 dmp 檔

這時我發現在 txt 檔中就有呼叫堆疊並有顯示 Exception

***********************
*  EXCEPTION DETAILS  *
***********************

DetailID = 1
	Count:    1
	Type:     System.NullReferenceException
	Message:  
	Stack:    
		System.Windows.Forms.SendKeys.LoadSendMethodFromConfig()
		System.Windows.Forms.SendKeys.Send(System.String, System.Windows.Forms.Control, Boolean)
		System.Windows.Forms.SendKeys.Send(System.String)
		xxxxx.client.ucl.UCLDataGridViewUI.dgv_CellEnter(System.Object, System.Windows.Forms.DataGridViewCellEventArgs)

詳細完整的就不丟了,只放上發生例外的片段

這時就發現他的例外是 System.NullReferenceException,而引發錯誤的是 xxxxx.client.ucl.UCLDataGridViewUI 這物件的 dgv_CellEnter

因為以前正常現在不正常,就透過 TFS 查閱是否有其它人更動該檔案並導致該功能會 crash 掉,找到兇手後問題也就解決了

 

主要只要看得到呼叫堆疊,其實問題解決九成了,所以我也就沒有實驗 WinDbg 了,等之後有空再實驗該工具!


 

Reference:

今天成功的利用 WinDbg 分析與解決程式 Hang 住的狀況

arrow
arrow
    文章標籤
    Debug Diagnostic Tool crash hang
    全站熱搜

    MyWCT 發表在 痞客邦 留言(1) 人氣()