.NET应用程序调试—原理、工具、方法(16)
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[]>对象。
线程死锁比较复杂,这里只给我认为比较简单的命令,通过此命令可以一眼看出哪个线程持有了哪个锁,目前在等待哪个锁。
相关新闻>>
- 发表评论
-
- 最新评论 更多>>