【发布时间】:2014-05-22 20:47:07
【问题描述】:
我的目标是将 Java 分析器或调试器附加到由名为 Nuix 的 Windows 应用程序启动的 Java 虚拟机实例。
可以将命令行开关传递给 Nuix,其中一些传递给 JVM。
Nuix 与 JRE 8 一起打包在其子目录之一中:\Nuix 7.4\jre\。特定版本似乎是 Java HotSpot(TM) 64-Bit Server VM 1.8.0_92。
我使用这些开关启动了 Nuix:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=80
然后我尝试在没有命令行开关的情况下运行jconsole.exe,但它无法识别由 Nuix 启动的 JVM。我尝试使用jdb.exe -attach <Port> 创建远程连接,但应用程序失败并出现此异常。
java.io.IOException: shmemBase_attach failed: The system cannot find the file specified
我确认没有其他东西在监听 80 端口并且它没有被阻塞。
附加调试器的正确方法是什么?
作为一个附带问题,Windows .exe 怎么可能使用 JAR?我以前没有见过这种架构,我不相信使用 IKVM.NET,也没有使用 J#,因为应用程序是非托管的,根据 Process Explorer。
【问题讨论】:
-
As a side question, how is it possible for a Windows .exe to use JARs?与 shell 脚本完全相同。由于整个 Java VM 都包含在发行版中,因此您可以将其作为单独的进程启动。 -
使用进程监视器,我相信 \jre\bin\java.dll 负责加载 JAR。这是使 Windows 应用程序可以访问 JAR 的已知方法吗? @biziclop
-
.exe 是一个包装器,它调用 JNI_CreateJavaVM 来启动 JVM。它还从注册表加载一些内存首选项以传递给 JVM(即通过 -Xmx)。
标签: java eclipse debugging jvm jvm-hotspot