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 去找,比較麻煩。所以一般只用來執行一些模塊的接口。

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM