一个典型的Hang dump的分析过程
1. 使用.sympath xxx或者.symfix确定symbol的路径
2. 执行.loadby sos.dll mscorwks或者.load (psscor2.dll的路径)
3. 执行!threadpool查看这个hang是由于cpu利用率高还是由于死锁这样的原因造成的。
可见CPU利用率并不高。
4. 执行 !runaway 查看哪一个线程占用CPU时间最多,检查线程13,23和36
5. 切换到线程13,执行!clrstack:
可以推断是由于Debug.Assert判定失败,弹出了对话框,导致整个程序hang住。
6. 切换到线程23执行 !clrstack:
可见程序执行到Monitor.Enter,正在等待获得一个System.Object。
7. 切换到线程36,可以发现是类似的结果。
8. 执行!syncblk查看同步块:
可见是线程13在own这个同步块。
9. 在确定是线程13的问题以后,现在的目的就是要查看线程13究竟hang在了什么地方。执行!saveallmodule <文件夹路径> 这个命令,把所有载入的module都存放到硬盘上。
10. 打开Reflector,打开刚才存放到硬盘上的所有dll模块。
11. 注意到执行Debug.Assert之前所执行的方法是 在Reflector里面揿F3,搜索HAsMoreStages:
找到该module并执行反汇编,可以看到出错的语句。