西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页业内动态 业内资讯 → 调用Windbg命令寻找高CPU占用线程

调用Windbg命令寻找高CPU占用线程

相关软件相关文章发表评论 来源:程序人生时间:2012/3/23 9:30:13字体大小:A-A+

作者:程序人生点击:128次评论:10次标签: CPU

  • 类型:CPU内存大小:232KB语言:英文 评分:6.0
  • 标签:
立即下载

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

我的电脑是双核四线程的CPU,所以当一个线程死循环的时候会占用掉25%的CPU时间。具体表现为:运行程序的最开始表现正常,随后会看到CPU占用上升至25%、50%、75%等。在这样的情况下我用Windbg Attach到目标进程,并通过!runaway命令来列出各线程所耗费的时间。占用时间最多的就是那些假死的线程了,然后~*kb列出各线程的调用栈,分析一下耗费时间长的线程的调用栈基本可以找出问题所在的原因。

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

对recv、select之类的函数返回值判断不全,如果出错应当break
while内部每一次循环之后应当适当的Sleep
这样处理之后,线程占满CPU的问题就得到解决了。由于一些原因,这里没有把实际情况下的一些分析数据贴出来。

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

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(10)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)