调试#
本节介绍各种类型的应用程序通用的过程。
IntelliJ IDEA提供了一整套用于调试源代码的工具:
如果要查看所有当前调试应用程序的列表,请选择 “运行”| 从主菜单中显示运行列表。 有关详细信息,请参阅 查看正在运行的进程部分。
启动调试会话#
- 配置要传递给编译器的依赖项和库,并生成调试信息。
- 配置常见的调试器行为,包括步进速度, 类重新加载策略或 滚动编辑器画布。
- 配置调试器引擎。
- 要调试CoffeeScript,TypeScript和 Dart代码,您需要为其生成源映射。这将设置原始代码和生成的JavaScript代码中的行之间的对应关系。如果未生成源映射,则无法正确识别和处理断点。
- 为要调试的应用程序定义运行/调试配置。
- 创建一个断点。
- 单击图标。阅读有关在启动调试器会话中调试会话的更多信息。
有关详细信息,请参阅调试CoffeeScript, TypeScript以及运行和调试Dart Web应用程序。
启动调试会话后,标记“ 调试”工具窗口的图标将 切换 为指示调试过程处于活动状态。
请注意,IntelliJ IDEA允许您以与普通源文件相同的方式调试反编译代码,前提是它包含行号属性。
调试#
为项目配置运行配置后,可以按调试模式启动它Shift+F9。
在“ 调试”工具窗口中,您可以看到包含状态,变量和监视的框架和线程列表。选择框架时,您会看到与所选框架对应的变量。
断点#
自定义断点设置#
要自定义断点设置,请按Ctrl+Shift+F8。要查看项目中的所有断点(使用其他设置),请单击“ 更多”或Ctrl+Shift+F8 再次按相同的快捷方式 。
如果您有任何标有标签的实例,您也可以在条件表达式中使用它:
在读取或写入字段时暂停代码执行#
除了条件断点,您还可以使用字段断点。当访问字段以进行读取或写入时,这些断点将停止。要创建这样的断点,只需在字段声明处单击装订线:
不要暂停代码执行
使用操作断点来评估特定代码行的变量,而不会暂停代码执行。要创建操作断点,请在按下时单击装订线Shift。
创建临时断点#
要创建仅停止一次的断点,请在按住时单击左侧装订线 Shift+Alt。有关更多信息,请参阅断点部分。
禁用断点#
要禁用断点,请在按下时单击断点Alt。有关详细信息,请参阅断点部分。
调试器会话#
智能迈进#
有时会发生这样的情况,即你停留在一条线上并想要进入一个特定的方法而不是第一个被调用的方法。在这种情况下,通过按下 选择特定方法使用智能步骤Shift+F7。
有关详细信息,请参阅选择要进入的方法一节。
丢帧#
如果你想在调试时“回到过去”,你可以通过Drop Frame动作来实现。如果你错误地走得太远,这将是一个很大的帮助。这不会恢复应用程序的全局状态,但至少会通过堆栈框架返回。
调试工具窗口 参考中描述了该图标。
运行到光标#
- 创建一个断点。
- 运行调试会话。要运行调试会话,请单击装订区域中的“运行应用程序” 图标(),然后选择“ 调试<configuration_name>”。
要在光标位置停止代码执行而不添加其他断点,请单击“ 运行到光标”图标()或按Alt+F9。或者,您可以单击装订线区域中的行号。
调试工具窗口的工具栏参考中描述了 该图标。
标记对象#
要向实例添加彩色标签,请按F11“ 变量和手表”选项卡中的或上下文菜单 。
下次此实例出现在Watches,Variables或Evaluate表达式中时,您将看到标签:
评估表达#
在调试模式下,您可以按下来 评估任何表达式Alt+F8。
此工具提供代码完成,就像在编辑器中一样,因此输入任何表达式都非常容易:
如果您有任何标有标签的实例,代码完成将为您提供其名称,以便您可以评估它们:
有关详细信息,请参阅评估表达式一节。
重新加载更改和热交换#
有时,您需要在不关闭进程的情况下在代码中插入微小更改。由于Java VM具有HotSwap等功能,因此IDE会自动处理这些情况,并允许您在调试模式下编译更改的类时重新加载更改的类。
请记住,Java VM的HotSwap有许多约束,不支持重新加载静态字段和方法。
远程调试#
关于在IntelliJ IDEA中进行调试,你应该知道的最后一件事是远程调试。远程调试意味着将调试器附加到已在您或任何其他主机上的特定端口上运行的进程。这样,您可以将调试器附加到独立运行的应用程序服务器。
要创建远程配置,请转至编辑配置并添加 远程运行配置。在运行此配置之前,请确保指定正确的主机和端口。
设置#
配置调试器设置#
要更改调试器设置,请单击“ 文件”| 设置。在“ 设置”菜单中,单击“ 构建,执行,部署” 调试器。
有用的调试器快捷方式#
行动 | 热键 |
Ctrl+F8 | |
F9 | |
F8 | |
F7 | |
停止 | Ctrl+F2 |
Ctrl+Shift+F8 | |
在插入符调试代码 | Shift+F9 (在主要方法内),或 Shift+Alt+F9 |
断点#
本节介绍各种类型的应用程序通用的过程。
IntelliJ IDEA提供了一整套用于调试源代码的工具:临时线路断点)。如果在外部修改了带有断点的文件,例如,通过VCS更新或在外部编辑器中更改,并且行号已更改,则将相应地移动断点。请注意,进行此类更改时必须运行IntelliJ IDEA,否则它们将被忽略。
换行符#
可以在可执行的代码行上设置换行符。线程执行在具有此断点的行之前暂停,IntelliJ IDEA在该线程的堆栈上显示堆栈帧。
设置换行符#
- 将插入符号放在要设置断点的可执行代码行上。
如果要在默认类构造函数中设置断点,请将其设置在此类的第一行,因为默认构造函数已映射到它。 - 单击该行旁边的左侧装订线,或按Ctrl+F8。
要设置临时线路断点,请按Ctrl+Shift+Alt+F8。它会在被击中后立即从您的项目中删除。
对于lambda表达式,您可以在一行中设置多个断点。单击左侧装订线,然后从列表中选择要设置断点的方法:
删除换行符#
- 单击左侧装订线中的断点图标。
为避免意外删除断点并丢失其参数,您可以选择通过将断点拖动到编辑器或单击鼠标中键来删除断点:在“ 设置/首选项” 对话框中(Ctrl+Alt+S)转到“ 构建,执行,部署”|“删除” 。调试器并选择 拖动到编辑器或单击鼠标中键。只需单击断点即可切换其状态(启用/禁用)。
方法断点#
方法断点用于响应程序进入或退出特定方法。它们允许您在方法级别跟踪程序流程,并检查进入和退出条件。
设置方法断点#
- 将插入符号放在方法声明中。
- 单击该行旁边的左侧装订线。
默认情况下,IntelliJ IDEA设置模拟方法断点,它是在所有实现或重写方法的第一个语句中设置的行断点的组合。此类模拟断点不会影响调试的应用程序性能,而“真正的”方法断点会因JVM设计而显着降低调试器的速度。
模拟方法断点不适用于没有行号信息的本机方法和类。如果是这种情况,请右键单击方法断点并取消选择“ 模拟”选项:
删除方法断点#
- 单击左侧装订线中的断点图标。
为避免意外删除断点并丢失其参数,您可以选择通过将断点拖动到编辑器或单击鼠标中键来删除断点:在“ 设置/首选项” 对话框中(Ctrl+Alt+S)转到“ 构建,执行,部署”|“删除” 。调试器并选择 拖动到编辑器或单击鼠标中键。只需单击断点即可切换其状态(启用/禁用)。
异常断点#
抛出指定的异常时会触发异常断点。它们全局应用于异常条件,不需要特定的源代码引用。
设置异常断点#
- 按Ctrl+Shift+F8或选择运行| 从主菜单中查看断点。
- 在“ 断点”对话框中,按Alt+Insert或单击,然后选择“ Java异常断点”或“ JavaScript异常断点”。
- 在“ 输入异常类”对话框中,从库或项目中指定异常类。
删除异常断点#
- 按Ctrl+Shift+F8或选择运行| 从主菜单中查看断点。
- 在“ 断点”对话框中,在“ Java异常断点”下选择要删除的 断点,然后单击 或按N/A。
现场观察#
现场观察点允许您对特定实例变量的修改做出反应。例如,如果在复杂过程结束时,您的某个字段上的值明显错误,则设置字段监视点可能有助于确定故障的来源。
设置一个字段观察点#
- 在调试会话期间,打开“ 变量”视图。
- 右键单击字段,然后从上下文菜单中选择“ 添加字段观察点 ”。
您还可以在编辑器中打开一个类,找到要为其创建监视点Alt+click的字段,并 在字段声明行中找到左侧装订线。
删除字段观察点#
- 按Ctrl+Shift+F8或选择运行| 从主菜单中查看断点。
- 在“ 断点”对话框中,在“ 字段观察点”下选择要删除的断点 ,然后单击 或按N/A。
断点属性#
根据断点类型,您可以配置其他属性,例如:
- 命中断点时要执行的操作
- 一个挂起策略,用于定义在遇到断点时是否必须挂起应用程序
- 对其他断点的依赖
- 定义何时必须命中断点的条件
要编辑断点属性,请按Ctrl+Shift+F8,或右键单击编辑器装订线中的断点。
选项 | 描述 | 断点类型 |
启用 | 清除以暂时禁用断点而不将其从项目中删除。在调试过程中将禁用已禁用的断点。 | 行 |
暂停 | 选择在命中断点时暂停程序执行。如果您需要获取日志记录信息或在某个点计算表达式而不中断程序,则暂停应用程序非常有用。如果需要创建一个在命中时触发相关断点的主断点,请选择不在该断点处挂起程序。 选择暂停政策:
如果其策略设置为All,则程序不会在断点处暂停,并且在此断点被触发时执行某些操作步进操作。 | 行 |
条件 | 选择以指定命中断点的条件。条件是Java布尔表达式,包括返回的方法 此表达式必须在设置断点的行有效,并且每次遇到断点时都会对其进行求值。如果评估结果是 您可以输入多行表达式,例如:
例如,对于异常断点,用于 | 行 |
日志 | 选择是否要将以下事件记录到控制台:
| 行 |
评估并记录 | 选择在命中断点时计算表达式,并在控制台输出中显示结果。 例如,对于异常断点,用于 | 行 |
删除一次命中 | 选择在项目被击中后立即从项目中删除断点。 | 线路 |
禁用直到断点被击中 | 选择将触发当前断点的断点。在该断点被触发之前,将禁用当前断点。您也可以选择是否要再次禁用它,或者在命中后将其保持启用状态。 | 行 |
捕获类过滤器 | 选择以过滤掉将捕获异常的类。您可以键入过滤器,也 可以在“ 类过滤器” 对话框中单击 并配置过滤 器。 您可以指定类名或类模式(带有*通配符的字符串)。如果通过类名指定过滤器,则它指向类本身及其所有子类。通过类模式指定的过滤器指向其完全限定名称与此模式匹配的类。 句法:
例如, | 例外 |
实例过滤器 | 选择以限制特定对象实例的断点命中。输入以空格分隔的实例ID,或单击 并在“ 实例过滤器”对话框中添加它们。 | 线 |
类过滤器 | 选择以过滤必须命中断点的类。您可以键入过滤器,也 可以在“ 类过滤器” 对话框中单击 并配置过滤 器。 您可以指定类名或类模式(带有*通配符的字符串)。如果通过类名指定过滤器,则它指向类本身及其所有子类。通过类模式指定的过滤器指向其完全限定名称与此模式匹配的类。 句法:
例如, | 行 |
通过计数 | 选择是否需要在达到特定次数后才触发断点。这对于调试多次调用的循环或方法很有用。 如果同时设置了Pass Count和Condition,则IntelliJ IDEA首先满足条件,然后检查通过计数以避免两个设置之间的冲突。 | 行 |
来电过滤器 | 选择是否只有在某个方法调用(或未调用)时才需要在断点处停止。键入调用方法,或 在“ 调用者过滤器”对话框中单击 并配置过滤器。 您可以指定方法名称或方法模式(带有*通配符的字符串)。 句法:
| 行 |
看 | ||
现场访问 | 选择每次访问字段时触发断点。 | 现场观察点 |
现场修改 | 选择仅在修改字段时触发断点。 | 现场观察点 |
模拟 | 创建方法断点时,默认情况下会设置此选项。IntelliJ IDEA不是使用慢速方法断点,而是在模拟方法断点的所有实现或重写方法的第一个语句处设置行断点的组合。 我们建议您在调试远程代码时取消选择此选项(因为模拟断点的设置可能非常慢),或者您需要在没有行号信息的方法中设置断点。 | 方法 |
方法输入 | 选择每次输入方法时触发断点。 | 方法 |
方法退出 | 选择此选项可在每次退出方法时触发断点。 | 方法 |
通知 | ||
抓到了异常 | 选择在遇到捕获的异常时遇到断点时收到通知。 | 例外 |
未捕获的异常 | 选择在未捕获的异常上遇到断点时收到通知。 | 例外 |
生产力提示#
快速访问最常见的设置
右键单击编辑器装订线中的断点以快速禁用或挂起它,或设置条件。
断点意图
您可以通过意图操作(Alt+Enter)访问最常见的断点操作和过滤器。
当遇到断点时,可以使用更多意图操作。
分组断点
您可以将断点组织到组中,例如,如果需要标记特定问题的断点。
在“ 断点”对话框(Ctrl+Shift+F8)中,选择要放入组中的断点,然后选择“ 移动到组|” <group_name> /从上下文菜单中创建新的。
移动断点
要移动线断点,请将其拖动到目标线。
复制断点
要复制断点,请按下Ctrl并将其拖动到目标行。
禁用断点
要暂时禁用断点而不将其从项目中删除,请按住Alt 键并单击装订线中的断点图标。
快速搜索
如果项目中有许多断点,则可以向它们添加简短描述以轻松搜索它们:右键单击“ 断点”对话框中的断点(Ctrl+Shift+F8),然后从上下文菜单中选择“ 编辑描述 ”。现在,当您开始键入断点的名称时,它将获得焦点。
跳转到源头
要从“ 断点”对话框跳转到设置了所选断点的代码行,请按F4。
配置调试器选项#
简介#
IntelliJ IDEA支持调试Java和Groovy应用程序,类和文件。调试功能包含在IntelliJ IDEA中,您只需配置其设置即可。
根据启用的插件,IntelliJ IDEA还可以支持其他语言的调试,例如JavaScript,Flex或PHP。
IntelliJ IDEA支持调试在内置或外部Web服务器上运行的应用程序。只能使用谷歌浏览器和Chrome系列的其他浏览器进行调试。
配置调试器设置#
要配置调试所需的设置,请执行以下常规步骤#
- 在Project Structure对话框(Ctrl+Shift+Alt+S)中,配置要传递给编译器的根,依赖项和库。
- 在Settings / Preferences 对话框(Ctrl+Alt+S)中,配置调试器选项:
- 在“ 构建,执行和部署”部分下,单击“ 调试器”,然后配置调试器选项。
- 在Build,Execution and Deployment部分下,指向 Compiler节点,单击Java Compiler或RMI Compiler,然后选中Generate debugging info复选框 。
启动调试器会话#
在调试之前#
调试会话以所选的运行/调试配置开始。请注意,可以同时启动多个调试过程。
在IntelliJ IDEA中调试应用程序时,请记住这一点
- 如果选择了运行/调试/重新加载前的Make模块选项,则IntelliJ IDEA首先编译项目中所有已修改的源。
- 如果编译报告没有错误,IntelliJ IDEA继续进行调试。
- 如果在调试之前尚未编译代码,则源文件和类文件可能不同步。
- 如果
-classpath
在“ VM选项”字段中指定选项,则将覆盖所选的模块类路径。 - 如果您调试JavaScript源,IntelliJ IDEA会打开HTML文件的浏览器,并将脚本放在单独的框架中。
开始调试应用程序#
- 选择要执行的运行/调试配置,然后执行以下操作之一:
- 单击左侧装订线中的图标,然后选择。
- 单击工具栏上的。
- 在主菜单上,转到“运行”| 调试'选定配置'。
- 按Shift+F9。
请注意,在启动调试会话后, 标记“ 调试工具窗口”的图标将 切换为指示调试过程处于活动状态。
暂停和恢复调试器会话#
在本页面:
当命中断点时,或者手动暂停正在运行的线程或应用程序时,将暂停调试会话。
暂停调试器会话#
请执行以下任何操作:
- 在主菜单上,选择“运行”| 暂停程序。
- 单击 “调试”工具栏上的。
请注意,该按钮不适用于运行/调试配置:Node.js,运行/调试配置:附加到Node.js / Chrome,以及 运行/调试配置:NodeUnit。
恢复调试器会话#
请执行以下任何操作:
- 在主菜单上,选择“运行”| 简历程序。
- 单击“调试”工具栏上的。
- 按F9。
检查暂停程序#
当执行到达断点或手动挂起程序时,您可以通过分析帧来 检查应用程序。
甲帧对应于一个激活的方法或函数调用。框架存储被调用方法或函数的局部变量,对其的参数以及启用表达式求值的代码上下文。
所有当前活动的帧都显示在“ 调试”工具窗口的“ 帧”窗格中 ,您可以 在其中切换它们并分析存储在其中的信息。
检查挂起的线程的帧#
- 从“ 帧” 窗格顶部的线程选择器列表中选择一个线程。显示框架列表:
- 从“ 帧”列表中选择一个帧。“ 变量”窗格显示此框架中方法调用可用的所有变量,因此您可以进一步探索它们。
在帧之间导航#
- 使用工具栏上的向上和向下箭头按钮。
- 使用Up和Down快捷方式。
您无需执行任何操作即可导航到框架的源代码。IntelliJ IDEA会自动跳转到编辑器中所选帧的源代码。
在帧之间导航,执行以下操作之一:#
- 使用工具栏上的向上和向下箭头按钮。
- 使用Up和Down快捷方式。
导出线程#
如果需要获取有关所有线程状态的报告,可以导出线程信息。
- 右键单击“ 帧”选项卡中的任意位置,然后 从上下文菜单中选择“ 导出线程 ”,或选择“运行”| 从主菜单导出线程。
- 要将报告另存为文本文件,请在“ 导出线程” 对话框中指定文件的路径,然后单击“ 保存”。
- 要将其复制到剪贴板,请单击“ 复制”。
探索框架#
在列表中选择框架时,此框架的方法调用可用的所有值都显示在“ 调试”工具窗口的“ 变量”窗格中,因此您可以进一步浏览它们。本节介绍简化检查这些值的方法:
评估表达式#
IntelliJ IDEA使您能够在“ 调试”工具窗口的“ 帧”窗格中 当前选定的堆栈帧的上下文中计算表达式和代码片段。
除了正则表达式,您还可以计算运算符表达式,lambda表达式和匿名类。
可以使用以下评估模式:
- 用于评估单行表达式的表达模式。
- 用于评估短代码部分的代码片段模式。您可以评估声明,分配,循环和
if/else
。
此外,IntelliJ IDEA提供了一种快速评估插入符号表达式或编辑器中选择的方法。
使用表达式评估功能时,请注意以下事项:
- 仅当调试器在断点处停止但尚未暂停时,才能在“ 评估”对话框中调用方法。
- 表达评估只能是“单级”。换句话说,如果IntelliJ IDEA在从Expression Evaluation调用的方法中的断点处停止,则无法再次使用Expression Evaluation功能。
- 如果在Expression Evaluation中调用的方法在其主体内部有断点,则将忽略此断点。
请注意,在某些操作系统中,键和鼠标组合可能无法正常工作,如此处所述。在这种情况下,有必要调整操作系统的键映射。例如,如果您使用的是Ubuntu,请注意Windows管理器,其快捷方式 与IntelliJ IDEA 的 快捷方式相冲突。
使用专用对话框评估表达式#
计算堆栈帧中的表达式或代码片段#
- 在“ 框架”窗格中,选择要评估表达式的线程。
- 使用以下方法之一调用Evaluate Expression命令:
- 选择评估模式。如果要评估代码片段,请单击“ 代码片段模式”按钮。
- 根据所选模式,在文本字段中键入要评估的表达式或语句,然后单击“ 评估”。
如果无法计算指定的表达式,则会在对话框的“ 结果”窗格中简要描述可能的原因 。
评估任意表达式#
- 使用以下方法之一打开“ 评估表达式”对话框:
- 在“ 评估表达式”对话框中,指定要评估的表达式。执行以下操作之一:
- 在“ 表达式”字段中,键入有问题的表达式,或从下拉列表中选择以前计算的表达式之一。 如果在“ 变量” 窗格中选择了特定变量,则此变量将显示在“ 表达式”文本框中。
- 要评估代码片段,请单击“ 代码片段模式”按钮并填写“ 代码片段”文本框。 要返回原始模式,请单击“ 表达式”模式按钮。
- 单击“ 评估”按钮。该结果 只读领域显示了这些评价的输出。如果无法计算指定的表达式,则“ 结果”字段将说明原因。
在编辑器中评估表达式#
在调试器会话期间,每次将鼠标指针悬停在工具提示上时,任何表达式的值都会显示在工具提示中。如果表达式包含子项,则单击展开节点并显示所有子项。
您还可以使用“ 快速评估”表达式功能,该功能仅允许您使用键盘查看表达式的值。
有两种方法可以快速评估表达式:
在代码选择上显示值工具提示#
- 在调试器中| “数据视图”设置页面,启用“ 代码选择时显示值工具提示”选项。
- 用鼠标选择代码片段,或按Ctrl+W。带有表达式值的工具提示会自动显示在选择项下,并在每次更改选择时更改。
使用表达式值#手动调用工具提示
- 将插入符号放在所需位置,或选择要评估的表达式。
- 选择运行| 在主菜单上快速评估表达式,或按 Ctrl+Alt+F8。带有表达式值的工具提示将显示在所选表达式下。
添加,编辑和删除手表#
如果要在当前帧的上下文中评估许多变量或表达式,并同时查看所有变量或表达式,可以为它们创建监视。通过应用程序的每个步骤更新表达式的值,但仅在应用程序挂起时才可见。与表达式评估功能不同,这些表达式作为项目的一部分保留。
隐藏或打开“监视”窗格#
默认情况下,“ 监视”窗格将隐藏,监视将显示在“ 变量”窗格中。
- 要单独显示“ 监视”窗格并在其中查看已配置的监视,请释放“ 变量”窗格工具栏上的切换按钮。默认情况下,按下按钮。
- 要隐藏“ 监视”窗格并在“ 变量”窗格中查看监视,请按“ 监视”窗格工具栏上的切换按钮。
创造一个手表#
- 在“ 监视”窗格中,单击 或按Insert。
- 在“ 变量”窗格中选择一个或多个项目,然后将它们拖到“ 监视”窗格中。
- 右键单击编辑器中的项目,然后在上下文菜单中选择“ 添加到手表 ”。
- 在“ 变量”窗格中,或在“ 检查” 窗口中,或在“ 评估表达式”对话框中,右键单击所需的项目,然后在上下文菜单中选择“ 添加到手表 ”。
编辑手表#
- 要更改手表表示的表达式,请右键单击所需的手表,然后在上下文菜单中选择“ 编辑 ”。
要删除手表#
- 在手表窗格中,选择一个表被删除。
- 在上下文菜单中,选择“ 删除监视”,或按Alt+Delete。
检查看过的物品#
IntelliJ IDEA有助于在自己的窗口中检查任何变量或监视项目。例如,如果需要详细检查多个引用,可以为每个引用打开一个检查窗口。这样,就为每个变量或监视引用及其所有子引用创建了一个单独的窗口。
检查窗口是非模态的,您可以启动所需的多个窗口。参考文献的所有更改都会立即反映在相应的检查窗口中。
隐藏或打开“监视”窗格#
默认情况下,“ 监视”窗格将隐藏,监视将显示在“ 变量”窗格中。
- 要单独显示“ 监视”窗格并在其中查看已配置的监视,请释放“ 变量”窗格工具栏上的切换按钮。默认情况下,按下按钮。
- 要隐藏“ 监视”窗格并在“ 变量”窗格中查看监视,请按“ 监视”窗格工具栏上的切换按钮。
检查参考文献#
- 在“ 变量”或“ 手表”窗格中选择要检查的项目。
- 在上下文菜单中,选择“ 检查”。
将标签设置为变量,对象和手表#
您可以将自己的标签添加到变量,对象或监视中,然后将其引用,就好像它是<label-name>_DebugLabel
在计算表达式的同一上下文中定义的局部变量 一样。IntelliJ IDEA还在“ 评估表达式”对话框中的代码完成建议列表中显示这些标签 。
设置标签#
- 在列表中选择所需的手表
- 在上下文菜单中选择标记对象或按F11。将打开“ 选择对象标签”对话框
- 指定标签名称。
- 单击“ 浏览” 以更改标签颜色。准备好后单击确定。
删除标签#
- 右键单击该项目,然后在上下文菜单中选择“ 取消标记对象 ”
- 选择列表中的项目,然后按F11。
从调试工具窗口导航到源代码#
要导航到源代码,请执行以下操作之一:#
- 在“ 变量” 选项卡中选择所需的项目, 然后按 F4。
- 右键单击“ 变量”选项卡中的项目 ,然后从上下文菜单中选择“ 跳转到源 ”。
导航到对象的源#
- 在“ 变量”或“ 手表”选项卡中选择一个项目, 然后按 Shift+F4。
- 右键单击“ 变量”或“ 监视”选项卡中的项目,然后从上下文菜单中选择“ 跳转到对象源 ”。
自定义视图#
在本页面:
简介#
在探索框架及其内容时,您可能希望自定义数据的显示方式。本节介绍如何设置此类选项。
自定义线程视图#
您可以根据需要组织列表中显示线程的方式。
自定义线程视图#
- 右键单击“ 帧”选项卡中的任意位置,然后选择“ 自定义线程视图”。
- 指定查看选项。这里将详细介绍它们。
自定义数据视图#
您可以根据需要组织数据在“ 变量”选项卡中的显示方式。
自定义数据视图#
- 右键单击“ 变量”选项卡中的任意位置,然后选择“ 自定义数据视图”。
- 指定查看选项。这里将详细介绍它们。
自定义类型渲染器#
您还可以指定自己的类型渲染器而不是默认类型。它们使您能够自定义对象在调试器中的显示方式,提供“面向逻辑”的数据表示,而不是默认情况下面向结构的表示。
渲染对象#
渲染对象视图#
- 打开“设置/首选项”对话框(Ctrl+Alt+S),单击“ 调试器”,然后选择“ 类型渲染器”。
- 单击以创建新的渲染器。
- 指定渲染器名称,应用它的对象类以及渲染时要使用的表达式。有关渲染选项的详细信息,请参阅 选项说明。
- 定义展开节点的外观。
- 单击确定。
禁用自定义类型渲染器#
禁用自定义类型渲染器#
- 打开“ 设置” 对话框(Ctrl+Alt+S),单击“ 调试器”,然后选择“ 类型渲染器”。
- 在列表中选择要禁用的类型渲染器,然后清除列表中其名称旁边的复选框。 即使禁用了类型渲染器,也可以使用“ 查看为”选项临时切换到程序时切换到该类型。
- 单击确定。
在类型渲染器之间切换#
在调试工具窗口中单步执行应用程序时,可以在渲染器方案之间临时切换。
在类型渲染器之间切换#
- 在“ 调试”工具窗口的“ 变量”或“ 监视”选项卡中右键单击对象实例。
- 在上下文菜单中,单击“ 查看方式”,然后从适用的类型渲染器列表中选择渲染器。
查找当前执行点#
程序暂停时,将在编辑器中打开与当前执行点关联的源文件。当前执行点(要执行的下一行)标有蓝线。
您可以访问其他文件,然后使用本节中描述的操作返回到当前执行点。
要查找当前执行点,请执行以下操作之一#
- 在主菜单上,选择“运行”| 显示执行点。
- 按Alt+F10。
- 单击“调试”工具窗口的 步进工具栏。
逐步完成该计划#
当达到断点或程序暂停时,“ 调试”工具窗口将变为活动状态,使您可以控制程序的执行。为此,您可以使用“ 运行”菜单命令或“ 调试”工具窗口中步进工具栏上的图标。
每个步进操作都会将 执行点 提升到下一个执行位置,具体取决于您选择的操作。
逐步完成该计划#
提示和技巧#
- 该部队步执行命令,使您步入一个类不被跨进,例如,一个标准的Java SDK类的方法。 在“设置/首选项”对话框的“ 步进”页面上
指定了禁止进入的类。 - 该部队步过命令,您可以跳过方法调用忽略途中断点。
- 该部队执行到光标命令使您可以跳转到光标位置忽略的道路上现有的断点。
选择一种方法进入#
当您通过多种方法调用到达一行时,您可以选择要插入的方法。
选择进入的方法#
- 在主菜单上,选择 “运行”| 智能踏入 或按下 Shift+F7。
- 在弹出窗口中,从列表中选择所需的方法。
提高步进速度#
要提高步进速度,请遵循以下建议#
- 尝试避免方法和字段断点。
- 如果在调试工具栏中启用了Watch方法返回值选项 设置,禁用它。
- 通过清除“ 调试器”设置 的“ 数据视图”页面上的“ 为集合类启用备用视图”复选框, 关闭“集合”类的“ 备用”视图。
- 通过清除Debugger设置 的Data Views页面上的Enable'toString'对象视图复选框,关闭IDE级别的'ToString'模式。
- 简化断点和观察点的条件,尤其是频繁发生的断点和观察点。
- 使用过滤器(例如,用于类实例)。
- 在调试会话期间,切换到具有较少元素的视图。
监控调试信息#
有关调试会话的信息显示在以所选运行/调试配置命名的“ 调试”工具窗口的专用选项卡中。
对于每个会话,使用“ 控制台”选项卡查看调试器消息和应用程序输出,使用“ 调试”选项卡监视线程和帧。
显示和修改局部变量或监视值时,如果在项目级别未指定编码,IntelliJ IDEA将使用当前项目的 默认编码设置或IDE编码。显示PHP控制台脚本输出时使用相同的设置。
监控调试器开销#
调试过程是运行时的一部分,因此可能会影响性能。对表达式的每次评估或跨越代码都使用与调试的应用程序相同的内存,并且可能导致大量开销。
IntelliJ IDEA允许您查看此开销,以便您可以快速检测导致它的原因并通过删除不必要的断点,禁用表达式的自动评估,关闭异步堆栈跟踪等来减少它。
要调用Overhead窗格,请单击Debug 工具窗口右上角的图标:
分析JVM堆中的对象#
IntelliJ IDEA允许您在内存视图中的调试会话期间浏览JVM堆中的对象(要打开它,请单击调试工具窗口右上角的 恢复'内存'视图 )。
该内存视图显示在堆中的对象总数:
当您跳过代码时,Diff列显示调试器停止之间对象数量的变化,这有助于您了解步进的代码如何影响堆。
请注意,您需要单击表中的任意位置以刷新类列表,因为出于性能原因,它不会自动刷新。
双击类名以查看此类的所有实例:
此对话框允许您通过计算表达式过滤实例,启用此类的新实例跟踪,并从上下文菜单中执行所有调试器操作,如检查,标记对象,评估表达式, 添加到手表等。
当您启用对类的新实例的跟踪时,“ 内存”视图中相应对象旁边会显示图标,如果对象数更改,则“ Diff”列中的值将变为可单击,这样可以快速检查新对象的内容是:
要禁用对类的新实例的跟踪,请右键单击并取消选择“ 跟踪新实例”选项。
单击右上角的图标以切换以下查看选项:
- 仅显示实例:如果选中,则仅列出具有实例的类。
- 仅显示非零差异:如果选中,则仅列出自上次调试器停止后编号已更改的对象。
- 仅显示跟踪的类:如果选中,则仅列出启用了跟踪新实例的类。
- 使用隐藏内存视图启用跟踪:如果选中,即使内存视图已关闭,仍将启用对类的新实例的跟踪 。
分析Java Stream操作#
Java 8 Streams有时可能难以阅读和调试,因为要了解程序如何达到某个输出,您可能需要插入其他断点,并分析流中的每个转换。
IntelliJ IDEA通过让您可视化Java Stream操作中的内容来提供解决方案
当调试器在Stream API调用链之前或之内停止时,单击“ 调试器”工具栏中的“ 跟踪当前流链”图标 。在评估了当前数据流之后,您可以看到每个转换中每个元素发生的情况,以及它在通过流中的所有步骤时其值如何变化:
单击“ 平面模式”按钮可在一个视图中一次查看所有操作:
此功能仅适用于项目文件。您不能使用Java Stream Debugger来调试库或反编译代码。
调试异步代码#
调试异步代码是一个挑战,因为执行在帧之间跳转并使得遵循代码变得更加困难。为了帮助您从代码中的特定点回顾,IntelliJ IDEA提供了捕获点。
一个拍摄点是在你的代码的地方,调试器捕获堆栈跟踪,当你到达的代码(插入点)的特定点供以后使用,并希望看到你如何到达那里。甲捕获点 是通过方法名(和包含类)和键表达式中指定。当调试器停止时,它开始匹配堆栈帧与 插入点,这是另一种方法和表达方式。如果找到匹配项,则调试器将计算表达式,如果该值具有某些相关的堆栈信息,则它将使用捕获的堆栈替换调用堆栈的其余部分。这有助于您了解相关捕获点发生的情况,以及您如何达到目前的要点。
默认情况下启用异步堆栈跟踪(设置/首选项|构建,执行,部署|调试器|异步堆栈跟踪)。最常见的捕获点是内置的,因此不需要配置。
要尝试异步堆栈跟踪,请调试以下示例:
import org.jetbrains.annotations.Async;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class AsyncSchedulerExample {
private static final BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
try {
while (true) {
process(queue.take());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
schedule(1);
schedule(2);
schedule(3);
}
private static void schedule(@Async.Schedule Integer i) throws InterruptedException {
System.out.println("Scheduling " + i);
queue.put(i);
}
private static void process(@Async.Execute Integer i) {
// Put a breakpoint here
System.out.println("Processing " + i);
}
}
使用异步注释#
如果需要未包含在默认配置中的捕获点,则可以使用可在代码中引用的注释。
向JetBrains Maven Java注释存储库添加依赖项以 获取工件,@Async.Schedule
并@Async.Execute
在代码中使用和注释。
@Async.Schedule
到达 带注释的点时,当前堆栈将保存在存储映射中。当@Async.Execute
到达带注释的点时 ,调试器会尝试在存储映射中查找相关堆栈。
你可以注释:
- 方法:
this
值用作键 - parameters:参数值用作键
定义自定义注释#
如果由于某种原因您不想将JetBrains Maven存储库添加为项目的依赖项,则可以定义自己的注释并使用它们而不是默认注释。
- 为捕获点和插入点创建自己的注释(可以使用 Async.java作为参考)。
- 在Settings / Preferences 对话框(Ctrl+Alt+S)中,转到 Build | 执行| 部署| 调试器| 异步堆栈跟踪并单击 配置注释。
- 在“ 异步批注配置”对话框中,单击以将自定义批注添加到“ 异步计划批注”和“ 异步执行批注”。
手动配置捕获点#
如果由于某种原因您无法使用注释,或者需要能够捕获局部变量,则可以手动配置捕获点。
- 在Settings / Preferences 对话框中(Ctrl+Alt+S)转到 Build,Execution,Deployment | 调试器| 异步堆栈跟踪。
- 单击以添加新捕获点,然后输入与捕获点和插入点相关的信息。
例如,javax.swing.SwingUtilities.invokeLater
使用doRun
键将捕获invokeLater
方法的所有调用 并将它们与Runnable
实例参数相关联。java.awt.event.InvocationEvent.dispatch
使用runnable
插入键将捕获的信息插入invokeLater
到Runnable
执行的位置。
- (可选)如果您还想捕获局部变量(基元和字符串值以及调用堆栈,请选择“ 捕获局部变量”选项。请注意,这可能会降低调试过程的速度,并且如果“检测代理”是启用。
您可以从以下存储库下载一些其他捕获设置:IntelliJ IDEA调试器捕获点
评估关键表达式可能会降低应用程序的速度,因此我们建议使用简单表达式
- 这个
- 方法参数名称(您可以使用
param_N
N是基于零的参数号) - 局部变量或字段名称
方法调用要慢得多,不建议使用。
查看远程JVM中的异步堆栈跟踪#
如果要调试远程进程(例如,在Docker容器中进行管理),您仍然可以使用JVM Instruing Agent显示异步堆栈跟踪,就像它是从IDE启动一样。
要远程使用代理,请执行以下操作:
- 将<IDEA安装文件夹> /lib/rt/debugger-agent.jar复制到远程计算机上的任何位置
- 添加
-javaagent:<path to debugger-agent.jar>
到远程JVM选项
内联值查看#
该内嵌值的功能简化了调试过程,因为它允许您查看的到对方使用您的源代码中使用的变量值,而无需切换到 变量窗格中的调试工具窗口。
如果启用此选项,则在启动调试会话并单步执行 该程序时,变量的值将显示在使用这些变量的行的末尾。
默认情况下启用内联值。要关闭它们,请执行以下操作之一:
- 在“ 调试”工具窗口 工具栏中,单击“ 设置”图标 ,然后从弹出菜单中取消选择“ 显示内联值”选项。
- 在Settings / Preferences 对话框(Ctrl+Alt+S)中,选择Build,Execution,Deployment | 调试器| 左侧的数据视图,取消选中显示内联值选项。
请注意,在调试期间更新变量值时,该变量的内联视图的颜色会发生变化。例如:
- 开始迭代:
- 迭代完成,值更新; 开始下一次迭代:
附加到流程#
“ 附加到进程”功能允许您调试在IntelliJ IDEA中开发的项目,但由于某种原因无法直接从IDE启动。
可以从操作系统或使用IntelliJ IDEA终端启动用于调试的过程。无论哪种方式,都应该使用以下启动参数在调试模式下启动它:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5009
附加到流程#
附加到本地进程:
- 从主菜单中,选择“运行”| 附加到流程或按Ctrl+Alt+F5。
- 从可用进程列表中,选择所需的进程。
通过键入其名称或PID的首字母来简化搜索。如果有多个调试器可用于所选进程,则可以在弹出菜单中选择它们。 - 继续进行调试,方法与通常在IntelliJ IDEA中进行调试(设置断点,单步执行, 暂停和恢复进程, 计算表达式等等) 请注意,如果您附加的进程未提供调试信息,则断点将不可用,并将在反汇编视图中执行步进。
- 完成后,分离进程:选择Run | 停止或者单击停止进程按钮中的调试工具窗口。
改变程序的执行流程#
返回上一个堆栈帧#
IntelliJ IDEA允许您回退到程序执行流程中的先前堆栈帧。这可能很有用,例如,如果您错误地走得太远,或者想要重新进入错过关键位置的功能。
- 单击Debugger工具窗口工具栏中的Drop Frame图标:
请注意,不会还原已对全局状态所做的更改,并且只会重置本地变量。
强制从当前方法返回#
您可以在到达return语句之前强制从当前方法返回,而不执行任何更多指令。
- 从“ 帧”视图中的当前方法的上下文菜单中 选择“ 强制返回”操作,或按: Ctrl+Shift+A
- 如果该方法返回一个值,则需要指定它。如果该方法具有try-finally块,系统将提示您选择是否要执行它们。
抛出异常#
IntelliJ IDEA允许您从程序中的某个位置抛出异常而无需修改代码。
- 从Frames视图中选定方法的上下文菜单中 选择 Throw Exception,并指定表达式:
重新加载修改的类#
有时,当您对代码进行微小更改时,您希望在不关闭进程的情况下立即查看它们在工作应用程序中的行为方式。该热插拔机制可以让你重新加载调试会话期间更改类,而无需重新启动整个应用程序。
重新编译修改后的类#
- 从主菜单中选择Build | 编译<class_name>。
如果要在编译后禁用已更改类的自动重新加载,请在“ 设置/首选项” 对话框中Ctrl+Alt+S选择“ 构建,执行,部署”。调试器| 左窗格中的HotSwap,并将编译后的重新加载类选项设置为从不。然后,如果要重新加载修改后的类,则需要选择“运行”| 重新编译后重新加载更改的类。
从库和SDK重新加载修改过的类#
IntelliJ IDEA还允许您在调试会话期间从项目所依赖的库或SDK重新加载修改的类。
- 在Settings / Preferences 对话框中(Ctrl+Alt+S)转到 Build,Execution,Deployment | 调试器| 左侧的HotSwap并确保未选中“ 重新加载类之前的 构建项目”选项。
- 从主菜单中选择Build | 编译<class_name>。
- 重新编译修改后的类后,从主菜单中选择Run | 重新加载更改的类。
由于Java VM的限制,HotSwap仅在方法体被更改时才可用。您可以使用支持Dynamic Code Evolution VM 的 DCEVM集成插件,无限制地支持在运行时重新加载类。