languages/<id>.toml 的 [debugger] 表)里指定调试适配器,调试运行配置时 IDE 会启动对应的适配器。命令和快捷键沿用 IntelliJ IDEA 的习惯,在 IDEA 里熟悉的操作大多可以直接用。
启动调试会话
只要运行配置带有调试适配器,就可以调试:- 点击
main函数或测试旁边的边栏运行图标,选择 调试。 - 在工具栏的运行小部件里选好配置,点击调试按钮。
- 运行 › 调试 调试当前选中的配置;运行 › 调试… 先选择配置;运行 › 调试上下文配置 调试光标处的程序或测试。
⌘5 / Alt+5)每个会话一个标签页,包含两个视图:
- 线程和变量:线程列表、选中线程的栈帧,以及选中帧的变量。库代码的帧默认折叠,用 显示所有帧 展开。
- Console:程序输出,以及一个输入行,可在选中帧里计算表达式。用 浏览控制台历史(
⌘⌥E/Ctrl+Alt+E)翻看之前输入过的表达式。
这两个视图的标签名目前还没有翻译,中文界面下也显示英文。
支持的调试器
C 和 C++ 的配置也可以改用 GDB 14 及以上版本(
gdb -i dap):在 调试适配器 字段里选 GDB(C、C++)。IDE 不会自动安装 GDB,需要自己装(apt install gdb、dnf install gdb、brew install gdb)。
一键安装在 设置 › 语言和框架 › 语言服务器 里,调试器和语言服务器列在一起,可以在这里安装、更新,或者指定自己安装的版本。
断点
点击行号即可添加或移除行断点,也可以用 切换行断点(⌘F8 / Ctrl+F8)。在边栏上:
⌥点击(Alt点击)添加临时断点,命中一次后自动移除。⇧点击(Shift点击)添加不挂起程序的日志断点,并打开它的属性。- 中键点击已有断点,启用或禁用它。
- 右键点击断点,编辑它的属性。
断点属性
断点对话框里也有这些选项,另外还有 命中后移除,勾选后断点变为临时断点。这些选项能否生效取决于适配器:条件、命中次数和日志消息都是 DAP 功能,大多数适配器支持,但不是全部。
其他断点类型
方法断点和字段监视点需要适配器支持 DAP 的函数断点和数据断点。debugpy、java-debug、js-debug 和 CodeLLDB 的异常过滤器会直接列出;其他适配器的过滤器要用它调试过一次才会出现。
断点对话框
查看断点…(⌘⇧F8 / Ctrl+Shift+F8)列出项目中的所有断点。可以在这里启用、编辑、删除断点和跳转到断点位置,打开 静音断点(暂时跳过所有断点而不删除),以及设置异常过滤器。移除所有断点 会清空列表。
断点按项目保存,重启后仍然保留。适配器无法设置的断点会标为未验证。
单步执行
下面的命令在 运行 菜单和调试工具窗口的工具栏上。- 当前行有多个调用时,智能步入 可以选择要进入哪一个。
- 带“强制”的命令会忽略途中的断点。
- 程序挂起时,行上还会出现一个内嵌的“运行到光标处”按钮(调试器设置中的 显示内嵌的“运行到光标处”按钮)。
- 重置帧 回到选中帧所在方法的开头,需要适配器支持。
查看和修改值
程序挂起时:- 变量 视图显示选中帧的变量。右键点击某个值,可以 设置值…(
F2)、复制值、复制名称、跳转到源代码(F4)和 添加到监视。 - 监视表达式显示在变量视图顶部,每次停下或切换帧时重新计算。用 添加到监视 添加,用 移除监视 删除。
- 在编辑器里悬停变量会显示它的值。
⌥点击(Alt点击)或 快速计算表达式(⌘⌥F8/Ctrl+Alt+F8)计算鼠标下的表达式或选中的内容。 - 局部变量的值会内联显示在使用它们的行尾。
- 计算表达式…(
⌥F8/Alt+F8)打开对话框,在选中帧里计算任意表达式,带历史记录,也能把表达式加入监视。
附加到正在运行的进程
运行 › 附加到进程…(⌥⇧F5 / Ctrl+Alt+F5)列出调试器可以附加的本用户进程,按调试器分组:
输入文字可按名称、PID 或命令行过滤。
远程调试配置
要调试在别处(另一台机器、容器里)启动的进程,在 运行 › 编辑配置… 里添加下面的配置。它们只能调试,不会启动进程。
每个表单都有 主机 和 端口 字段,并给出远程端的启动命令。远程代码所在目录与本地不同时,用 本地根目录 和 远程根目录 做路径映射。
各语言的特有功能
- Java HotSwap:运行 › 调试操作 › 重新加载已更改的类 编译改动,并把变化的类重新加载到正在运行的 Java 调试会话中。已经在执行的帧要等返回后才会用上新代码。保存后 JDT LS 自动完成构建时,IDE 也会提示是否重新加载。
- Maven 和 Gradle:调试 Maven 或 Gradle 配置时,IDE 会让 JVM 带上 JDWP agent 启动,再用 java-debug 附加上去。
- Dart / Flutter:Dart 会话运行时可以用 热重载 和 热重启。
- PHP:如果 PHP 解释器没有加载 Xdebug,断点会被跳过;会话启动时 IDE 会提示。
- Python:设置 › 构建、执行、部署 › Python 调试器 中有 调试时自动附加到子进程 和 兼容 Gevent。
设置
设置 › 构建、执行、部署 › 调试器:- 命中断点时显示调试窗口、在断点处聚焦应用程序、进程终止时隐藏调试窗口。
- 断点:允许在任意文件中设置断点、显示内嵌的“运行到光标处”按钮。
- 数据视图:内联显示值、按字母顺序对值排序、鼠标悬停时显示值工具提示、选中代码时显示值提示、值工具提示延迟(毫秒)。
- 单步执行:不要步入库脚本(Python 只调试自己的代码;JavaScript 跳过
node_modules和 Node.js 内部代码)。
快捷键
以上都是默认键位,可以在键位映射设置中修改。