skynet debug_console控制台中debug指令使用
skynet debug_console控制台中debug指令使用
- debug指令源码分析
- debug指令使用方法
- 获取服务地址
- 具体使用示例
- 控制流命令
- 注意事项
debug指令源码分析
function COMMANDX.debug(cmd)local address = adjust_address(cmd[2]) -- 目标服务地址local agent = skynet.newservice "debug_agent" -- 创建调试代理local stoplocal term_co = coroutine.running()-- 命令转发函数local function forward_cmd()repeatskynet.call(agent, "lua", "ping") -- 检测代理是否存活local cmdline = socket.readline(cmd.fd, "\n")cmdline = cmdline and cmdline:gsub("(.*)\r$", "%1")if not cmdline thenskynet.send(agent, "lua", "cmd", "cont")breakendskynet.send(agent, "lua", "cmd", cmdline) -- 转发命令到调试代理until stop or cmdline == "cont"end-- 启动命令转发协程skynet.fork(function()pcall(forward_cmd)if not stop thenterm_co = nilelseskynet.wakeup(term_co)endend)-- 开始调试会话local ok, err = skynet.call(agent, "lua", "start", address, cmd.fd)stop = trueif term_co thenskynet.wait(term_co) -- 等待转发协程退出endif not ok thenerror(err)end
end
debug指令使用方法
debug <服务地址>
获取服务地址
首先需要知道要调试的服务的地址:
# 连接到debug console
nc 127.0.0.1 8000# 查看所有服务列表
list
具体使用示例
示例1:调试普通服务
# 连接到debug console
nc 127.0.0.1 8000# 查看服务列表,找到目标服务地址
list
# 输出示例:
# :0100000b snlua launcher
# :0100000c snlua cmaster
# :0100000d snlua cslave
# :0100000e snlua datacenterd
# :0100000f snlua service_mgr# 调试datacenterd服务
debug :0100000e
示例2:使用服务名调试
# 如果服务有注册名字,可以使用名字
debug .launcher
控制流命令
// 跳出当前debug
cont
注意事项
安全警告
- debug命令可以在目标服务中执行任意Lua代码
- 生产环境慎用,可能影响服务稳定性
- 调试会话会暂停服务的正常执行
使用限制
- 目标服务必须支持debug协议
- 某些服务可能有安全限制,拒绝调试
- 调试期间服务响应会变慢
在skynet的debug会话中,默认不支持多行输入。每次输入都是一行独立的Lua代码,不过可以使用分开写入多语句:
:0000005e>local faci = require "faci.module"; local module = faci.get_module("gm_mgr"); local dispatch = module.dispatch; return dispatch.shutdown_status()