背景:
對於有界面的應用程序來說, Windows增加了程序掛起的檢查(Not Responding). 默認下原理是這樣的:
負責UI的線程在5秒內如果不能把發送給它的mouse/keyboard輸入消息取走,那么Windows 的Desktop Manager 會創建一個ghost window在另外的進程(dwm.exe)上去。 Windows的任務管理器調用IsHungAppWindow來判斷某個程序是否hung了。
詳細參看http://blogs.msdn.com/b/meason/archive/2010/01/04/windows-error-reporting-for-hangs.aspx
http://blogs.msdn.com/b/wer/archive/2009/03/19/let-there-be-hangs-part-1-not-responding.aspx
問題:
這個默認的5秒非常短暫,對於手動抓取memory dump來說非常難以操作,而且如果你還不確認什么情況下會發生程序掛起就更加難上加難. 有什么辦法能自動抓取memory dump么?
解決辦法:
使用ProcDump的h選項:
ProcDump –ma –64 –h testhung.exe testhung.dmp
這個-h選項借助Windows IsHungAppWindow API來判斷什么時候觸發抓取memory dump,也即默認下使用5秒這個參數。ProcDump只會為第一次超過5秒的情況抓取memory dump, 然后等待直到程序退出,ProcDump不會把所有超過5秒的情況都分別抓取dump.
對於有些程序比如AX客戶端,有些費時操作肯定會超過5秒,如果使用5秒作為開關那么抓取的那份memory dump可能還不是最重要的,如何抓取相對耗時比較長的時刻的memory dump呢?
Option A: 手動方式
如果發生程序掛起時候你有足夠的操作時間,那么可以把 Task Manager運行起來找到掛起的程序進程,然后點擊菜單Create Dump File生成一份memory dump.
Option B: 自動方式
(1) 參照下面blog設置HungAppTimeout注冊表值到一個合適的值 (比如你的程序掛起在30-50秒之間,那么設置HungAppTimeout=30000比較合適)。然后重新啟動機器這個參數才能生效。
http://blogs.msdn.com/b/meason/archive/2010/02/04/hungapptimeout.aspx
Registry key: HKCU\Control Panel\Desktop Data type: REG_SZ
Value name: HungAppTimeout Data: Milliseconds (in decimal)
(2) 啟動你的程序
(3) 運行ProcDump –h 選項在后台自動監測。