ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

2020-01-30 11:53:23  阅读:288  来源: 互联网

标签:explorer process 死循环 线程 占用率 CPU 调试


原调试debugwindbghangprocess explorer

前言

如果我们自己的程序的CPU UsageCPU占用率)飙升,并且居高不下,很有可能陷入了死循环。你知道怎么快速定位并解决吗?今天跟大家分享几种定位方法,希望对你有所帮助。

如何判断是否有死循环?

  • 通过电脑风扇的声音猜测。

    如果风扇一直响个不停,说明电脑很热。高CPU占用率会导致CPU发热量增大,从而导致风扇狂响。如果听到风扇响个不停,可以打开任务管理器看看CPU占用率是不是很高。如果发现是我们的进程导致的高CPU占用率,那么可以进一步查看是不是有死循环。

  • 通过CPU占用率来判断。

    对于多核CPU(尤其是性能强劲的CPU),一个核心的满负荷运转,并不会立刻导致CPU发热量明显增大,风扇可能不会有明显响动。这时根据风扇声音不能轻易判断出是否有死循环,但是我们可以通过CPU占用率来判断。

    如果CPU是单核的,那么当CPU处于满负荷运转状态,CPU占用率会接近100%。如果CPU4核的,并且这4个核心都处于满负荷运转状态,那么CPU占用率会接近100%,如果只有一个核心是满负荷运转状态,那么CPU占用率会在25%100 / 4 = 25)左右。如果我们发现某个进程的CPU占用率居高不下,有可能是死循环了。

    {% note info %}
    注意: 很多死循环都是busy类型的,如果是idle类型的死循环,上面的方法不适用。
    {% endnote %}

下面介绍几个我经常使用的工具,可以比较便捷的排查此类的问题。

1. process explorer

在前面的文章里跟大家介绍过,使用process explorer可以查看线程的调用栈CPU占用率。如果程序里的某个功能迟迟不能完成,我的第一反应是,按Ctrl + Shift + Esc打开任务管理器(我已经使用process explorer替换了系统自带的任务管理器,所以启动的是process explorer。如何使用process explorer替换系统自带的任务管理器,请参考文章排错实战——使用process explorer替换任务管理器)。

启动process explorer后,双击我们关心的进程,切换到Thread页,在这里我们可以看到当前进程中的所有线程。双击某个线程就可以查看调用栈,在弹出的调用栈界面,点击左下角的Refresh按钮可以刷新。

如果每次刷新都能看到某个函数,很有可能是在这个函数中出现了死循环。对照源码,也许能直接能看出原因。

使用process explorer
使用process explorer

 

{% note info %}

注意: 需要正确加载调试符号才可以看到对应的函数名。

{% endnote %}

2. windbg

如果不能使用process explorer定位到具体的原因,可以使用windbg附加到进程中进行更深入的调查。我们需要找出哪个线程运行的时间最长,因为一般死循环的线程占用的CPU时间会比较长。应该怎么找呢?

标签:explorer,process,死循环,线程,占用率,CPU,调试
来源: https://www.cnblogs.com/bianchengnan/p/12242392.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有