diff --git a/lualib/skynet.lua b/lualib/skynet.lua index a49f0813..3f2749b6 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -8,6 +8,7 @@ local pcall = pcall local table = table local tremove = table.remove local tinsert = table.insert +local traceback = debug.traceback local profile = require "skynet.profile" @@ -773,7 +774,7 @@ function skynet.task(ret) local tt = type(ret) if tt == "table" then for session,co in pairs(session_id_coroutine) do - ret[session] = debug.traceback(co) + ret[session] = traceback(co) end return elseif tt == "number" then @@ -793,6 +794,30 @@ function skynet.task(ret) end end +function skynet.uniqtask() + local stacks = {} + for session, co in pairs(session_id_coroutine) do + local stack = traceback(co) + local info = stacks[stack] or {count = 0, sessions = {}} + info.count = info.count + 1 + if info.count < 10 then + info.sessions[#info.sessions+1] = session + end + stacks[stack] = info + end + local ret = {} + for stack, info in pairs(stacks) do + local count = info.count + local sessions = table.concat(info.sessions, ",") + if count > 10 then + sessions = sessions .. "..." + end + local head_line = string.format("%d\tsessions:[%s]\n", count, sessions) + ret[head_line] = stack + end + return ret +end + function skynet.term(service) return _error_dispatch(0, service) end diff --git a/lualib/skynet/debug.lua b/lualib/skynet/debug.lua index e2027950..78fd1a16 100644 --- a/lualib/skynet/debug.lua +++ b/lualib/skynet/debug.lua @@ -42,6 +42,10 @@ local function init(skynet, export) end end + function dbgcmd.UNIQTASK() + skynet.ret(skynet.pack(skynet.uniqtask())) + end + function dbgcmd.INFO(...) if internal_info_func then skynet.ret(skynet.pack(internal_info_func(...))) diff --git a/service/debug_console.lua b/service/debug_console.lua index 2ed44f79..07572bbb 100644 --- a/service/debug_console.lua +++ b/service/debug_console.lua @@ -148,6 +148,7 @@ function COMMAND.help() clearcache = "clear lua code cache", service = "List unique service", task = "task address : show service task detail", + uniqtask = "task address : show service unique task detail", inject = "inject address luascript.lua", logon = "logon address", logoff = "logoff address", @@ -262,6 +263,11 @@ function COMMAND.task(address) return skynet.call(address,"debug","TASK") end +function COMMAND.uniqtask(address) + address = adjust_address(address) + return skynet.call(address,"debug","UNIQTASK") +end + function COMMAND.info(address, ...) address = adjust_address(address) return skynet.call(address,"debug","INFO", ...)