远程调试Java应用程序

244 java debugging remote-debugging

我有一个在linux机器上运行的java应用程序.我使用以下代码运行java应用程序:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
Run Code Online (Sandbox Code Playgroud)

我在这台Linux机器上为TCP打开了端口4000.我在Windows XP机器上使用eclipse并尝试连接到此应用程序.我也在windows中打开了端口.

两台机器都在局域网上,但我似乎无法将调试器连接到Java应用程序.我究竟做错了什么?

Chr*_*ung 462

编辑:我注意到有些人在这里剪切和粘贴调用.我最初给出的答案仅与OP相关.这是一种更现代的调用方式(包括使用更传统的8000端口):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>
Run Code Online (Sandbox Code Playgroud)

原始答案如下.


试试这个:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp
Run Code Online (Sandbox Code Playgroud)

这里有两点:

  1. runjdwp选项中没有空格.
  2. 选项位于类名之前.类名后面的任何参数都是程序的参数!

  • [官方JDPA连接和调用文档](http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html#Invocation) (9认同)
  • 值得重复来自此 /sf/answers/9696291/ 的评论,“因为 Java 9 “address=1044”并不总是监听所有接口。“address=*:1044”使 Java 9+ 表现得像Java 8" 允许从不同主机调试 (4认同)
  • @DJGummikuh很好!我已经更新帖子,使用更新式的`-agentlib`选项,为您的剪切和粘贴乐趣.:-) (2认同)

Sai*_*ish 80

对于JDK 1.3或更早版本:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006
Run Code Online (Sandbox Code Playgroud)

对于JDK 1.4

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006
Run Code Online (Sandbox Code Playgroud)

对于较新的JDK:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006
Run Code Online (Sandbox Code Playgroud)

请根据您的需要更改端口号.

来自java技术说明

从5.0开始,-agentlib:jdwp选项用于加载和指定JDWP代理的选项.对于5.0之前的版本,使用-Xdebug和-Xrunjdwp选项(5.0实现还支持-Xdebug和-Xrunjdwp选项,但更新的-agentlib:jdwp选项更可取,因为5.0中的JDWP代理使用JVM TI接口VM而不是旧的JVMDI接口)

还有一点需要注意,来自JVM Tool界面文档:

JVM TI是在JDK 5.0中引入的.JVM TI取代了Java虚拟机概要分析程序接口(JVMPI)和Java虚拟机调试接口(JVMDI),从JDK 6开始,不再提供这些接口.


小智 28

脚步:

  1. 使用上面的帖子中所述的调试选项启动远程Java应用程序.
  2. 通过指定主机和端口来配置Eclipse以进行远程调试.
  3. 在Eclipse中启动远程调试并等待连接成功.
  4. 设置断点和调试.
  5. 如果你想从应用程序的启动调试使用suspend = y,这将使远程应用程序暂停,直到你从eclipse连接.

有关完整详细信息,请参阅Java远程调试的分步指南.


MrB*_*ack 12

我想强调的是,论证的顺序很重要

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jar命令打开调试器端口

java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000命令没有。它会将app.jar之后的所有内容作为命令行参数传递。

  • 我猜这是因为在你的第二个例子中,“app.jar”之后的所有内容都作为参数传递到你的 main 方法中 (5认同)

man*_*uti 9

Answer covering Java >= 9:

For Java 9+, the JVM option needs a slight change by prefixing the address with the IP address of the machine hosting the JVM, or just *:

-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n
Run Code Online (Sandbox Code Playgroud)

This is due to a change noted in https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435.

For Java < 9, the port number is enough to connect.