2012-10-07 68 views
1

我的服務工作完全正常,隨機時間量然後停止。C#如何調查爲什麼我的服務意外停止

我正在捕捉所有可以看到的異常。 我已經添加了一個try/catch創建服務,試圖獲得某種錯誤,但我什麼也沒有得到。該服務剛剛停止。

 try 
     { 
       ServiceBase[] ServicesToRun; 
       ServicesToRun = new ServiceBase[] { new my_service() }; 
       ServiceBase.Run(ServicesToRun); 
     } 
     catch (Exception e) 
     { 
      logEvent(e); // Log any errors to a .txt file. 
     } 

事件查看器顯示以下內容:

Faulting application name: my_service.exe, version: 0.9.2.1, time stamp: 0x50717154 
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7b96e 
Exception code: 0xc0000005 
Fault offset: 0x00055f99 
Faulting process id: 0x%9 
Faulting application start time: 0x%10 
Faulting application path: %11 
Faulting module path: %12 
Report Id: %13 
+0

您可以嘗試將visual studio調試器附加到服務進程並等待發生錯誤? – pilotcam

+0

@CathalMF你有所進步嗎?我們幫助你了嗎? – mbarthelemy

回答

7

這是不可能猜到了什麼問題你給的信息。但是您可以嘗試使用技巧來捕獲每個未捕獲的異常,並將其記錄下來。

這是我在我的項目怎麼辦:

首先,在我的主要(),我suscribe以下事件:

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; 

我定義了處理程序,它只是記錄的堆棧跟蹤到一個文件並打印到控制檯(儘管它無關你,因爲你運行你的應用程序作爲服務):

private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e){ 
     try{ 
      Logger.Append(Severity.CRITICAL, "Unhandlable error : "+e.ExceptionObject); 


     }catch{} 
     Console.WriteLine("Unhandlable error : "+e.ExceptionObject); 
     Environment.Exit(10); 
    } 
+0

這幫了我。問題是在「finally」塊中發生了異常,這就是爲什麼我沒有在日誌中看到它的原因。不要像我一樣愚蠢= / – wsbaser

3

如果您的服務已啓動並運行,記錄周圍Run()不會對你有太大的好處,因爲在這種方法中沒有太多的執行。它基本上只會觸發你的服務的OnStart方法。

正常情況下,您的服務的OnStart方法啓動一個全新的線程來運行實際的服務。在那個線程中你需要做日誌記錄。圍繞Thread的整個threadstart方法放置一個try/catch,或者訂閱AppDomain.CurrentDomain.UnhandledException應該會給你任何例外,你的服務正在生成並且沒有捕獲,所以你可以記錄它們。

雖然(這很難知道,因爲你沒有顯示服務的代碼)的問題似乎是服務在ntdll.dll崩潰,這可能是一個pinvoke(調用一個外部本地DLL),其中意味着你可能沒有得到任何例外。調試本機崩潰是一個完全不同的科學。

1

您可以隨時做一個簡單的控制檯應用程序,參考程序集並從控制檯應用程序中調用代碼並輕鬆地進行調試。 (通過遠投最簡單的選擇)。