排查性能问题时,经常使用patack打印所有线程的函数调用堆栈。

pstack实际上是一个脚本(/usr/bin/pstack),是通过GDB的thread apply all bt来实现了。

脚本的关键代码:

1
2
3
4
5
6
7
8
backtrace="thread apply all bt"   //GDB 通过thread apply all bt打印所有线程的调用堆栈

$GDB –quiet $readnever -nx /proc/$1/exe $1 <<EOF 2>&1 | // /proc/$1/exe对应实际运行的二进制代码
set width 0
set height 0
set pagination no
$backtrace //thread apply all bt
EOF

线上运行的程序一般是不带符号信息的,此时如果想打印堆栈,可以重新编译一个带符号信息的版本,将/proc/$1/exe替换成带符号版本的路径,就可以正常打印堆栈了。

Comments

2015-11-13