附加到进程
最后修改时间:2023 年 11 月 1 日运行| 附加到进程 CtrlAltF5
IntelliJ IDEA 提供了一种将调试器附加到本地和远程进程的方法。
附加到流程的步骤取决于流程的启动方式和位置。
首先,如果您想调试可以从 IntelliJ IDEA 启动的程序,最好的方法是启动本地调试会话。这种方式为您提供了完整的调试器功能,同时节省了额外配置的开销。
提示
虽然 IntelliJ IDEA 调试器能够附加到任何进程,但建议在有方法时选择更简单的方法。您不想附加到在同一台计算机上运行的“hello world”。
本主题中描述的选项在更复杂的情况下非常有用,例如当我们需要调试远程运行的进程或以不允许调试的方式启动的进程时。
先决条件
虽然不是绝对必需的,但必须满足以下先决条件才能启用全面的调试:
远程进程应使用调试代理启动。
应用程序需要使用调试信息进行编译。
您需要拥有应用程序的来源。
即使这些条件都不满足,调试仍然是可能的,但是,每个条件都存在相关的限制。这些要求将在后续章节中进行更详细的描述。
调试代理
旨在允许调试器连接的进程由调试代理启动。调试代理是负责与调试器通信的实体。调试对象通过套接字连接与 IntelliJ IDEA 调试器进行通信,无论进程是本地还是远程。
使用调试代理启动进程
启动该进程时,将以下行添加到其 VM 选项中:
附听-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
该选项具有以下参数:
address
– 将用于调试的端口server=y
– 指定进程应侦听传入的调试器连接(充当服务器)。suspend
– 指定进程是等待调试器连接还是立即启动
-agentlib:jdwp=transport=dt_socket,server=n,address=192.168.1.178:5005,suspend=y,onthrow=<FQ exception class name>,onuncaught=<y/n>
该选项具有以下参数:
address
– 服务器端的IP地址和端口。IPv4 和 IPv6 均受支持。server=n
– 指定进程应连接到调试器(充当客户端)suspend=y
– 指定进程应等到调试器连接后再继续。onthrow
– 可以选择延迟连接,直到抛出指定的异常。使用异常完全限定名称。onuncaught
– 可以选择延迟连接,直到抛出未捕获的异常。
根据 JDK 版本的不同,格式可能有所不同。要为您的 JDK 获取格式正确的字符串,您可以在远程 JVM 调试运行/调试配置中选择所需的 JDK 版本,然后从那里复制它。
笔记
如果该进程是通过另一个进程(例如 Apache Tomcat 等 Web 容器)启动的,则可能需要间接指定调试代理 VM 选项。例如,其他进程可以使用配置文件来将选项传递给被调试者。
如果本地进程不使用调试代理,您仍然可以以只读模式附加到它。调试器功能将仅限于查看调用堆栈和检查相关的局部变量。
这不是传统意义上的调试,应该被视为扩展的线程转储。它有用的情况的一个例子是当您的程序在批处理大量文件时挂起。使用只读模式,您可以找出导致程序挂起的方法以及当前正在处理哪个文件。
调试信息
调试信息是应用程序字节码中的特殊信息。调试器使用此信息来识别局部变量、行号等。应用程序的字节码可能包含也可能不包含调试信息。
调试信息在编译时提供给程序。这是由-g
编译器标志控制的。默认情况下,编译器包含调试所需的大部分信息,但如果不是您编译该应用程序,则可能会发生您要调试的程序在编译时没有这些信息的情况。
如果调试对象的字节码不包含调试信息,调试器仍然能够附加,但是,某些调试器功能可能不可用。例如,如果没有行号信息,则无法查看行号或在断点处停止。
无论调试信息如何,始终可用的最低限度:
类名,除非代码被混淆
静态变量和实例变量
调用堆栈
有关配置调试信息生成的更多信息,请参阅Java 编译器文档。
申请来源
建议您有权访问正在调试的项目的源代码。IntelliJ IDEA 将调试事件与源进行匹配,并在编辑器中显示与调试会话相关的信息。这使您可以将调试会话视为正在执行的源代码。
为了让 IntelliJ IDEA 找到源文件,它们必须位于类路径上。
附加到远程进程
连接到远程进程包括两个步骤:
创建运行/调试配置- 运行/调试配置指定应如何建立连接。创建运行/调试配置后,您可以将其重新用于以后的连接。
启动运行/调试配置– 当您启动运行/调试配置时,IntelliJ IDEA 使用运行/调试配置中定义的设置启动调试器。
提示
实际上,您可以按照以下步骤附加到任何使用调试代理的应用程序。本地和远程会话都使用套接字连接,唯一的区别是地址。
创建运行/调试配置
转到“运行”| 编辑配置。或者,按,然后按。AltShiftF1000
在“运行/调试配置”对话框中,单击工具栏上的 或按。从列表中选择远程 JVM 调试。AltInsert
在调试器模式下,指定调试器是否应连接到远程 JVM 还是侦听传入连接。
笔记
确保所选的调试器模式与远程 JVM 的 VM 选项一致。例如,如果远程 JVM 正在侦听(充当服务器),则调试器必须附加(充当客户端)。
如果您选择侦听远程 JVM,请指定是否要在远程 JVM 断开连接后自动重新启动调试器。这样,调试器将始终准备好处理传入连接。
(仅适用于 Windows 计算机)可以选择指定所需的传输。IntelliJ IDEA 会自动选择适当的传输,因此您无需配置它,除非您对通信方法有特殊要求。
指定远程 JVM 的主机和端口。IPv4 和 IPv6 均受支持。确保端口指定正确并且未被防火墙阻止。
指定要查找源的模块。IntelliJ IDEA 将首先检查所选模块,然后检查其他模块(如果有)。使用完全限定的类名来匹配源。如果完全限定名称没有匹配项,IntelliJ IDEA 会尝试通过文件名查找匹配项。
如果您尚未为调试对象 JVM 配置调试代理,则可以从“远程 JVM 的命令行参数”字段复制所需的 VM 选项。
启动运行/调试配置
确保主机应用程序已启动并正在运行,并且已使用添加调试代理的 VM 选项启动。
选择您之前创建的运行/调试配置。
在主工具栏上,单击“调试” 或按ShiftF9
附加到本地进程
附加到当前进程
如果您使用 IntelliJ IDEA 中的调试代理运行该进程,则可以直接从控制台附加到它。它在复杂的工作流程和您事先不知道调试端口的情况下非常有用。
使用调试代理从 IntelliJ IDEA 运行该进程。
当控制台出现时,单击Attach debugger inlay 提示。
从进程中分离
与远程进程分离的过程与停止本地调试会话的过程相同,但是效果不同。分离时,调试会话将关闭,但进程会继续运行。
单击“调试”工具窗口中主工具栏上的“停止” 按钮。
或者,单击主工具栏上的“停止” 或按,然后选择要关闭的会话。CtrlF2
感谢您的反馈意见!