(转)如何定位死循环或高CPU利用率linux

最近在完成一个比较大的多线程C++离线服务程序后,发现经常会出现卡住的情况,表现为CPU利用率100%左右,一直没找到代码原因,就采用了一个笨到方法,每小时重启一次服务……

这样做仍然会有好多数据进不了库,不是治本的方法,前几天决定彻底解决这个问题,搜索发现了gdb的一个强大的功能,gdb attach(如何定位死循环或高CPU使用率(linux) - Sonic4x),记录一下。

找出线程

找出CPU利用率高的进程(例如http_xxx)的所有线程,进行排序

ps xH -e -o pid,tid,pcpu,cmd --sort=pcpu | grep 'http_xxx'

得到结果:

2233 2245 1.2 http_xxx

2233 2237 80.9 http_xxx

找到线程2237的CPU占用率高。

用gdb找出调用栈

gdb,attach pid,info threads显示所有线程

gdb>attach 2233

gdb>info threads

结果如下,可以发现2237的编号为4

4 Thread 0xac1fcb70 (LWP 2237)  0x004ef0d7 in mq_timedreceive () from /lib/tls/i686/cmov/librt.so.1

...

* 1 Thread 0xb78496d0 (LWP 2238  0x006e0422 in __kernel_vsyscall ()

使用thread切换线程,使用bt显示线程栈

gdb>thread 4

gdb>bt

可以定位到某个函数到某行代码了,就找到原因了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原...
    Manfred_Zone阅读 16,573评论 0 26
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,165评论 0 23
  • GDB TO LLDB COMMAND MAP Below is a table of GDB commands ...
    狂风无迹阅读 1,768评论 0 2
  • 迪伦噩梦醒后,还一时沉思在恐惧的梦境中久久不能忘怀,可崔斯坦打断了她的思绪,一句“我们要走了” 把迪伦重新拉回到现...
    棒老韩_木驴阅读 458评论 0 1
  • 我不得不吐槽一下我所在的小区-这个既美丽又嘈杂的地方。 我住在一个二线城市里的一个小县城的小镇上的一个小区里。小镇...
    夏日冰雪阅读 280评论 0 0