1、top -H -p <pid> 查看进程线程CPU状态,如下,可以看到线程6890占用CPU将近100%,可以断定该线程中代码死循环:
root@test:/# top -H -p 6205
top - 20:17:11 up 1 day, 1:21, 4 users, load average: 1.00, 1.15, 1.15
Tasks: 9 total, 1 running, 8 sleeping, 0 stopped, 0 zombie
Cpu(s): 27.0%us, 2.5%sy, 0.0%ni, 70.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3984908k total, 1193492k used, 2791416k free, 17468k buffers
Swap: 0k total, 0k used, 0k free, 492616k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6890 root 20 0 132m 32m 7300 R 97 0.8 131:57.50 xxx
6739 root 20 0 132m 32m 7300 S 1 0.8 13:51.51 xxx
6205 root 20 0 132m 32m 7300 S 0 0.8 2:36.50 xxx
6888 root 20 0 132m 32m 7300 S 0 0.8 0:44.79 xxx
6889 root 20 0 132m 32m 7300 S 0 0.8 0:00.02 xxx
6891 root 20 0 132m 32m 7300 S 0 0.8 0:00.00 xxx
6892 root 20 0 132m 32m 7300 S 0 0.8 0:04.20 xxx
6893 root 20 0 132m 32m 7300 S 0 0.8 0:00.00 xxx
6894 root 20 0 132m 32m 7300 S 0 0.8 1:44.26 xxx
2、gdb该线程gdb [executable-file [core-file or process-id]] [thread-id],如gdb /usr/bin/xxx 6890, 多次bt查看线程正在执行调用栈,,找到死循环的函数:
(gdb) bt
#0 0x0f676e6c inxxx_key () from /usr/lib/libxxx.so.0
#1 0x0f674d4c in xxx_next () from /usr/lib/libxxx.so.0
#2 0x0e8c42ac in xxx_add (object=0xb55fd12c) at xxxx.c:12661
#3 0x0e8c9d04 in xxx_mib (objectType=objectType@entry=82, object=0xb55fd12c, op=op@entry=1) at xxxx.c:5396
#4 0x0e8ca6f4 in xxxObject (objectType=82, object=<optimized out>) at xxxx.c:4616
#5 0x008b2d94 in ?? () from /usr/lib/libxxxx.so.0
#6 0x0eae29b0 in xxx_command () from /usr/lib/libxxxx.so.0
#7 0x0eae4bcc in xxx_parse () from /usr/lib/libxxxxx.so.0
#8 0x0ebc9124 in ?? () from /usr/lib/libxxxxx.so.0
#9 0x0fe07d84 in ?? () from /lib/libpthread.so.0
#10 0x0ff26068 in clone () from /lib/libc.so.6
(gdb) bt
#0 0x0ec583c0 in xxxPut () from /usr/lib/libxxx.so.0
#1 0x0f674d74 in xxx_next () from /usr/lib/libxxx.so.0
#2 0x0e8c425c in xxx_add (object=0xb55fd12c) at xxxx.c:12663
#3 0x0e8c9d04 in xxx_mib (objectType=objectType@entry=82, object=0xb55fd12c, op=op@entry=1) at xxxx.c:5396
#4 0x0e8ca6f4 in xxxObject (objectType=82, object=<optimized out>) at xxxx.c:4616
#5 0x008b2d94 in ?? () from /usr/lib/libxxxxx.so.0
#6 0x0eae29b0 in xxx_command () from /usr/lib/libxxxxx.so.0
#7 0x0eae4bcc in xxx_parse () from /usr/lib/libxxxxx.so.0
#8 0x0ebc9124 in ?? () from /usr/lib/libxxxxx.so.0
#9 0x0fe07d84 in ?? () from /lib/libpthread.so.0
#10 0x0ff26068 in clone () from /lib/libc.so.6
可以看出xxx_add函数已经死循环。