我有一个java应用程序运行在linux机器上。我运行java应用程序使用以下:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
我在这台Linux机器上为TCP打开了4000端口。我使用eclipse从Windows XP机器,并尝试连接到这个应用程序。我也打开了窗口的端口。
两台机器都在局域网上,但我似乎无法将调试器连接到Java应用程序。我做错了什么?
我有一个java应用程序运行在linux机器上。我运行java应用程序使用以下:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
我在这台Linux机器上为TCP打开了4000端口。我使用eclipse从Windows XP机器,并尝试连接到这个应用程序。我也打开了窗口的端口。
两台机器都在局域网上,但我似乎无法将调试器连接到Java应用程序。我做错了什么?
当前回答
对于每个有问题的人来说,如果你真的从一台机器远程调试到另一台机器,那么使用:
-agentlib: jdwp =运输= dt_socket, server = y,地址= 8000,暂停= n
是不够的,因为它现在绑定到localhost(至少在unix/osx机器上),所以你只能从localhost连接到它。
如果你试图远程调试,那么你将得到拒绝连接。从我认为Java 9上你需要做:
-agentlib: jdwp =运输= dt_socket, server = y,地址= *:8000年,暂停= n
或者给它一个需要绑定的IP
其他回答
我想强调论证的顺序很重要。
Java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
但是Java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000命令没有。它将把app.jar之后的所有内容作为命令行参数传递。
编辑:我注意到有些人在这里剪切和粘贴调用。我最初给出的答案只与OP相关。下面是一个更现代的调用风格(包括使用更传统的8000端口):
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>
以下是原来的答案。
试试这个:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp
这里有两点:
runjdwp选项中没有空格。 选项出现在类名之前。类名之后的任何参数都是程序的参数!
对于每个有问题的人来说,如果你真的从一台机器远程调试到另一台机器,那么使用:
-agentlib: jdwp =运输= dt_socket, server = y,地址= 8000,暂停= n
是不够的,因为它现在绑定到localhost(至少在unix/osx机器上),所以你只能从localhost连接到它。
如果你试图远程调试,那么你将得到拒绝连接。从我认为Java 9上你需要做:
-agentlib: jdwp =运输= dt_socket, server = y,地址= *:8000年,暂停= n
或者给它一个需要绑定的IP
回答涵盖Java >= 9:
对于Java 9+, JVM选项需要稍微改变一下,用托管JVM的机器的IP地址作为地址的前缀,或者只是*:
-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n
这是由于在https://www.oracle.com/java/technologies/javase/9-all-relnotes.html#JDK-8041435中注意到的变化。
对于Java < 9,端口号足以连接。
步骤:
启动远程java应用程序的调试选项,如上面的帖子所述。 通过指定主机和端口为远程调试配置Eclipse。 在Eclipse中启动远程调试并等待连接成功。 设置断点和调试。 如果您想从应用程序开始调试使用suspend=y,这将使远程应用程序一直挂起,直到从eclipse连接。
详细信息请参见Java远程调试的“一步一步”指南。