ldb是Redis内置Lua调试器,仅支持通过EVAL/EVALSHA执行且含redis.breakpoint()的脚本调试,需redis-server启动时启用并配合redis-cli --ldb --ldb-sync-mode连接,调试过程同步阻塞、单步可控。

ldb 是什么,它能调试哪些 Redis Lua 场景?
ldb 是 Redis 内置的 Lua 调试器,仅在 Redis 服务器以 --ldb 或 --ldb-sync-mode 启动时可用。它不能远程调试任意 Lua 脚本,只适用于通过 EVAL 或 EVALSHA 执行、且脚本中显式调用 redis.breakpoint() 的场景。调试过程是同步阻塞的,客户端会挂起等待,直到调试结束。
- 必须在服务端启动时启用:运行
redis-server --ldb --port 6380(建议用非生产端口) - 客户端需用
redis-cli --ldb --ldb-sync-mode连接,否则无法进入调试会话 -
redis.breakpoint()是唯一断点入口,不加这行,ldb完全不会触发
调试时卡住没反应?检查这三件事
常见现象是执行 EVAL 后 CLI 无输出、光标静止,实际是调试器在等你输入命令,但你可能没连对模式:
- 确保
redis-cli命令带齐两个参数:redis-cli --ldb --ldb-sync-mode(缺一不可;--ldb-sync-mode让调试与脚本执行严格串行,避免超时退出) - 脚本里必须有且仅有一处
redis.breakpoint(),放在你想停住的位置(比如计算前、条件分支内) - 不要从另一个终端用普通
redis-cli发送命令——ldb会独占当前连接,其他命令会被阻塞或报错ERR Client is in debugging mode
常用 ldb 命令和变量查看技巧
进入调试后,直接输入命令(无需前缀),按回车执行:
-
n:单步执行下一行(跳过函数内部) -
s:步入函数(进入redis.call()或自定义函数体) -
c:继续运行到下一个redis.breakpoint()或脚本结束 -
p <var_name></var_name>:打印变量值,例如p key、p res;注意不能用p table直接打表,会报错,得用p json.encode(table)(需提前redis.call('eval', 'return json.encode', 0)加载 json 库,或改用table.foreach手动遍历) -
b:列出所有断点(目前只支持一个,即redis.breakpoint()所在行)
为什么本地调试通了,线上却进不去 ldb?
因为生产 Redis 几乎从不启用 --ldb:它强制同步执行、阻塞所有请求、无认证保护、且重启后失效。真正线上排查应换思路:
- 把关键中间结果用
redis.call('set', 'debug:xxx', tostring(val))临时落库,再用普通GET查看 - 用
redis.log(redis.LOG_WARNING, 'val='..tostring(val))输出到 Redis 日志(需配置loglevel warning及以上) - 在测试环境复现时,务必使用和线上一致的 Redis 版本(
ldb行为在 6.0 和 7.0 间有细微差异,比如变量作用域提示)
调试器本身很轻量,但依赖启动态和交互式终端,离了那个“按下回车才走下一步”的节奏,就不是调试,而是猜谜。


















