centos7之gdb调试进程

yum install -y gdb
gdb attach 1 #附加到进程
(gdb) thread apply all bt   #打印所有线程堆栈
Thread 1 (Thread 0x7f3bb2188900 (LWP 1)):
#0  0x00007f3bb09bd7d3 in __epoll_wait_nocancel () from /lib64/libc.so.6
#1  0x00007f3bb2229859 in sd_event_wait ()
#2  0x00007f3bb21f8933 in manager_loop ()
#3  0x00007f3bb21be751 in main ()
(gdb) detach   #分离进程
Detaching from program: /usr/lib/systemd/systemd, process 1
(gdb) quit #退出

可能这样操作比较麻烦,所以我们需要用到以下几个参数 -q: 不打印gdb的版权消息 --batch: 执行批处理,不进入交互模式 --ex: 执行gdb 命令

 sudo gdb -q --batch --ex "attach 1" -ex "thread apply all bt" -ex "detach"

也许你觉得这样也比较麻烦,那使用我写的一个脚本吧

vi gstack  #复制以下脚本并保存
chmod u+x gstack #给gstack添加可执行权限
./gstack 1 #尝试运行下吧
cp gstack /usr/bin  #加入环境变量
gstack 1#全局调用

gstack脚本

#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Usage: bstack lose param  <process-id>" 1>&2
    exit 1
fi

if [ -n "$(echo $1| sed -n "/^[0-9]\+$/p")" ];then
  r=$(ps -p $1 | grep $1)
  if [ "$r" != "" ]; then
   logdir="$HOME/gstack_log"
   if [ ! -d $logdir ]; then
     mkdir -p "$logdir"
   fi
   filedir=$logdir/$1_$(date '+%Y%m%d%H%M%S')
   sudo gdb -q --batch --ex "attach "$1 -ex "thread apply all bt" -ex "detach" >> $filedir
   echo "stack log path:"$filedir
  else
   echo "Process of $1  does not exist"
  fi
else
  echo "$1 is not a number"
  exit 1
fi

转载于:https://my.oschina.net/weidedong/blog/785377

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值