2017-05-25 56 views
0

我們在我們的應用程序中使用了大量的自定義Windows服務。然而,我目前正在研究的這個問題有一個令人生氣的問題:當服務繼續運行時,它會停止運行。如何識別Windows服務中的內部故障

服務的主要方法包裝在try/catch塊,像這樣:

static void Main() 
{ 
    IRepository rep = new Repository(); 
    ILogger log = LogManager.GetLogger(GetType().Name); 

    TimeSpan loadWindowStart = new TimeSpan(9, 0, 0); 
    TimeSpan loadWindowEnd = new TimeSpan(18, 0, 0); 

    foreach (SuppressionLoad sl in rep.GetSuppressionLoads().ToList()) 
    { 
     try 
     { 
      // do stuff 
     } 
     catch(Exception ex) 
     { 
      // log error 
     } 
    } 
} 

該服務還記錄因爲它的東西,我們可以看日誌填滿,而它的忙。

但是,有時候,日誌會停止。數據庫中其他地方的活動表明整個服務已停止工作。在服務器上籤入服務,該服務仍顯示狀態爲「已啓動」。它處於這種狀態時幾乎佔用零系統資源,儘管它通常處理器密集型。如果你試圖阻止它,那麼它只是試圖超時,並且據我們所知,它從來沒有停止過。該進程必須在任務管理器中被終止。

在這些攤位運行的日誌中沒有任何不良行爲。在事件查看器中我們也找不到任何東西。

由於它沒有記錄錯誤,所以我不知道這裏發生了什麼,或者我們可以做些什麼來從這裏嘗試診斷故障。這是高度間歇性的 - 在進入該州之前它通常會運行幾天而沒有問題。我們可以做什麼來調查發生了什麼?

+0

聽起來你需要查看服務的代碼,開始使用調試器,並通過代碼步驟..也許你可能想考慮改變你做記錄的方式..也許直接寫入日誌文件或者每次創建一個新的日誌文件。 – MethodMan

+0

@MethodMan平穩過渡雖然很好,但是這種失敗是如此的間歇以至於它不是一個真正的實際選擇。 –

+0

沒有多少我可以建議然後除了..也許你正在創造資源,而不是正確地處理它們。以及什麼時候異常消息你陷阱..等..? – MethodMan

回答

1

Matt;在最好的條件下難以發現諸如這些難解的問題 - 如果你的服務恰好使用了線程(我認爲它是這樣的話),它變得非常困難,你不能依賴全球性的try/catch。

一個簡單的事情就是嘗試NBug(無關聯)。它會捕獲未處理的異常並給你一些關於它們的信息。儘管如此,我認爲這不會讓你感到滿意。

找到這些東西的一般方法是日誌,日誌,日誌。您必須能夠儘可能地重現問題 - 您需要能夠告訴您每個方法的入口點,變量值,如果命中的異常堆棧跟蹤,您在每種方法中花了多長時間的日誌等。一些非常好的工具用於記錄some logging tools,所以我不會爲推薦任何東西而煩惱。您可以將自己的日誌記錄封裝在條件編譯開關中,因此一旦發現問題,關閉時就不會受到性能影響。

可能不是你想要的答案,但是多年來唯一真正爲我工作的東西。

SteveJ

+0

不是我想聽的,但其他人發現有幫助。 +1 –

1

這聽起來像問題可以在任何地方,並不一定有很多事要做與提供的代碼。

建議如何去它

  1. 當服務掛起,附加一個調試器,看看線程,看看每一個都是。您可能需要重新編譯並運行解決方案的調試版本,以便調試器具有必要的上下文符號數據。要問的問題:

    1. 我期待在那裏的所有線程是否存在,或者某些線程已經消失或不明瞭?
    2. 線程是否陷入僵局(我懷疑發生了什麼),如果是這樣,在什麼資源。
  2. 打開詳細的日誌記錄,並在更多的調試日誌語句中添加代碼流,以查找代碼流中的位置以及未執行的位置,然後繼續縮小位置。考慮記錄上下文數據,以便在隔離有問題的行或代碼塊時,可以使用上下文來嘗試理解奇怪行爲發生的原因。請注意記錄敏感信息(例如密碼,PII等)
  3. 完全稱爲IInspectable的評論,您可以嘗試完整轉儲過程(SysInternal's Process ExplorerProcDump讓你這樣做,或Task Manager)。它使用該工具往往是一個相當多的參與經驗,但使用權利可以提供很多見解,並可能在首次發現時發現問題。

考慮到它不經常發生,並且什麼地方和哪裏是廣泛開放的領域,爲了縮小範圍,可能需要幾次迭代來解決問題。

+0

如果您縮小範圍但仍看不到原因,請更新您的問題並ping我 - 我很樂意進一步提供幫助。 – LB2