连接进程出错: sun.jvm.hotspot.debugger.DebuggerException: 无法打开二进制文件

27
当我使用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

我通过更新 kernel.yama.ptrace_scope = 0 解决了另一个错误(DebuggerException: Can't attach to the process)。

参考:https://bugs.openjdk.java.net/browse/JDK-7050524


1
你有研究过你遇到的错误吗? - Jonny Henly
可能是Jmap无法连接以进行转储的重复问题。 - Jonny Henly
你的意思是权限问题吗?但我是用与Java进程相同的用户运行这个命令的。 - infraio
重启操作系统后,我启动了Java进程并再次使用jmap。没有出现错误。因此可能是权限问题。但我不确定。 - infraio
5个回答

32

我遇到过同样的问题,但是当我使用su命令切换到具有相关权限的正确用户时,问题就消失了。


7
有趣的是:成为“root”并没有奏效。我使用了“sudo -u THE__USER_RUNNING_THE_JVM ...”,然后它起作用了。 - yankee
非常感谢!这节省了我大量的时间! - Alex

17

虽然与问题本身没有直接关系,但我在使用jstack命令获取一个Java进程的线程转储时,遇到了类似的错误。假设我想要线程转储的Java进程的PID为1234。

我曾使用过命令jstack -l 1234 /home/users/a/thread-dump.txt

上述命令中我忽略了重定向运算符(>)。正确的命令应该是:

jstack -l 1234  > /home/users/a/thread-dump.txt

或许可以帮助某人 :)


1
它也是解决“java.lang.RuntimeException: Unable to deduce type of thread from address”错误的方案。 - Pawan Singh

5

如果您尝试附加到不合格的进程,也会发生这种情况,因此重新确认您的pid是个好主意。

例如,我的一个朋友在尝试附加到他们用于搜索合格pid的jps进程时遇到了这个问题 ;)。


3

在我们的情况下,Java进程使用 .../JAVA_HOME/jre/bin/java 二进制文件,而jmap进程使用 .../JAVA_HOME/bin/jmap 二进制文件。

一旦我们将Java进程更改为使用 .../JAVA_HOME/bin/java 二进制文件,问题就得到了解决。我们成功地运行了jmap。

关键是要使用JDK Java二进制文件来运行Java进程,而不是JRE Java二进制文件。


非常感谢,这就是我的问题的解决方案。我花了好几天时间来解决它 :) - Tamás Barta

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接