gstack安装
$ wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/updates/13/x86_64/gdb-7.1-34.fc13.x86_64.rpm
$ sudo apt-get install rpm2cpio
$ rpm2cpio gdb-7.1-34.fc13.x86_64.rpm | cpio -idmv
$ sudo cp ./usr/bin/gstack /usr/bin/
gstack 源码,shell脚本
上述安装操作比较耗时间,可以直接拷贝gstack脚本使用
#!/bin/sh
if test $# -ne 1; then
echo "Usage: `basename $0 .sh` <process-id>" 1>&2
exit 1
fi
if test ! -r /proc/$1; then
echo "Process $1 not found." 1>&2
exit 1
fi
# GDB doesn't allow "thread apply all bt" when the process isn't
# threaded; need to peek at the process to determine if that or the
# simpler "bt" should be used.
backtrace="bt"
if test -d /proc/$1/task ; then
# Newer kernel; has a task/ directory.
if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; then
backtrace="thread apply all bt"
fi
elif test -f /proc/$1/maps ; then
# Older kernel; go by it loading libpthread.
if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; then
backtrace="thread apply all bt"
fi
fi
GDB=${GDB:-/usr/bin/gdb}
if $GDB -nx --quiet --batch --readnever > /dev/null 2>&1; then
readnever=--readnever
else
readnever=
fi
# Run GDB, strip out unwanted noise.
$GDB --quiet $readnever -nx /proc/$1/exe $1 <<EOF 2>&1 |
set width 0
set height 0
set pagination no
$backtrace
EOF
/bin/sed -n \
-e 's/^\((gdb) \)*//' \
-e '/^#/p' \
-e '/^Thread/p'
查看占用cpu高的线程
- ps命令中,“-T”选项可以开启线程查看。
ps -T -p <pid>
- top命令的“-H”选项。
top -H -p pid
- htop命令
安装: apt-get install htop
查看线程堆栈
打印进程中各线程的函数调用栈信息
gstack pid
根据调用栈信息,结合源代码分析,根据上述步骤定位到调用函数
strace
查看系统调用和耗时时间
安装:
apt-get install strace -y
使用:
strace -T -c -p 8521
-p ,根据进程号追踪
-c ,将所有的系统调用做一个统计分析
-T ,每个系统调用所花费的时间打印出来