背景:
对于有界面的应用程序来说, Windows增加了程序挂起的检查(Not Responding). 默认下原理是这样的:
负责UI的线程在5秒内如果不能把发送给它的mouse/keyboard输入消息取走,那么Windows 的Desktop Manager 会创建一个ghost window在另外的进程(dwm.exe)上去。 Windows的任务管理器调用IsHungAppWindow来判断某个程序是否hung了。
问题:
这个默认的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比较合适)。然后重新启动机器这个参数才能生效。
Registry key: HKCU\Control Panel\Desktop Data type: REG_SZ
Value name: HungAppTimeout Data: Milliseconds (in decimal)
(2) 启动你的程序
(3) 运行ProcDump –h 选项在后台自动监测。