您的位置:首页 > 博客中心 > 数据库 >

令人惊奇的gdb和pstack

时间:2022-03-14 04:42

pstack竟然是一个shell脚本,核心是调用gdb的thread apply all bt查看进程的所有线程的堆栈,之后用sed正则展示线程堆栈信息。

/proc/pid/exe是一个指向可执行文件的软连接。 

#!/bin/shif test $# -ne 1; then    echo "Usage: `basename $0 .sh` <process-id>" 1>&2    exit 1fiif test ! -r /proc/$1; then    echo "Process $1 not found." 1>&2    exit 1fi# 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"    fielif 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"    fifiGDB=${GDB:-/usr/bin/gdb}if $GDB -nx --quiet --batch --readnever > /dev/null 2>&1; then    readnever=--readneverelse    readnever=fi# Run GDB, strip out unwanted noise.$GDB --quiet $readnever -nx /proc/$1/exe $1 <<EOF 2>&1 | set width 0set height 0set pagination no$backtraceEOF/bin/sed -n \    -e ‘s/^(gdb) //‘ \    -e ‘/^#/p‘ \    -e ‘/^Thread/p‘

 

热门排行

今日推荐

热门手游