文档 / IDE
调试
在同一个面板中调试 Java、Node.js、浏览器、Python、Go、.NET 和 PL/SQL,提供建议的配置,调试器只在你允许时才会安装。
Yuli 用每种语言的标准调试器进行调试,并把一切显示在同一个面板中:调用栈、变量、求值控制台和断点。缺少的组件只有在你授权后才会安装。
| 语言 | 调试器 | Yuli 如何启动它 |
|---|---|---|
| Java 和 JVM | 原生 JDWP 客户端 | 启动 JVM 或附加到 JVM |
| Node.js | Chrome DevTools Protocol(CDP),支持 source maps | node --inspect 或附加到进程 |
| 浏览器 | Chrome、Chromium 或 Edge 中的 CDP | 使用单独的配置文件,绝不使用你自己的 |
| Python | debugpy(DAP) | python -m debugpy.adapter,使用项目的虚拟环境 |
| Go | Delve(DAP) | dlv dap,或附加到正在运行的 dlv --headless |
| .NET | netcoredbg(DAP) | netcoredbg --interpreter=vscode |
| Oracle PL/SQL | Oracle 的 DBMS_DEBUG |
从数据库面板启动 |
你的第一次调试会话
调试配置
调试配置 对话框可以通过调试面板中的按钮打开,也可以从运行面板的菜单(调试配置…)打开。
- 类型: Java、Node.js、Python、Go、.NET 和浏览器。
- 模式: 启动(由 Yuli 启动程序)或 附加(连接到已在运行的程序)。
- 已保存: 你自己创建的配置。为此项目建议的配置: Yuli 在你的代码中找到的配置。
| 字段 | 用途 |
|---|---|
程序、模块(python -m)、主类 |
运行什么 |
| 参数、工作目录、环境变量 | 如何运行 |
| 解释器、编译选项 | 使用哪个 Python 或哪些 build flags |
| 仅我的代码、入口处暂停 | 在哪里暂停 |
| 主机、端口、进程 ID | 附加到什么 |
| URL、Web 根目录、浏览器 | 浏览器调试 |
Yuli 的建议
| 项目 | 建议 |
|---|---|
| Python | main.py、app.py 或 manage.py(后者带 runserver --noreload),以及“Python: attach 5678” |
| Go | 如果存在 go.mod,则为“Go: .” |
| .NET | 项目文件 |
| Node.js | package.json 中的 main |
| 浏览器 | 如果项目使用 vite、react-scripts、next、Angular、vue 或 svelte。URL 在 vite 下使用端口 5173,在 Angular 下使用 4200,其余情况使用 3000 |
配置保存在 debug-configs.json 中,该文件位于 Yuli 为每个项目准备的工作文件夹里,而不在你的仓库中。
附加到进程
在 附加 模式下,Yuli 会在你的电脑上查找可以调试的对象:以 --inspect 启动的 Node 进程、Python、Go 和 .NET 进程、启用 JDWP 的 JVM,以及开启了 DevTools 的浏览器标签页。如果某种类型一个都没有,它会告诉你,例如:“没有以 --inspect 监听的 Node 进程。”
Java
- 原生 JDWP 客户端,提供变量树、代码上方的内联值以及易读的值(对象显示为
Owner{id=3, …},日期显示为2026-10-15,集合显示其大小)。 - 条件断点、计数断点、logpoint 和异常断点。
- 热替换(
Ctrl+Alt+F10):用项目的构建工具重新编译,并在不重启会话的情况下重新定义已更改的类。
表达式求值器
它用于求值控制台、监视表达式、断点条件以及 logpoint 的消息。
| 支持 | 不支持 |
|---|---|
?: || && | ^ & == != < > <= >= instanceof << >> >>> + - * / % |
new |
一元运算符 + - ! ~ 以及类型转换 |
赋值、++ 和 -- |
成员访问、方法调用和索引 [i] |
Lambda |
方法调用会在你正在调试的 JVM 中执行真实代码。请避免调用会改变状态的方法。
断点属性
在 断点属性 中,你可以调整每个断点的行为:
- 条件: 一个 Java 表达式;仅当其为真时才暂停。
- 命中次数: 在第几次经过该行时暂停。
- 仅记录 加 消息: 向控制台写入内容而不暂停。
如果某个条件无法求值,调试器 不会悄悄忽略它:它会暂停一次并显示原因,例如“[条件]“total > limite”(第 42 行)无法求值:…”。
Node.js 与浏览器
- Source maps(v3): 你在
.ts、.tsx或原始代码中设置断点,Yuli 会把它映射到生成的代码上。暂停时,调用栈中显示的仍是你的文件。 - 附加: 可附加到任何以
--inspect监听的 Node 进程。 - 浏览器: Yuli 会用单独的配置文件(
--user-data-dir)和远程调试端口打开 Chrome、Chromium 或 Edge。你平时的配置文件,包括会话和扩展,都不会受到影响。 - 热替换不适用于带 source maps 的代码:请使用开发服务器的热重载。
Python、Go 与 .NET
这三者都使用 DAP 协议。Python 使用项目的虚拟环境(先找 VIRTUAL_ENV,再找 python3 或 python)。Go 可以启动 dlv dap,也可以附加到你已经在运行的 dlv --headless。在编辑器中,边栏的 ▶ 还可以调试 Python 的 if __name__ == "__main__":、Go 的 func main 和 func TestX,以及 C# 的 static void Main(。
安装调试器
如果缺少调试器,会出现 “缺少……的调试器” 提示,说明 Yuli 将要做什么,并提供 安装并调试 和 取消 按钮。
Yuli 会用 pip 把 debugpy 安装到项目的 Python 环境中(如果你使用系统 Python,则使用 --user):
pip install debugpyYuli 会用你的 Go 编译 Delve,并把它安装到 Yuli 管理的工具中(Delve 不发布二进制文件)。如果最新版 Delve 要求更新的 Go,Yuli 会使用与你的 Go 兼容的最新版本。
go install github.com/go-delve/delve/cmd/dlv@latest它安装在 <runtimes>/delve/bin 中(Yuli 的运行时文件夹;参见语言服务器与构建)。
Yuli 会从 github.com/Samsung/netcoredbg/releases/latest 下载 netcoredbg(MIT 许可证),并保存到 <runtimes>/netcoredbg。
提供 Windows x64、Linux x64 和 arm64 以及 macOS 版本(x64 版本,在 Apple Silicon 上通过 Rosetta 运行)。在其他平台上,Yuli 会提示你该调试器不可用。
启动会话绝不会自行安装任何东西。未经你允许,不会下载或执行任何内容;如果安装失败,日志会直接显示在同一个提示中。
PL/SQL
Yuli 使用 DBMS_DEBUG 调试 Oracle 的存储过程、函数和包。
- 账户需要
DEBUG CONNECT SESSION权限以及对该对象的DEBUG权限(或DEBUG ANY PROCEDURE)。 - Yuli 会用
COMPILE DEBUG重新编译该对象。 - 按键:
F5继续,F10下一行,F11步入,Shift+F11步出。
快捷键
| 操作 | 快捷键 |
|---|---|
| 调试上一个配置 | Shift+F9 |
| 继续 | F9 |
| 下一行(step over) | F8 |
| 步入,仅你的代码(step into) | F7 |
| 强制步入 | Alt+Shift+F7 |
| 跳出方法 | Shift+F8 |
| 重新加载已修改的类(热替换) | Ctrl+Alt+F10 |
借助 AI
当某个测试或步骤失败时,询问 AI 原因 会出现在调试面板、测试资源管理器以及 AI 更改的验证中。该按钮会准备好上下文(错误、调用栈、代码)并放进聊天中:它不会发送;问什么由你决定。