Linux 查看进程堆栈信息异常的解决方法
Linux 系统中使用 gdb
、strace
、jinfo
、jmap
等方式查看进程堆栈信息时出现 ptrace attach Operation not permitted 不允许的操作这种异常情况。
原因
Linux 通过设置 /proc/sys/kernel/yama/ptrace_scope
中的值为 1 对 ptrace 调试做了限制:
$ cat /proc/sys/kernel/yama/ptrace_scope
1
在这种模式下,通过 CAP_SYS_PTRACE
设置可以允许跟踪进程,另一种简单的方法是修改 ptrace_scope
的值为 0,可以让进程跟踪到任何在相同 uid 用户下运行的进程。
简单解决方法
ptrace_scope
的值在写入之后无法通过 vim
等方式修改,可以通过 sysctl 修改内核参数的值:
$ sudo sysctl kernel.yama.ptrace_scope=0
kernel.yama.ptrace_scope = 0
或者可以通过添加修改配置文件达到同样的效果:
$ sudo vim /etc/sysctl.d/80-ptrace.conf
kernel.yama.ptrace_scope = 0
修改完成后可以手动加载所有配置文件:
$ sudo sysctl --system
sysctl --system 从下列目录中按顺序加载,并且忽略后续同名文件
/etc/sysctl.d/.conf
/run/sysctl.d/.conf
/usr/local/lib/sysctl.d/.conf
/usr/lib/sysctl.d/.conf
/lib/sysctl.d/*.conf /etc/sysctl.conf
也可以显式加载单个配置文件:
$ sudo sysctl --load=/etc/sysctl.d/80-ptrace.conf
最后,再次查看 ptrace_scope
的值,确认是否修改成功:
$ cat /proc/sys/kernel/yama/ptrace_scope
0