.NET应用程序调试—原理、工具、方法(16)

来源:未知 责任编辑:责任编辑 发表时间:2015-05-17 16:44 点击:

6245ab98  4000c79        0      System.Object[]  0   shared   static _emptyArray
   >> Domain:Value dynamic statics NYI 00359520:NotInit  <<


这里需要注意的是,如果你是想执行!Clrstack -a 命令的话,当你使用调试器启动或者是附加进程的方式的化,要记住切换到适当的线程上才能看行。

7.2.线程问题(CPU过高,线程死锁)

CPU过高也是线上比较棘手的问题之一,查看CPU过高的步骤一般分为两步,查看线程的执行时间,然后切换到线程上下文,执行!ClrStack -a,看当前线程在哪里工作,到底做什么操作呢。

0:004> !runaway
User Mode Time
 Thread       Time
  0:143310      0 days 0:00:01.934
  4:142ac0      0 days 0:00:00.046
  7:143874      0 days 0:00:00.000
  6:143870      0 days 0:00:00.000
  5:14386c      0 days 0:00:00.000
  3:1432ec      0 days 0:00:00.000
  2:143384      0 days 0:00:00.000
  1:143254      0 days 0:00:00.000

测试线程ID为0的执行时间比较大,我们需要切换到线程0上去执行查看调用堆栈信息,~0s。

0:000> !ClrStack -a

0028f348 62b897f9 System.IO.TextWriter+SyncTextWriter.WriteLine(Int32)
   PARAMETERS:
       this (<CLR reg>) = 0x01b74258
       value = <no data>

0028f358 62a66313 System.Console.WriteLine(Int32)
   PARAMETERS:
       value = <no data>

0028f364 004f0100 OrderManager.Program.Main(System.String[]) [e:\NETDebug\DebugDemoProject\OrderManager\Program.cs @ 22]
   PARAMETERS:
       args (0x0028f38c) = 0x01b71fe4
   LOCALS:
       0x0028f380 = 0x01b746c0
       0x0028f388 = 0x000498ac
       0x0028f37c = 0x16a2e338
       0x0028f384 = 0x00000001

0028f51c 63162952 [GCFrame: 0028f51c]

我们会发现在Main方法中有一个本地变量0x0028f380 ,保存的值是0x01b746c0,它就是指向刚才分配很多内存的List<byte[]>对象。

线程死锁比较复杂,这里只给我认为比较简单的命令,通过此命令可以一眼看出哪个线程持有了哪个锁,目前在等待哪个锁。

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 用C#制作屏幕捕获程序
  • 遍历ArrayList易犯错误
  • 使用C#编写LED样式时钟控件
  • C#对XML操作:一个处理XML文件的类(1)
  • 怎样用C#实现完整文档打印功能
  • DataList嵌套问题 如何删除内层子DataList的记录
  • 使用c#+(datagrid控件)编辑xml文件
  • C#生成CHM文件(应用篇)之代码库编辑器(5)【总结、程序、源代码】
  • .NET简谈自定义事务资源管理器
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索 - 移动版 - 返回顶部
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1