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

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

Windbg 调试CPU占用过高的更多相关文章

  1. WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

    一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下 ...

  2. Android去除CPU占用过高时屏幕四周闪红框

    话说有些时间没有更新博客了,今天正好解决这个问题,顺便把它记录下来.. 今天遇到的情况是这样的,当CPU占用过高时,屏幕四周会出现一个红框. 闪一次两次算了,但是挺萌的(TMD)不停的闪,我的钛合金狗 ...

  3. 性能测试问题_Mysql数据库服务器的CPU占用很高

    MySQl服务器CPU占用很高 1.  问题描述 一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引 ...

  4. Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办

    Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办 跟个磁盘队列长度雅十,一到李80%走不行兰.... 1. 寻找线程too 多的.关闭... Taskman>> ...

  5. 一次java Cpu占用过高的排查

    某一个项目CPU占用率一直很高,经常在40%-50%之间,最近比较闲,就开始了排查工作. 1.通过 jstack命令输出进程的堆栈信息 jstack 2788 >C:\log.txt 将堆栈信息 ...

  6. java 一次CPU占用过高问题的排查及解决

    最近一段时间  某台服务器上的一个应用总是隔一段时间就自己挂掉      用top看了看  从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID ...

  7. “RESOURCE MONITOR“CPU占用特别高

    背景: SQL Server 2008 R2 10.50.1600 没有设置页面文件,内存为64G,数据库分配50G cpu使用占了50%以上,平时只有10-20%,某台服务器“RESOURCE MO ...

  8. kswapd0 进程CPU占用过高

    前几天遇到的一个问题,自己本地用VM配置的虚拟机,一般会top查看进程以及CPU占用的一些情况.又一次用laravel 打印对象,里面的内容比较多,浏览器当时就卡了. 然后看进程的情况.我以为会是ng ...

  9. 工具运行过程中,CPU占用过高的分析定位

    之前使用Java Swing开发了一款设备档案收集工具.支持多台设备同时收集,每个设备使用一个线程.在同时收集多台设备信息时,发现CPU占用率居然达到了97%,而且高居不下.显然这样的性能是令人无法忍 ...

随机推荐

  1. H5调用腾讯地图

    获取当前定位的经纬度并在容器内显示当前位置 (安卓上的位置有点偏差) 在vue的index.html中需要引用 template <div id="container" st ...

  2. SQL Server中配置ODBC数据源

    单击“开始→windows系统→控制面板”,打开控制面板 单击“管理工具→ODBC数据源(32位)”打开ODBC数据源配置对话框 在数据源配置对话框中单击“系统DSN”选项卡下的“添加”按钮,创建数据 ...

  3. kafka保证数据不丢失机制

    kafka如何保证数据的不丢失 1.生产者如何保证数据的不丢失:消息的确认机制,使用ack机制我们可以配置我们的消息不丢失机制为-1,保证我们的partition的leader与follower都保存 ...

  4. NX二次开发-对话框加锁UF_UI_lock_ug_access

    VC/MFC调用UG Dialog要进入加锁状态 加锁 UF_UI_lock_ug_access ( UF_UI_FROM_CUSTOM ); 此处为UF_UI_select的函数 解锁 UF_UI_ ...

  5. 牛客多校第十场 E Hilbert Sort 递归,排序

    题意: 给你一个方阵,再在方阵上给定一些点,按照希尔伯特曲线经过的先后顺序为这些点排序 题解: 定义好比较函数后直接调用排序算法即可. 希尔伯特曲线本来就是用于二维到一维的映射的,因此我们可以考虑对于 ...

  6. 李宏毅机器学习课程---3、Where does the error come from

    李宏毅机器学习课程---3.Where does the error come from 一.总结 一句话总结:机器学习的模型中error的来源是什么 bias:比如打靶,你的瞄准点离准心的偏移 va ...

  7. beaglebone black 与电脑互传文件(夹)

    1. PSCP方法 PSCP,是putty的一个组件. 1.1 下载PSCP 先给连接http://www.chiark.greenend.org.uk/~sgtatham/putty/downloa ...

  8. Python+Django+SAE系列教程6-----本地配置Django

    前五章.我们介绍了Python的语法,本章開始介绍Django. Python的Web框架有非常多,有Django.web2py.tornado.web.py等.我们这里选 则Django.至于这些框 ...

  9. Photoshop基础照片美化

    自从有了“ps”以后,很多事情变成了可能,你可以出现在任何你想在的地方.而最基本的美化照片的功能,我想是很多同学学习PS的初衷.当你掌握了这门技术,很多人会对你刮目相看!今天小编就和大家分享一下ps的 ...

  10. element-ui的layout将24等分换为48等分

    按住ctr箭点击element-ui/packages/theme-chalk/src/index";,再按住ctr贱点击col.scss跳转,将跳转到的col.scss中的24换为48(c ...