一个典型的Hang dump的分析过程

排查程序Hang问题
本文介绍了一种排查程序Hang住的方法,通过使用.sympathxxx或.symfix确定symbol路径,加载sos.dll等步骤,最终定位到Debug.Assert断言失败导致的问题。

1. 使用.sympath xxx或者.symfix确定symbol的路径

2. 执行.loadby sos.dll mscorwks或者.load (psscor2.dll的路径)

3. 执行!threadpool查看这个hang是由于cpu利用率高还是由于死锁这样的原因造成的。

  2011040714134541.png

  可见CPU利用率并不高。

4. 执行 !runaway 查看哪一个线程占用CPU时间最多,检查线程13,23和36

  2011040714163155.png

5. 切换到线程13,执行!clrstack:

  2011040714192590.png

  可以推断是由于Debug.Assert判定失败,弹出了对话框,导致整个程序hang住。

6. 切换到线程23执行 !clrstack:

  2011040714215710.png

  可见程序执行到Monitor.Enter,正在等待获得一个System.Object。

7. 切换到线程36,可以发现是类似的结果。

8. 执行!syncblk查看同步块:

  2011040714250225.png

  可见是线程13在own这个同步块。

9. 在确定是线程13的问题以后,现在的目的就是要查看线程13究竟hang在了什么地方。执行!saveallmodule <文件夹路径> 这个命令,把所有载入的module都存放到硬盘上。

10. 打开Reflector,打开刚才存放到硬盘上的所有dll模块。

11. 注意到执行Debug.Assert之前所执行的方法是 在Reflector里面揿F3,搜索HAsMoreStages:

  2011040714331264.png

找到该module并执行反汇编,可以看到出错的语句。

转载于:https://www.cnblogs.com/charrli/archive/2011/04/07/2007893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值