当我使用jmap获取有关进程的堆信息时,我得到了类似的错误:
$jmap -heap process_id
Attaching to process ID process_id, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: cannot open binary
file
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException:
cannot open binary file
操作系统:Ubuntu 14.04
我通过更新DebuggerException: Can't attach to the process
解决了另一个错误(kernel.yama.ptrace_scope = 0
)。
答案 0 :(得分:17)
我遇到了同样的问题,但是当我OneWay
给具有相关权限的正确用户时,问题就会消失。
答案 1 :(得分:4)
如果您尝试附加到不合格的流程,也会发生这种情况,因此最好重新确认您的pid。
例如,当我的一位朋友试图附加他们用于搜索符合条件的pid的{{1}}进程时,我的朋友就得到了这个。)。
答案 2 :(得分:2)
在我们的例子中,java进程使用.../JAVA_HOME/jre/bin/java
二进制文件,而jmap进程使用.../JAVA_HOME/bin/jmap
二进制文件。
一旦我们将Java进程更改为使用.../JAVA_HOME/bin/java
二进制文件,此问题就得到解决。我们能够成功运行jmap。
关键是使用JDK Java二进制文件而不是JRE Java二进制文件运行Java进程。
答案 3 :(得分:0)
与提出的问题没有直接关系。但是,在进行Java进程的线程转储时使用 jstack 命令时遇到了类似的错误。假设我要对其进行线程转储的Java进程的pid为1234。
我使用了命令jstack -l 1234 /home/users/a/thread-dump.txt
我在上面的命令中错过的是重定向操作符(>)。该命令的正确版本是
jstack -l 1234 > /home/users/a/thread-dump.txt
也许对某人有帮助:)
答案 4 :(得分:0)
我对jstack
有相同的问题。原来,我没有使用Oracle JRE,而是使用OpenJDK作为该过程的运行时,但是仅安装了Oracle的JDK。 Oracle的jstack
无法访问OpenJDK进程。另请参见Does OpenJDK have a tool similar to jstack (Oracle Java)?