skynet自带了一个调式控制台服务,你需要在你的启动脚本里启动它.
skynet.newservice("debug_console",8000)
这里的示例是监听8000端口,你可以修改成别的端口.
出于安全考虑,调试控制台只能监听本地地址127.0.0.1,所以如果需要远程使用,需要先登录到本机,然后再连接
可以用telnet 或nc登录调试控制台.启动后会显示
Welcome to skynet console
表示连接成功.
注:由于skynet使用自己的IO库,所以很难把libreadline接入(不能再readline的hook中yield).如果你希望在控制台使用readline的history等特性,可以自己使用rlwrap.
这时,你可以输入调试指令,输入help可以列出目前支持的所有指令,这份文档可能落后于实际版本,所以应以help列出的指令为准.
命令的一般格式是命令地址,有些命令不带地址,会针对多有的服务.当输入地址时,可以使用:01000001这样的格式指代一个服务地址:由冒号开头的8位16进制数字,也可以省略前面两个数字的harbor id以及接下来的联系0,比如:01000001可以简写为1,所有活动的服务可以输入list列出
常用的针对所有lua服务的指令有:
list列出所有服务,以及启动服务的命令的参数.
gc强制让所有lua服务汇报自己占用的内存.(注:它只能获取lua服务的lua vm内存占用情况,如果需要C模块中的内存使用报告,请参考MemoryHook)
start列出所有lua服务的消息队列长度,以及被挂起的请求数量
service列出所有的唯一lua服务
注意,由于这些指令是挨个向每个服务发送消息并等待回应,所以当某个Lua服务过载时,可能需要等待很长时间才有返回.
针对单个lua服务的指令有:
exit address让一个lua服务退出.
kill address强制中止一个lua服务.
info address 让一个lua服务汇报自己的内部信息,参见Profile.
signal address sig 向服务发送一个信号,sig默认为0,当一个服务陷入死循环时,默认信号会打断正在执行的lua字节码,并抛出error显示调用栈.这是针对endless loop的log的有效调试方法.注:这里的信号并非系统信号.
task address 显示一个服务中所有被挂起的请求的调用栈.
debug address,针对一个lua服务启动内置的单步调试器.http://blog.codingnow.com/2015/02/skynet_debugger.html
logon/logoff address 记录一个服务所有的输入消息到文件,需要在Config里配置logpath.
inject address script 将script 名字对应的脚本插入到制定服务中运行(通常可用于热更新补丁)