• skynet debug console 使用


    预读

    环境测试搭建

    使用示例代码见 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 去找,比较麻烦。所以一般只用来执行一些模块的接口。

    参考文章

    作者:涵曦www.hanxi.cc
    出处:hanxi.cnblogs.com
    GitHub:github.com/hanxi
    Email:im.hanxi@gmail.com
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    《 Skynet 游戏服务器开发实战》

  • 相关阅读:
    js对象数组中的某属性值 拼接成字符串
    mongodb 简单的增删改查
    celery简单使用
    Redis简单操作
    三大认证源码分析
    认证、权限、频率、自定义签发token-多方式登录
    jwt认证
    视图家族
    day75作业
    day74作业
  • 原文地址:https://www.cnblogs.com/hanxi/p/14846365.html
Copyright © 2020-2023  润新知