预读

环境测试搭建

使用示例代码见 examples/main.lua 。

先开启进程:

$ ./skynet examples/config

从 examples/main.lua 中可以看到 debug_console 开启的端口是 8000 :

skynet.newservice("debug_console",8000)

现在我们使用 nc 或者 telnet 命令连接这个端口就能进入调试控制台。

$ rlwrap nc 127.0.0.1 8000
Welcome to skynet console

这里推荐使用 rlwarp 命令包裹一下 nc 命令,这样可以实现输入命令时使用 ctrl + r 搜索历史输入的命令,使用 ctrl + p 和 ctrl + n 可以上下查看历史命令。

当看到显示了 Welcome to skynet console 时,说明已经成功连上控制台了。

查看服务列表

输入 list 命令,可以看到正在运行中的服务列表。

Welcome to skynet console
list
:01000004 snlua cmaster
:01000005 snlua cslave
:01000007 snlua datacenterd
:01000008 snlua service_mgr
:0100000a snlua protoloader
:0100000b snlua console
:0100000c snlua debug_console 8000
:0100000d snlua simpledb
:0100000e snlua watchdog
:0100000f snlua gate
<CMD OK>

如上所示,:01000004 第一列冒号开头的是服务的地址,snlua cmaster 是服务启动参数。比如根据 :0100000c snlua debug_console 8000 可以查到 debug_console 服务的地址为 :0100000c 。

查看帮助

help 命令很有用的,有时候忘记命令的格式了,输入 help 可以临时看看。

help
call call address ...
clearcache clear lua code cache
cmem Show C memory info
debug debug address : debug a lua service
dumpheap dumpheap : dump heap profilling
exit exit address : kill a lua service
gc gc : force every lua service do garbage collect
help This help message
info info address : get service infomation
inject inject address luascript.lua
jmem Show jemalloc mem stats
kill kill address : kill service
killtask killtask address threadname : threadname listed by task
list List all the service
log launch a new lua service with log
logoff logoff address
logon logon address
mem mem : show memory status
netstat netstat : show netstat
ping ping address
profactive profactive [on|off] : active/deactive jemalloc heap profilling
service List unique service
signal signal address sig
snax lanuch a new snax service
start lanuch a new lua service
stat Dump all stats
task task address : show service task detail
trace trace address [proto] [on|off]
uniqtask task address : show service unique task detail

call 命令的使用

call 命令是对 skynet.call 接口的封装,执行效果和 skynet.call 效果一样,一般用于手动执行服务里的某个函数,且该函数是 command 里的接口。

比如 simpledb 服务,代码位置: examples/simpledb.lua ,定义了 GET 和 SET 接口:

function command.GET(key)
return db[key]
end function command.SET(key, value)
local last = db[key]
db[key] = value
return last
end

接下来我们在 debug console 里执行 call 指令查看效果:

call :0100000d "set", "A", 100
n 1
<CMD OK>
call :0100000d "get", "A"
1 100
n 1
<CMD OK>

首先是执行的 set 接口,命令格式为 call 服务地址 "接口名", 参数1, 参数2 。其中服务地址就是 list 命令显示出来的地址,接口名需要带引号,参数如果是字符串的时候,也需要有引号。

然后执行的是 get 接口,返回的数据会输出到终端。

可能已经发现了为什么定义的接口名是大写的,我们使用的时候却可以小写?这是因为 simpledb 对接口名做了处理,忽略大小写了。一般服务都没有处理这个的,所以需要注意保持相同的接口名。

