博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Windbg寻找高CPU占用线程
阅读量:2393 次
发布时间:2019-05-10

本文共 765 字,大约阅读时间需要 2 分钟。

原文地址:

        在一个任务中使用多线程编程,程序运行一段时间后就占满了CPU,严重拖慢了系统的运行速度。这里所说的高CPU,意思就是一个线程占用了一个CPU的大部分运行时间,如果是单核的CPU,表现为CPU占用近100%;相应的双核的话一个线程会占到50%的CPU。

        我的电脑是双核四线程的CPU,所以当一个线程死循环的时候会占用掉25%的CPU时间。具体表现为:运行程序的最开始表现正常,随后会看到CPU占用上升至25%、50%、75%等,再加上本来的业务占用的CPU,可能就把整个CPU占满了,这样系统速度就被拖慢了,甚至导致系统死机。在这样的情况下我用Windbg Attach到目标进程,并通过!runaway命令来列出各线程所耗费的时间。占用时间最多的就是那些假死的线程了,然后~*kb列出各线程的调用栈,分析一下耗费时间长的线程的调用栈,使用bp在调用堆栈中的函数设置断点(bp设置断点,bl查看设置的所有断点),看到底在哪个函数发生了死循环。

        回到我的程序,从调用栈上并不能明显看出问题:一个线程“卡”在recv上,另一个“卡”在select上面;但也不应该耗费如此多的CPU时间。再看一下代码,外层有一个while死循环,用于处理Client发过来的数据,问题基本实在这个while循环里面。再后来,仔细阅读代码后发现原因如下:

  • 对recv、select之类的函数返回值判断不全,如果出错应当break
  • while内部每一次循环之后应当适当的Sleep

        这样处理之后,线程占满CPU的问题就得到解决了。由于一些原因,这里没有把实际情况下的一些分析数据贴出来。

        P.S. 使用Process Explorer也能简单排查问题线程。双击进程可以查看进程的属性,然后选择“线程”选项卡,双击高CPU的线程就可以看到调用栈了。

你可能感兴趣的文章
2014BIT程序设计——贪婪的你
查看>>
DP——划分子集和问题
查看>>
回溯法——任务分配问题
查看>>
java初始化顺序
查看>>
Ubuntu下设置环境变量及PATH的方法
查看>>
ubuntu,ros教程问题之[rospack] Error: no such package beginner_tutorials
查看>>
ros问题—— importError: No module named srv
查看>>
python错误之mission parentheses in call to 'print'
查看>>
python之TypeError: this constructor takes no arguments
查看>>
python之中文乱码
查看>>
python之正则表达式
查看>>
Apache服务器最新版下载、安装及配置(win版)
查看>>
mysql关于输入密码后闪退
查看>>
关于p操作和v操作的理解
查看>>
sql查询语句汇总,先撸为敬
查看>>
u盘打开之后就只有一个快捷方式
查看>>
opengl之glTranslatef()函数和glRotatef()函数和glLoadIdentity()函数
查看>>
opengl之glutTimerFunc
查看>>
opengl中gl、glu、glut的区别
查看>>
opengl之glScalef()函数
查看>>