Windbg 调试CPU占用过高

2024-02-29 13:08
文章标签 调试 cpu 占用 windbg 过高

本文主要是介绍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
[cpp]  view plain copy
  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

 

[cpp]  view plain copy
  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减少暂停计数,如下:

[cpp]  view plain copy
  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占用过高的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758913

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

Java程序到CPU上执行 的步骤

相信很多的小伙伴在最初学习编程的时候会容易产生一个疑惑❓,那就是编写的Java代码究竟是怎么一步一步到CPU上去执行的呢?CPU又是如何执行的呢?今天跟随小编的脚步去化解开这个疑惑❓。 在学习这个过程之前,我们需要先讲解一些与本内容相关的知识点 指令 指令是指导CPU运行的命令,主要由操作码+被操作数组成。 其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也

php 7之PhpStorm + Nginx + Xdebug运行调试

操作环境: windows PHP 7.1.10 PhpStorm-2017.2.4 Xdebug 2.5.4 Xdebug helper 1.6.1 nginx-1.12.2 注意查看端口占用情况 netstat -ano //查看所以端口netstat -aon|findstr "80" //查看指定端口占用情况 比如80端口查询情况 TCP 0.0.0.0:8