skynet.start(function()
skynet.dispatch("lua", function(session, address, cmd, ...)
cmd = cmd:upper()
if cmd == "PING" then
...
end
local f = command[cmd]
if f then
...

debug 命令

debug 命令就不多解释了,这篇 《在线调试 Lua 代码》 写很详细了,也给出了演示示例。

inject 命令

前面看到 call 命令可以执行已经有实现好的外部接口,可是如何执行不是外部接口的函数呢?这就可以用 inject 来执行没有提供外部接口的函数了。

新建文件 testinject.lua ,写入下面代码:

local skynet = require "skynet"
skynet.error("I'm in inject")

然后在 debug console 里执行 inject :0100000d ./testinject.lua ,如下:

inject :0100000d ./testinject.lua

<CMD OK>

这时, skynet 进程那边会输出下面的日志:

[:0100000d] I'm in inject

这里只是测试了 skynet.error 接口,想执行任意接口都行的。 local 函数不是很方便执行的,需要根据 upvalue 去找,比较麻烦。所以一般只用来执行一些模块的接口。

参考文章

skynet debug console 使用的更多相关文章

  1. VS Code 调试 Golang 出现 Failed to continue: Check the debug console for details

    VS Code断点调试Golang时候,弹出提示:Failed to continue: Check the debug console for details 点击Open launch.json, ...

  2. [文章存档]Kudu 的 Debug Console 窗口如何查看更多文件

    链接:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-h ...

  3. VS Code调试Golang提示Failed to continue:Check the debug console for details.

    解决方法: 打开调试面板  VSCode->查看->调试 添加调试目标 在"没有调试"的下拉框中点击"添加配置.."添加目标调试配置 在" ...

  4. debug console不见了

    点击左侧这个标志.

  5. skynet inject address file.lua

    inject d test/inject_fuck.lua -- d 是服务的 handle 拿 simpledb.lua 举例,修改如下 local skynet = require "s ...

  6. Skynet服务器框架(十) CentOS 防火墙设置

    引言: 今天修改了 skynet 服务器的 IP 地址(即 config 文件中的 address 和 master 两项参数,IP 与当前及其的保持一致,端口号为 2017),然后使用一个简单的客户 ...

  7. console的高级使用

    1.console.table()用来表格化展示数据. var people = { zqz: { name: 'zhaoqize', age: 'guess?' }, wdx: { name: 'w ...

  8. How to debug .NET Core RC2 app with Visual Studio Code on Windows?

    Simone Chiaretta (http://codeclimber.net.nz/archive/2016/05/20/How-to-debug-NET-Core-RC2-app-with-Vi ...

  9. MySQL 编译安装并且开启DEBUG模式

    因为想分析下mysql中一些操作的内部执行过程,单纯的看源码太枯燥了,所以决定结合mysql的执行过程来分析,mysql作为一款成熟的数据库软件,在设计的时候就考虑到了调试的问题,只是想开启调试模式的 ...

随机推荐

  1. Day01_08_变量(Variable)

    变量 什么是变量? *变量本质上来说是内存上的一块空间,这块空间有数据类型,有名字,有字面值(数据).变量是内存中存储数据最基本的单元 * 变量要求变量中存储的具体数据必须和变量的数据类型一致,必须先 ...

  2. Day03_16_递归

    Java递归 递归包含两个部分 递归头: 标明了什么时候结束递归调用,如果没有递归头,程序将陷入死循环. 递归体: 标明了什么时候需要继续调用自身. 实例 import java.util.Scann ...

  3. Jenkins 项目类型及配置项

    0. 简介 1. Freestyle project 1)General 2)源码管理 3)构建触发器 4)构建环境 5)构建 6)构建后操作 2. Maven 项目 1)所有配置项 2)Build ...

  4. mongodb数据修复宝典

    mongodb数据修复宝典 1. 版本信息 mongodb版本: 3.6.14 2.mongodb日志内容: 2019-10-04T10:41:38.558+0000 E STORAGE [inita ...

  5. 基于MATLAB的手写公式识别(5)

    基于MATLAB的手写公式识别 总结一下昨天一天的工作成果: 获得了大致的识别过程. 一个图像从生肉到可以被处理需要经过预处理(灰质化.增加对比度.中值过滤.膨胀或腐蚀.闭环运算). 掌握了相关函数的 ...

  6. 1148 Werewolf - Simple Version

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  7. 共享内存多进程key value操作

    这个方法的优势是多进程,劣势也很明显,只允许操作key为uint32 value为uint32的数据.   https://www.cnblogs.com/dearplain/p/11578588.h ...

  8. Standalone模式下,通过Systemd管理Flink1.11.1的启停及异常退出

    Flink以Standalone模式运行时,可能会发生jobmanager(以下简称jm)或taskmanager(以下简称tm)异常退出的情况,我们可以使用Linux自带的Systemd方式管理jm ...

  9. ZOJ 3781 最短路(想法好题目)

    题意:       给你一个n*m的矩阵,上面只有两种字符,X或者O,每次可以同时改变相同颜色的一个连通块,上下左右连通才算连通,用最小的步数把这个图弄成全是X或者全是O,题意要是没看懂看下面的样例. ...

  10. hdu2371 矩阵乘法(求序列位置改变m次后的序列)

    题意:       给你一个字符串,然后让你执行m次操作,每次操作把当前的字符串映射到他给你的位置序列的位置,比如给的是 3 1 2,第一步就是把原来的3的位置的字母变到1的位置,1的变到2的位置,2 ...