2009-04-16 27 views
4

我正在與一個第三方部分爲我們寫一些有點不可靠的(Qt/windows)應用程序(只是試圖改變那裏的責任)。他們的最新版本更加穩定。有點。我們收到的崩潰報告越來越少,但我們收到很多關於崩潰的報道,並且永遠不會回來。情況各不相同,在我們收集的信息很少的情況下,我們無法再現問題。崩潰報告看門狗當我的應用程序鎖定在客戶的機器上

所以理想情況下,我想創建一些監視程序,它會注意到應用程序已被鎖定,並提供將崩潰報告發回給我們。好主意,但有問題:

  • 看門狗如何知道進程已掛?據推測,我們會對應用程序進行測試,以定期對監督人員說「一切正常」,但是我們在哪裏放置這樣的內容以保證它足夠頻繁地發生,但不太可能在應用程序結束時的代碼路徑上鎖定。

  • 當發生崩潰時,看門狗應該報告哪些信息? Windows有一個體面的調試api,所以我相信所有有趣的數據都是可訪問的,但我不確定什麼對追蹤問題有用。

回答

5

您想要一個小型轉儲(如果您不想添加您自己的小型轉儲生成代碼,請使用DrWatson創建這些組合)以及userdump在掛起時觸發小型轉儲創建。

關於自動檢測掛起的一件事是,它很難決定什麼時候掛起,什麼時候掛起,什麼時候它只是緩慢或被IO等待阻塞。我個人更喜歡讓用戶在認爲掛起時故意使應用程序崩潰。除了更容易(我的應用程序不會經常掛起,如果有的話)),它也幫助他們「成爲解決方案的一部分」。他們喜歡那樣。

首先,查看關於故障轉儲和符號的經典bugslayer article,其中還包含有關這些事情發生的一些優秀信息。

其次,獲得userdump它允許你創建轉儲和instructions設置它生成轉儲

當你有轉儲,WinDbg打開它,你將能夠檢查整個節目狀態 - 包括線程和調用堆棧,寄存器,內存和函數參數。我想你會特別感興趣的是在Windbg中使用「~*kp」命令來獲取每個線程的調用堆棧,並使用「!locks」命令來顯示所有鎖定對象。我認爲你會發現這個掛起是由於同步對象的死鎖造成的,因爲所有線程都傾向於等待WaitForSingleObject調用,所以很難追蹤到這些同步對象,但是往下查看調用堆棧以查看應用程序線程(而不是比'框架'線程,如背景通知和網絡例程)。一旦你縮小了範圍,你就可以看到正在進行的通話,可能會嚮應用程序添加一些日誌記錄工具,以便在下次失敗時爲您提供更多信息。

祝你好運。

Ps。快速谷歌提醒我這個:Debugging deadlocks。 (CDB是相當於windbg的命令行)

1

我認爲一個單獨的應用程序來執行監視功能可能會產生比解決問題更多的問題。相反,我建議你在應用程序崩潰時首先創建處理程序以生成小型轉儲程序,然後嚮應用程序添加一個監視程序線程,如果應用程序關閉,將會DELIBERATELY崩潰。看門狗線程(相對於另一個應用程序)的優勢在於,監視器應該更容易知道該應用程序已經離開軌道。

一旦你有了MiniDump,你就可以在應用程序死亡時找到它的狀態。這應該給你足夠的線索來找出問題,或者至少在哪裏看下。

在CodeProject上有一些關於MiniDumps的東西,這可能是一個有用的例子。 MSDN也有關於它們的更多信息。

+0

您不必崩潰應用程序才能創建小型轉儲。您可以隨時調用MiniDumpWriteDump()。 – 2009-04-17 03:10:47

2

您可以使用Microsoft的Windows調試工具ADPlus來識別掛起。它將附加到您的進程並在進程掛起或崩潰時創建轉儲(小型或全部)。

WinDbg是可移植的,並且不必安裝(但您必須配置符號)。您可以創建一個特殊的安裝程序,使用批處理來啓動您的應用程序,該應用程序在您的應用程序啓動後也會運行ADPlus(ADPlus是一個命令行工具,因此您應該能夠找到一種方法將其合併)。

順便說一句,如果您確實找到了一種方法來識別內部掛起並能夠使進程崩潰,您可以使用Windows Error Reporting進行註冊,以便將崩潰轉儲發送給您(如果用戶允許)。

1

不要擔心看門狗。訂閱Microsoft的Windows Error Reproting(winqual.microsoft.com)。他們會爲你收集堆棧跟蹤。事實上,他們很可能今天已經這樣做了;他們不會分享他們,直到你註冊。

相關問題