1. 程式人生 > >Linux Cpu佔用高除錯方法

Linux Cpu佔用高除錯方法

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 
/lib/libc.so.6    8 Thread 47056956573968 (LWP 11067)  0x00002acc4a406fc2in select () from /lib/libc.so.6    7 Thread 47056964966672 (LWP 11068)  0x00002acc4a3dec91in nanosleep () from /lib/libc.so.6   6 Thread 47056973359376 (LWP 11069)  0x00002acc4a3dec91in nanosleep () from /lib/libc.so.6    5 Thread 47056981752080 (LWP 11070)  
0x00002acc4a3dec91in nanosleep () from /lib/libc.so.6    4 Thread 47056990144784 (LWP 11071)  0x00002acc4a40e63cin recvfrom () from /lib/libc.so.6    3 Thread 47057194060048 (LWP 11072)  0x00002acc4a406fc2in select () from /lib/libc.so.6    2 Thread 47057226893584 (LWP 11073)  CSendFile::SendFile (this=0x2acc5d4aff40, pathname=@0x2acc5d4afee0
    at ../src/csendfile.cpp:101    1 Thread 47056939784832 (LWP 11065)  0x00002acc4a3dec91in nanosleep () from /lib/libc.so.6 (gdb) 


gdb已經列出了各執行緒正在執行的函式,我們需要更多資訊,記住11073對應的行首標號,這是gdb為執行緒分配的id,這裡為2,然後執行切換:

(gdb) thread 2  [Switching to thread 2 (Thread 47057226893584 (LWP 11073))]#0  CSendFile::SendFile (this=0x2acc5d4aff40, pathname=@0x2acc5d4afee0    at ../src/csendfile.cpp:101 101while(1 (gdb) 

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行的程式碼:

(gdb) l  96      }  97  98int CSendFile::SendFile(conststring& pathname)  99{ 100int n; 101while(1) 102{ 103                     n++; 104             } 105//read file and send 

現在我們定位到了出問題的程式碼位置,這裡的迴圈只用來演示的。 
最後別忘了detach()

除錯完指定程序後,可以執行detach命令來讓GDB釋放該程序,該程序得以繼續執行。當回車時,detach不會重複。當執行完detach後,程序和GDB不再相關,GDB可以attach其他程序。

2. 使用 pstack

1.安裝pstack

yum install pstack

使用方式:

>pstack pid 根據pid找出有問題的執行緒

>strace -p pid //這個執行緒所有系統呼叫