Kong 如何在 IDE 中用 EmmyLua 打断点调试 Lua 代码
【免费下载链接】kong🦍 The API and AI Gateway项目地址: https://gitcode.com/GitHub_Trending/ko/kong
在开发 Kong 插件或阅读 Kong 源码时,光靠日志很难看清请求上下文里的变量。DEVELOPER.md 给出的方案是用 EmmyLua 调试器在 IntelliJ IDEA 或 VSCode 中直接打断点:启动 Kong 时通过KONG_EMMY_DEBUGGER环境变量加载一个 C++ 调试库,IDE 侧由 EmmyLua 插件连接该库,之后就能在 Lua 代码中设置断点、命中后查看变量。该集成在 changelog/3.7.0/kong/feat-emmy-debugger.yml 中被标记为 tech preview(技术预览),Kong Inc. 不为其提供官方支持,属于纯粹的开发期便利功能,Kong 官方明确不对使用该集成产生的后果负责,相关问题应反馈给 EmmyLua 项目。
一、安装 IDE 与 EmmyLua 插件
两条路径任选其一,后续步骤通用。
IntelliJ IDEA 路线
- 从 JetBrains 官网下载并安装 IntelliJ IDEA。注意 IntelliJ 是商业软件,试用期结束后需要付费许可证。
- 进入
Settings→Plugins→Marketplace,搜索EmmyLua并安装该插件。
VSCode 路线
- 从 Microsoft 官网下载并安装 VSCode。
- 进入
Settings→Extensions,搜索EmmyLua并安装插件,发布者(publisher)必须是Tangzx,搜索结果中有同名插件时以此区分。
EmmyLua 本身是 IntelliJ IDEA 和 VSCode 的 Lua 语言支持插件,自带调试器支持,这是能够打断点的前提。
二、下载 EmmyLua 调试服务端
IDE 插件不能直接连到 Kong 内部的 Lua 代码,中间需要 EmmyLuaDebugger——一个运行在与 Kong 同一台机器上的独立 C++ 程序,负责在 IDE 调试器和 Kong 中运行的 Lua 代码之间做中介。
从 EmmyLuaDebugger 项目的 GitHub Releases 页面下载 release 包。ZIP 文件里只有一个共享库文件:
- Linux:
emmy_core.so - macOS:
emmy_core.dylib
把这个文件放到你方便的目录,并记住它的绝对路径——启动 Kong 时要用。
一个 Linux 环境的限制需要注意:GitHub 上发布的预编译二进制定位的是比较新的 GLIBC。如果你的 Linux 发行版较老,可能需要按 EmmyLuaDebugger 源码 说明自行编译,而不是直接用 release 包里的库。
三、带调试器启动 Kong
启用调试器的关键动作只有一个:启动 Kong 前把KONG_EMMY_DEBUGGER设置为调试共享库的绝对路径。同时建议只启动 1 个 worker 进程,因为多 worker 调试需要额外处理(原因见第六节的KONG_EMMY_DEBUGGER_MULTI_WORKER说明)。完整命令:
KONG_EMMY_DEBUGGER=/path/to/emmy_core.so KONG_NGINX_WORKER_PROCESSES=1 kong start其中/path/to/emmy_core.so需要替换为你在第二节放置库文件的绝对路径,例如你放在/opt/emmy/emmy_core.so,命令就写成KONG_EMMY_DEBUGGER=/opt/emmy/emmy_core.so ...。
Kong 在 init_worker 阶段调用该集成(见 kong/init.lua 中的Kong.init_worker),加载逻辑在 kong/tools/emmy_debugger.lua。启动日志中如果看到下面的 NOTICE(源代码中的日志文本,路径部分随实际环境变化):
loading EmmyLua debugger /path/to/emmy_core.so EmmyLua debugger loaded, listening on port 9966说明库已加载、调试端口已监听,可以进入 IDE 操作。如果没加载成功,日志里会给出对应的错误提示,代码中实际会校验四种情况(见 kong/tools/emmy_debugger.lua):
- 路径不是绝对路径:
KONG_EMMY_DEBUGGER (...) must be an absolute path; - 文件不存在:
KONG_EMMY_DEBUGGER (...) file not found; - 扩展名不是
.so(Linux)或.dylib(macOS):must be a .so (Linux) or .dylib (macOS) file; - 当前不是第一个 worker 且未开启多 worker 调试:
KONG_EMMY_DEBUGGER is only supported in the first worker process, suggest setting KONG_NGINX_WORKER_PROCESSES to 1。
四、在 IDE 中创建调试配置
IntelliJ IDEA:进入Run→Edit Configurations,点击+新建配置,类型选择Emmy Debugger(NEW),起一个有辨识度的名字,例如 "Kong Gateway Debug",点OK保存。
VSCode:进入Run→Add Configuration,选择EmmyLua New Debugger,同样命名为 "Kong Gateway Debug",保存launch.json。
五、打断点并验证命中
在 IntelliJ 中点击Run→Debug,在 VSCode 中点击Run→Start Debugging,选择刚创建的配置。连接建立后,IDE 顶部的 restart 和 stop 按钮会分别变为实心的绿色和红色——这是文档给出的连接成功标志。
文档建议的第一个验证断点:在runloop/handler.lua中定义的 access 处理函数里打断点(源码位于 kong/runloop/handler.lua,文档原文称其为"全局的 access 函数"),然后向 Gateway 发送一个代理请求。调试器应当停在断点上,此时可以查看请求上下文(request context)里的变量。
六、用环境变量控制调试行为
以下环境变量控制 EmmyLua 调试集成的行为(来自 DEVELOPER.md "Debugging environment variables" 一节):
| 变量 | 用途 |
|---|---|
KONG_EMMY_DEBUGGER | 调试共享库的路径,必须是绝对路径 |
KONG_EMMY_DEBUGGER_HOST | 调试器监听的 IP 地址,默认localhost |
KONG_EMMY_DEBUGGER_PORT | 调试器监听的端口,默认9966 |
KONG_EMMY_DEBUGGER_WAIT | 设置后 Kong 会先等待调试器连接再继续启动 |
KONG_EMMY_DEBUGGER_SOURCE_PATH | 调试器解析源码位置用的源码路径,默认是当前工作目录 |
KONG_EMMY_DEBUGGER_MULTI_WORKER | 设置后每个 worker 进程各启动一个调试器,端口从KONG_EMMY_DEBUGGER_PORT起递增;默认只为 0 号 worker 启动一个调试器 |
例如想让调试器监听127.0.0.1的19966端口,可以在启动命令中追加这两个变量:
KONG_EMMY_DEBUGGER=/path/to/emmy_core.so \ KONG_EMMY_DEBUGGER_HOST=127.0.0.1 \ KONG_EMMY_DEBUGGER_PORT=19966 \ KONG_NGINX_WORKER_PROCESSES=1 kong startKONG_EMMY_DEBUGGER_WAIT适合"先启动 Kong,再打开 IDE 连调试"的顺序:启动后 Kong 停在"等待 IDE 连接"的位置,日志会打印waiting for IDE to connect,IDE 连上后再继续,避免请求先于连接到来。
七、调试 busted 测试(可选分支)
如果要调试的不是运行中的 Gateway,而是 busted 测试用例,用BUSTED_EMMY_DEBUGGER环境变量代替KONG_EMMY_DEBUGGER,值同样是调试共享库的路径。注意文档明确说明:启用调试后,busted 启动时始终会等待 IDE 连接,也就是说 IDE 侧必须先建立调试会话,测试才会继续跑。KONG_前缀的其余变量也有对应的BUSTED_前缀版本(如BUSTED_EMMY_DEBUGGER_HOST、BUSTED_EMMY_DEBUGGER_PORT)。
限制与注意事项
- 该功能是 tech preview,Kong Inc. 目前不提供官方支持(见 changelog/3.7.0/kong/feat-emmy-debugger.yml),加载时 Kong 也会向日志打印一条 WARN,说明此集成仅是开发便利功能,Kong 不背书其使用。
- 老版本 Linux 的 GLIBC 可能与 release 库不兼容,需要自行编译 EmmyLuaDebugger。
- 不开启
KONG_EMMY_DEBUGGER_MULTI_WORKER时只有第一个 worker 进程支持调试,所以调试场景建议把KONG_NGINX_WORKER_PROCESSES设为 1,这也是第三节命令的默认写法。 KONG_EMMY_DEBUGGER必须是绝对路径且文件存在,扩展名必须为.so或.dylib,否则调试器不加载,且日志会按上面列出的错误提示给出原因。
【免费下载链接】kong🦍 The API and AI Gateway项目地址: https://gitcode.com/GitHub_Trending/ko/kong
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考