一个典型的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并执行反汇编,可以看到出错的语句。

posted on 2011-04-07 14:36  李志鹏  阅读(2613)  评论(0编辑  收藏  举报

导航