Not Responding 程序掛起


背景:

對於有界面的應用程序來說, 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.

image

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 選項在后台自動監測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM