zoukankan      html  css  js  c++  java
  • Windbg 调试CPU占用过高

    1.!runaway

    !runaway命令显示每个线程消费的时间

    Bit 0 (0x1) 让调试器显示每个线程消耗的用户模式时间(user time),默认不加就是0x1
    Bit 1 (0x2) 显示每个线程消耗的内核时间(kernel time)。
    Bit 2 (0x4) 显示每个线程从创建开始经历了多少时间。
    就是三者的组合:1 2 3 4 5 6 7
    1. 0:002> !runaway   
    2.  User Mode Time  
    3.   Thread       Time  
    4.    0:890       0 days 0:00:00.031  
    5.    2:a00       0 days 0:00:00.000  
    6.    1:1174      0 days 0:00:00.000  
    7. 0:002> !runaway 1  
    8.  User Mode Time  
    9.   Thread       Time  
    10.    0:890       0 days 0:00:00.031  
    11.    2:a00       0 days 0:00:00.000  
    12.    1:1174      0 days 0:00:00.000  
    13. 0:002> !runaway 2  
    14.  Kernel Mode Time  
    15.   Thread       Time  
    16.    0:890       0 days 0:00:00.062  
    17.    2:a00       0 days 0:00:00.000  
    18.    1:1174      0 days 0:00:00.000  
    19. 0:002> !runaway 3  
    20.  User Mode Time  
    21.   Thread       Time  
    22.    0:890       0 days 0:00:00.031  
    23.    2:a00       0 days 0:00:00.000  
    24.    1:1174      0 days 0:00:00.000  
    25.  Kernel Mode Time  
    26.   Thread       Time  
    27.    0:890       0 days 0:00:00.062  
    28.    2:a00       0 days 0:00:00.000  
    29.    1:1174      0 days 0:00:00.000  
    30. 0:002> !runaway 4  
    31.  Elapsed Time  
    32.   Thread       Time  
    33.    0:890       0 days 0:38:34.825  
    34.    1:1174      0 days 0:38:34.793  
    35.    2:a00       0 days 0:38:24.528  
    36. 0:002> !runaway 7  
    37.  User Mode Time  
    38.   Thread       Time  
    39.    0:890       0 days 0:00:00.031  
    40.    2:a00       0 days 0:00:00.000  
    41.    1:1174      0 days 0:00:00.000  
    42.  Kernel Mode Time  
    43.   Thread       Time  
    44.    0:890       0 days 0:00:00.062  
    45.    2:a00       0 days 0:00:00.000  
    46.    1:1174      0 days 0:00:00.000  
    47.  Elapsed Time  
    48.   Thread       Time  
    49.    0:890       0 days 0:38:41.825  
    50.    1:1174      0 days 0:38:41.793  
    51.    2:a00       0 days 0:38:31.528  

    该扩展命令可以用来快速找出哪些线程循环失去控制消耗了太多CPU时间。输出中以调试器的内部线程号和16进制线程ID来标识每个线程。还会显示调试器ID,当然,主要用于分析dump文件

    ~

    波形符(~) 命令显示指定线程或当前进程中的所有线程的信息
    这条命令显示所有线程

    0:001> ~

    该命令也显示所有线程。

    0:001> ~*

    下面的命令显示当前活动线程。

    0:001> ~.

    下面的命令显示原始的产生异常的线程(或调试器附加到进程时活动的线程)。

    0:001> ~#

    下面显示号码为2的线程。

    0:001> ~2

     

    1. <span style="color:#000000;">0:002> ~  
    2.    0  Id: 17a4.eb4 Suspend: 1 Teb: 7ffdf000 Unfrozen  
    3.    1  Id: 17a4.d4c Suspend: 1 Teb: 7ffde000 Unfrozen  
    4. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  
    5. 0:002> ~*  
    6.    0  Id: 17a4.eb4 Suspend: 1 Teb: 7ffdf000 Unfrozen  
    7.       Start: calc!WinMainCRTStartup (01012475)   
    8.       Priority: 0  Priority class: 32  Affinity: f  
    9.    1  Id: 17a4.d4c Suspend: 1 Teb: 7ffde000 Unfrozen  
    10.       Start: winimhc!TGetLogConfig+0x507b (10012f7b)   
    11.       Priority: 0  Priority class: 32  Affinity: f  
    12. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  
    13.       Priority: 0  Priority class: 32  Affinity: f  
    14. 0:002> ~0  
    15.    0  Id: 17a4.eb4 Suspend: 1 Teb: 7ffdf000 Unfrozen  
    16.       Start: calc!WinMainCRTStartup (01012475)   
    17.       Priority: 0  Priority class: 32  Affinity: f  
    18. 0:002> ~#  
    19. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  
    20.       Priority: 0  Priority class: 32  Affinity: f</span>  

    我们可以发现,~和~*还是有点区别的,~*会把入口函数和优先级都打印出来,

    0 Id: 17a4.eb4 Suspend: 1 Teb: 7ffdf000 Unfrozen意思是0号线程,进程ID为17a4,线程ID为eb4,暂停数为1,未冻结状态

    ,每个线程都包含了一个暂停计数(Suspend Count),以及一个冻结/解冻(Frozen/Unfrozen)的状态。

    暂停计数由Windows内核使用的值,可以通过SuspendThread和ResumeThread这两个系统函数来控制的,核心编程里说一个线程创建时,暂停次数为1,

    当线程完全初始化后,系统就要查看CREATE_SUSPEND标志是否已经传递给CreateThread。如果该标志没有传递,系统便将线程的暂停计数递减为0,

    该线程可以调度到一个进程中

    也可以用~<tid>n增加暂停计数,用~<tid>m减少暂停计数,如下:

     
    1. 0:002> ~0n  
    2. 0:002> ~  
    3.    0  Id: 17a4.eb4 Suspend: 2 Teb: 7ffdf000 Unfrozen  
    4.    1  Id: 17a4.d4c Suspend: 1 Teb: 7ffde000 Unfrozen  
    5. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  
    6. 0:002> ~0m  
    7. 0:002> ~  
    8.    0  Id: 17a4.eb4 Suspend: 1 Teb: 7ffdf000 Unfrozen  
    9.    1  Id: 17a4.d4c Suspend: 1 Teb: 7ffde000 Unfrozen  
    10. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  
    11. 0:002> ~0m  
    12. 0:002> ~  
    13.    0  Id: 17a4.eb4 Suspend: 0 Teb: 7ffdf000 Unfrozen  
    14.    1  Id: 17a4.d4c Suspend: 1 Teb: 7ffde000 Unfrozen  
    15. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  
    16. 0:002> ~1m  
    17. 0:002> ~  
    18.    0  Id: 17a4.eb4 Suspend: 0 Teb: 7ffdf000 Unfrozen  
    19.    1  Id: 17a4.d4c Suspend: 0 Teb: 7ffde000 Unfrozen  
    20. .  2  Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen  


    比如我只调用一次~0n,那么主线程的引用计数变为2了,我再调用g,主线程的引用计数变为1,我们的calc是运行不起来的!

    冻结状态是调试器的状态,在window操作系统中是不支持这个概念,对于每个被冻结的线程,调试器将记住这个状态,并且在调试事件被处理之前增加线程的挂起计数,当调试事件被处理完毕时,挂起计数将被递减,对应的命令为:

    冻结~<tid>f

    解冻~<tid>u

    冻结命令数量必须和解冻命令数量相等

  • 相关阅读:
    973. K Closest Points to Origin
    919. Complete Binary Tree Inserter
    993. Cousins in Binary Tree
    20. Valid Parentheses
    141. Linked List Cycle
    912. Sort an Array
    各种排序方法总结
    509. Fibonacci Number
    374. Guess Number Higher or Lower
    238. Product of Array Except Self java solutions
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289213.html
Copyright © 2011-2022 走看看