【问题标题】:Debug Java Application in Nuix - Attach a Profiler or Debugger在 Nuix 中调试 Java 应用程序 - 附加探查器或调试器
【发布时间】: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


【解决方案1】:

为了附加调试器,我做了以下操作。请注意,由于无法更改防火墙配置,我使用了端口 80。我意识到端口 8000 是传统的 Java 调试端口。

jconsole.exe

  1. 用这个开关启动 Nuix。

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=80
    
  2. 获取 nuix_app.exe 的 Windows 进程 ID。

  3. 运行jconsole.exe <PID>

jdb.exe

  1. 用这个开关启动 Nuix。

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=80
    
  2. 使用这些开关运行 jdb.exe:

    jdb -connect com.sun.jdi.SocketAttach:port=80
    
  3. 键入 run 使 Nuix 退出挂起模式。

日食火星

  1. 用这个开关启动 Nuix。

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=80
    
  2. 转到运行 -> 调试配置... -> 远程 Java 应用程序。

  3. 配置

    Connection Type = Standard (Socket Attach)
    Host = localhost
    Port = 80
    
  4. 点击Debug

  5. 转到窗口 -> 透视图 -> 打开透视图 -> Java。

Java 任务控制 (jmc.exe)

  1. 使用这些开关启动 Nuix

    -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=80
    -Dcom.sun.management.jmxremote.local.only=false 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=127.0.0.1
    
  2. 单击创建新的自定义 JVM 连接。

  3. 配置选项

    Host = 127.0.0.1
    Port = 80
    
  4. 单击“测试连接”按钮。

VisualVM 1.4

  1. 使用这些开关启动 Nuix

    -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=80
    -Dcom.sun.management.jmxremote.local.only=false 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=127.0.0.1
    
  2. 在应用程序树中,右键单击本地,然后单击添加 JMX 连接...。

  3. 将连接设置为localhost:80,然后单击“确定”。

  4. 在 Applications 树中,双击 localhost:80 (pid: [process ID])


从 Windows 进程运行 JVM

基于JavaAccessBridge-64.dll的存在,我相信Nuix使用Java Access Bridge

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多