将IntelliJ IDEA调试器附加到正在运行的Java进程

274

是否可以将IntelliJ IDEA debugger连接到运行中的Java进程?如果可以,如何连接?


3
当然。您需要创建一个“远程”运行/调试配置。更多信息请参见这里 - Vic
2
这些命令行参数在14.0.2版本中是只读的。你只能编辑其中的一些,这对于解决这个问题没有帮助。有什么想法可以解决这个问题吗? - marknuzz
答案在这里:https://dev59.com/p6zla4cB1Zd3GeqPArGd#52717704 - RoutesMaps.com
5个回答

409

是的!以下是设置步骤。

运行配置

创建一个远程运行配置:

  1. 点击 Run -> Edit Configurations...
  2. 在左上角单击"+"号
  3. 在最左边的窗格中选择"Remote"
  4. 选择一个名称(我把我的命名为"remote-debugging")
  5. 单击 "OK" 保存:

enter image description here

JVM选项

上述配置提供了三个只读字段。这些选项告诉JVM,在运行应用程序时打开5005端口以进行远程调试。将适当的选项添加到您正在调试的应用程序的JVM选项中。一种可能的方法是这样的:

export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

但这取决于您如何运行应用程序。如果您不确定哪个适用于您,请从第一个开始并按列表向下进行,直到找到适合您的。

您可以将suspend=n更改为suspend=y,以强制您的应用程序等待与IntelliJ连接后才启动。如果您想要在应用程序启动时发生断点,这很有帮助。

调试

像往常一样启动应用程序,然后在IntelliJ中选择新配置并点击“Debug”。

enter image description here

IntelliJ将连接到JVM并启动远程调试。

现在,您可以根据需要向代码添加断点来调试应用程序。应用程序的输出仍将出现在先前出现的位置,但是断点将在IntelliJ中触发。


3
在我的 Mac OS El Capitan 上,我的 Intellij IDEA 15.0.2 中没有“Remote”选项。我该怎么获得这个选项? - user674669
@user674669 我不确定。也许“Remote”在社区版中不可用?我正在使用付费版本。有没有社区版的人可以确认一下? - Cory Klein
@CoryKlein 你知道在 IntelliJ 远程调试时如何获取 System.out.println 的输出吗? - Don Rhummy
1
@DonRhummy 如果你找到了方法,我很乐意将这些信息添加到答案中,但据我所知,IntelliJ目前不支持将远程应用程序的stdout和stderr管道返回到IntelliJ。 - Cory Klein
在我的情况下,我正在使用Tomcat。我在IntelliJ中使用了Tomcat的远程配置功能。我不得不为端口指定JVM参数,这个参数我在启动Tomcat时传递,端口像是"address=127.0.0.1:8001"。在IntelliJ的配置中,在启动/连接 | 调试下,我指定了传输方式:Socket,端口:8001。在构建方面我什么都不做,只是在使用构建的war文件启动Tomcat后,连接并启动这个调试配置。 - undefined
显示剩余3条评论

50

这是可能的,但是在启动应用程序时,您需要添加一些JVM标志。

您需要添加远程调试配置: 编辑配置 -> 远程。

然后在显示的对话框中找到参数,您需要将其添加到程序执行中,例如:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

当你的应用程序启动后,你可以附加调试器。如果你希望你的应用程序等待调试器连接,只需将挂起标志更改为y (suspend=y)

然后当您的应用程序启动时,您可以附加调试器。如果您希望您的应用程序等待调试器连接,只需将 suspend 标志更改为 y (suspend=y)

让我感到困惑的是,您编辑下面的输入后,这些输入会更新上面的选项字符串(至少在13.1 CE中是这样)。 - Carl G
8
从14.0.2版本开始,这些命令行参数是只读的。您可以编辑其中的一些参数,但如何解决问题呢? - marknuzz
1
另外,通过设置这些选项,您将附加到哪个进程? - marknuzz
5
第一个对我有用。给其他人的提示-在-jar标记之前需要指定这个。 - jim
3
@Nuzzolilo,Idea 中显示的命令行参数仅用于展示目的,因此它们是只读的。它们不应该被添加到 Idea 中,而是应该添加到您想要调试的远程 Java 应用程序中。 - Ganesh Krishnan

8

在AndroidStudio或Idea中

  1. 配置应用程序进行调试,打开“Edit Configurations”

添加“VM Options”配置 “-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005” 记住"address"

enter image description here

  1. 配置远程调试器 如果不存在,请单击“+”以添加

指定“Port”,与第1步中的“address”相同 enter image description here


7
此外,如果您想以调试模式连接,请不要忘记在应用程序JAVA_OPTS中添加“-Xdebug”标志。

0

我也使用Tomcat GUI应用程序(在我的情况下:C:\tomcat\bin\Tomcat9w.bin)。

  • 进入Java选项卡:

    enter image description here

  • 设置您的Java属性,例如:

    Java虚拟机

    C:\Program Files\Java\jre-10.0.2\bin\server\jvm.dll

    Java虚拟机

    C:\tomcat\bin\bootstrap.jar;C:\tomcat\bin\tomcat-juli.jar

    Java选项:

    -Dcatalina.home=C:\tomcat

    -Dcatalina.base=C:\tomcat

    -Djava.io.tmpdir=C:\tomcat\temp

    -Djava.util.logging.config.file=C:\tomcat\conf\logging.properties

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000

    Java 9选项:

    --add-opens=java.base/java.lang=ALL-UNNAMED

    --add-opens=java.base/java.io=ALL-UNNAMED

    --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED


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