预读

环境测试搭建

使用示例代码见 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 + pctrl + 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 ,定义了 GETSET 接口:

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. 华为应用市场AppGallery Connect正式推出全新LOGO

    华为应用市场AppGallery Connect(简称AGC)正式推出全新Logo,新Logo的设计灵感源于编码中的符号<>,两个括号紧密联结成一个正方形,寓意华为应用市场AGC与开发者深 ...

  2. Typora+PicGo+阿里云写博客笔记

    Typora+PicGo+阿里云写博客笔记 选择这三个工具的理由 我一直有在使用typora使用mardown写作,毕竟typora很香,可以实时预览,非常丝滑. 配合上PicGo这个图床工具简直绝了 ...

  3. Vue method与computed的区别

    为了说明method与computed的区别,在此我想先来看看computed属性在vue官网中的说法: 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算.在模板中放入太多的逻辑会让模板过重 ...

  4. 【swagger】 swagger-ui的升级版swagger-bootstrap-ui

    swagger-bootstrap-ui是基于swagger-ui做了一些优化拓展: swagger-ui的界面: swagger-bootstrap-ui界面: 相比于原生的swagger-ui , ...

  5. 【Java注解】@PostConstruct 注解相关

    不多逼逼,直接看注解上面的文档, @PostConsturct PostConstruct注释用于需要执行的方法在依赖注入完成后执行任何初始化.这个方法必须在类投入服务之前调用. 这个所有支持依赖关系 ...

  6. Python模块化编程

    目录 模块化 自定义模块 模块的内置属性 导入模块 安装第三方模块 查看模块的属性和方法 模块化 在Python中,一个.py文件就称之为一个模块(Module),为了避免模块名冲突,Python又引 ...

  7. Windows核心编程 第四章 进程(上)

    第4章 进 程     本章介绍系统如何管理所有正在运行的应用程序.首先讲述什么是进程,以及系统如何创建进程内核对象,以便管理每个进程.然后将说明如何使用相关的内核对象来对进程进行操作.接着,要介绍进 ...

  8. XCTF-web_python_template_injection

    web_python_template_injection 这里涉及到flask的ssti漏洞(服务端模板注入). 简单点说就是,在使用flask/jinja2的模板渲染函数render_templa ...

  9. 迪杰斯特拉(Dijkstra) 最短路算法

    直接看B站视频吧: https://www.bilibili.com/video/BV1QK411V7V4/

  10. Asp.NetCore Web开发之跨域问题

    在前后端分离的web开发中,解决跨域问题是不可避免的,为什么会出现跨域问题呢,这主要是因为web中的"同源策略",浏览器出于安全原因,不让用户随便访问不同于当前站点的资源,也就是说 ...