[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
前言
如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环。你知道怎么快速定位并解决吗?今天跟大家分享几种定位方法,希望对你有所帮助。
如何判断是否有死循环?
通过电脑风扇的声音猜测。
如果风扇一直响个不停,说明电脑很热。高
CPU占用率会导致CPU发热量增大,从而导致风扇狂响。如果听到风扇响个不停,可以打开任务管理器看看CPU占用率是不是很高。如果发现是我们的进程导致的高CPU占用率,那么可以进一步查看是不是有死循环。通过
CPU占用率来判断。对于多核
CPU(尤其是性能强劲的CPU),一个核心的满负荷运转,并不会立刻导致CPU发热量明显增大,风扇可能不会有明显响动。这时根据风扇声音不能轻易判断出是否有死循环,但是我们可以通过CPU占用率来判断。如果
CPU是单核的,那么当CPU处于满负荷运转状态,CPU占用率会接近100%。如果CPU是4核的,并且这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按钮可以刷新。
如果每次刷新都能看到某个函数,很有可能是在这个函数中出现了死循环。对照源码,也许能直接能看出原因。

{% note info %}
注意: 需要正确加载调试符号才可以看到对应的函数名。
{% endnote %}
2. windbg
如果不能使用process explorer定位到具体的原因,可以使用windbg附加到进程中进行更深入的调查。我们需要找出哪个线程运行的时间最长,因为一般死循环的线程占用的CPU时间会比较长。应该怎么找呢?
[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?的更多相关文章
- 使用jstack分析java程序cpu占用率过高
在项目中经常会碰到CPU占用率过高的问题,那么碰到这类问题应当如何处理呢?下面提供一种处理思路: 首先top -H -p <pid>以线程的模式查看java应用的运行情况,找到占用cpu或 ...
- 使用jvisualvm和飞行记录器分析Java程序cpu占用率过高
一.jvisualvm使用 JDK1.6中Oracle提供了一个新的JVM监控工具:jvisualvm.下面重点介绍如何在本地通过远程的方式打开Linux服务器上的jvisualvm. 1.Xmana ...
- 线上Java程序导致服务器CPU占用率过高的问题排除过程
博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行 ...
- 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
博文转至:http://www.jianshu.com/p/3667157d63bb,转本博文的目的就是需要的时候以防忘记 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题 ...
- 编程之美_1.1 让CPU占用率曲线听你指挥
听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...
- 《编程之美》学习笔记——指挥CPU占用率
问题: 写一个程序.让用户来决定Windows任务管理器(Task Manager)的CPU占用率(单核). 有下面几种情况: 1.CPU占用率固定在50%,为一条直线 2.CPU的占用率为一条直线, ...
- linux上限制用户进程数、cpu占用率、内存使用率
限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > ...
- 浅析 Pycharm 内存、cpu 占用率
浅析 Pycharm 内存.cpu 占用率 本机配置参数: ------------------------------------------ Windows 10 专业版 X64 ----- ...
- C#获取CPU占用率、内存占用、磁盘占用、进程信息
代码: using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading ...
随机推荐
- Vue.js(24)之 弹窗组件封装
同事封装了一个弹窗组件,觉得还不错,直接拿来用了: gif图展示: 弹框组件代码: <template> <transition name="confirm-fade&qu ...
- POJ 3663:Costume Party
Costume Party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12607 Accepted: 4977 De ...
- EUI库 - 皮肤
皮肤分离机制 皮肤分离机制对制作可复用的外观比较有优势 那对于只使用一次的皮肤呢?如果也拆分出两个文件,显然不太方便.这里我们针对单次使用的皮肤定制了内部类的功能 每个组件都有一个chi ...
- 【pwnable.kr】passcode
pwnable从入门到放弃,第六题. ssh passcode@pwnable.kr -p2222 (pw:guest) 完全是‘&’的锅. #include <stdio.h> ...
- python--多线程的应用
python 多线程执行函数,以及调用函数时传参 import threading def func1(): print('this is function1') def func2(x,y): pr ...
- .NET CORE部署各种问题
1.安装运行时以后,执行dotnet --version查看版本提示 丢失api-ms-win-crt-runtime-l1-1-0.dll, 当本地api-ms-win-crt-runtime-l ...
- 解决 .NET CORE3.0 MVC视图层不即时编译
微软官方文档 Razor 编译 Razor SDK 默认启用 Razor 文件的生成时和发布时编译. 启用后,运行时编译将补充生成时编译,允许更新 Razor 文件(如果对其进行编辑). 运行时编译 ...
- UVALive 4731 dp+贪心
这个题首先要利用题目的特性,先贪心,否则无法进行DP 因为求期望的话,越后面的乘的越大,所以为了得到最小值,应该把概率值降序排序,把大的数跟小的系数相乘 然后这种dp的特性就是转移的时候,由 i推到i ...
- MySQL笔记 01
STRUCTURE QUERY LANGUAGE 数据库CRUD操作 DDL: 数据库定义语言,定义数据库数据表结构 CREATE(创建): 创建数据库 CREATE DATABASE 数据库名字; ...
- redis官网下载自动安装脚本
注释:使用方法为 # ./redis.sh version ----version为官网版本号 #!/bin/bashversion=$1serverurl='download. ...