Linux Cpu佔用高除錯方法
阿新 • • 發佈:2019-02-03
1.首先是用top命令確定 有問題的pid
然後用top
-H -p pid命令檢視程序內各個執行緒佔用的CPU百分比
>top -H -p 14094
or
或者使用 > ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx
2.接下來,我們用gdb來attach目標程序
gdb gdb>attach 2907
在gdb中,列出執行緒狀態: (gdb) info threads 9 Thread 47056948181264 (LWP 11066) 0x00002acc4a3dec91in nanosleep () from
gdb已經列出了各執行緒正在執行的函式,我們需要更多資訊,記住11073對應的行首標號,這是gdb為執行緒分配的id,這裡為2,然後執行切換:
bt一下:
(gdb) bt #0 CSendFile::SendFile (this=0x2acc5d4aff40, pathname=@0x2acc5d4afee0) at ../src/csendfile.cpp:101 #10x000000000040592ein CIcdn::TaskThread (pParam=0x7fff617eafe0) at ../src/cicdn.cpp:128 #20x00002acc4a90b73ain start_thread () from /lib/libpthread.so.0 #30x00002acc4a40d6ddin clone () from /lib/libc.so.6 #40x0000000000000000in?? ()
來看一下101行的程式碼:
現在我們定位到了出問題的程式碼位置,這裡的迴圈只用來演示的。
最後別忘了detach()
除錯完指定程序後,可以執行detach命令來讓GDB釋放該程序,該程序得以繼續執行。當回車時,detach不會重複。當執行完detach後,程序和GDB不再相關,GDB可以attach其他程序。
2. 使用 pstack
1.安裝pstack
yum install pstack
使用方式:
>pstack pid 根據pid找出有問題的執行緒