0%

jinfo报错

解决 jinfo 报错:ptrace(PTRACE_ATTACH, ..) failed

在 Linux 系统中使用 jinfo 命令查看 Java 进程的 JVM 参数时,可能会遇到如下错误:

1
2
jinfo -flags 23765
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 23765: Operation not permitted

这是由于 Linux 的 ptrace-scope 安全机制限制了进程调试权限导致的。本文将详细解释原因并提供临时和永久解决方案。

错误原因:ptrace-scope 机制

Linux 内核从 2.6.36 版本开始引入了 ptrace-scope 机制(属于 yama 安全模块),其目的是限制进程间的 ptrace 调用,防止恶意程序通过调试接口攻击正在运行的进程(如读取内存、注入代码等)。

ptrace 是 Linux 提供的进程调试系统调用,jinfojstackgdb 等调试工具均依赖此接口获取进程信息。默认情况下,ptrace-scope 设置为 1,仅允许父进程调试子进程,其他进程(如 jinfo 调试 Java 进程)会被拒绝,从而导致上述错误。

临时解决方案(立即生效,重启失效)

若只需临时允许调试(如排查问题时),可直接修改内核参数关闭 ptrace-scope 限制:

1
2
3
4
5
# 切换到 root 用户(需要管理员权限)
sudo su

# 将 ptrace-scope 临时设置为 0(允许任意进程调试)
echo 0 > /proc/sys/kernel/yama/ptrace_scope

设置后再次执行 jinfo 即可正常工作:

1
jinfo -flags 23765  # 23765 为目标 Java 进程 PID

永久解决方案(重启后生效)

若需要长期允许调试(如开发或测试环境),需修改系统配置文件,永久生效:

  1. 编辑配置文件
    Linux 系统的 ptrace-scope 配置通常存放在 /etc/sysctl.d/10-ptrace.conf(部分系统可能为 /etc/sysctl.conf):

    1
    sudo vim /etc/sysctl.d/10-ptrace.conf
  2. 修改参数
    将文件中的 kernel.yama.ptrace_scope 值从 1 改为 0

    1
    2
    3
    4
    5
    # 原配置
    # kernel.yama.ptrace_scope = 1

    # 修改后
    kernel.yama.ptrace_scope = 0
  3. 生效配置
    执行以下命令使配置立即生效,无需重启:

    1
    sudo sysctl --system
  4. 验证配置
    检查当前 ptrace-scope 值:

    1
    cat /proc/sys/kernel/yama/ptrace_scope  # 输出 0 即表示生效

安全说明

  • ptrace-scope = 0 会关闭调试限制,可能存在安全风险,不建议在生产环境长期使用

  • 生产环境中,若需临时使用 jinfo 等工具,可采用临时方案,排查完成后改回 1

    1
    2
    sudo su
    echo 1 > /proc/sys/kernel/yama/ptrace_scope # 恢复默认限制

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10