本文记录 Lua 5.3 Debug 能力的迁移范围。Debug 能力分为内部调试元信息、公开 debug 标准库、hook 事件和 traceback 生成四部分。
- 支持 Lua 5.3
debug标准库主要 API。 - 支持 call、return、line、count hook。
- 支持 traceback、当前栈帧、局部变量、upvalue 和 registry 访问。
- 支持 Go 嵌入 API 从错误中读取 traceback。
- 保持 Debug 逻辑不泄露
runtime可变内部结构。
ldebug.c:栈帧查询、traceback、局部变量和 upvalue 元信息。ldblib.c:debug标准库导出函数。lstate.c:CallInfo、栈帧链和 hook 状态。lfunc.c:closure 与 upvalue 访问。lobject.c:值展示与错误对象。
type HookEvent uint8
const (
HookCall HookEvent = iota
HookReturn
HookLine
HookCount
)
type FrameInfo struct {
Name string
Source string
CurrentLine int
What string
}
type Hook func(context.Context, *FrameInfo) error内部 runtime 保存更完整的帧结构;公开 API 只返回快照,避免宿主直接修改 VM 调用栈。
- call 事件在 Lua 函数和 Go 函数进入时触发。
- return 事件在函数正常返回和错误展开前触发。
- line 事件按 Proto line info 变化触发。
- count 事件按指令计数触发。
- hook 内错误必须转换为 Lua runtime error,并参与 traceback。
- hook 不能破坏当前栈帧寄存器窗口。
traceback 需要包含:
- 错误对象展示。
- chunk 名称。
- 当前行号。
- 函数名或可推断调用点。
- Lua 帧和 Go 回调帧。
- 尾调用压缩标记。
首版可以不逐字符匹配官方 Lua,但必须稳定、可测试,并保留足够上下文。
首批迁移目标:
debug.tracebackdebug.getinfodebug.getlocaldebug.setlocaldebug.getupvaluedebug.setupvaluedebug.upvalueiddebug.upvaluejoindebug.sethookdebug.gethookdebug.getregistrydebug.getmetatabledebug.setmetatable
暂不支持项必须返回明确错误,不允许静默返回错误数据。
- 使用手写 Proto 验证 line info 和 local var info。
- 使用嵌套 Lua 调用验证 traceback 帧顺序。
- 使用 Lua 调 Go、Go 回调 Lua 验证混合栈。
- 使用 hook 计数验证 VM 检查点。
- 使用错误 hook 验证错误传播边界。
runtime/dap 可由嵌入方复用,CLI 通过 --glua-dap-listen=host:port 显式启用。它支持断点、继续执行、调用栈快照和三类单步:stepIn 在下一条不同源码行暂停,允许进入被调函数;next 只在当前或更浅调用深度的下一条不同源码行暂停;stepOut 在离开当前调用深度后暂停。
DAP threads 会显示主线程与当前 State 已创建的 Lua coroutine,并在断点事件中携带实际线程 ID。evaluate 支持暂停态的 Locals、Upvalues、Globals 及点号 table 路径,例如 config.timeout;它不会编译或执行任意 Lua 表达式,因此 Hover、Watch 和 Debug Console 不会产生副作用。
变量面板当前提供当前帧的 Locals、Upvalues、运行时 Globals、table 展开与变量写入。Lua closure 存在共享 upvalue cell 时,编辑 Upvalue 会写回该 cell 并影响共享它的 closure;普通命令行执行不会启动 DAP listener。