debug.lua 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. local table = table
  2. local extern_dbgcmd = {}
  3. local function init(skynet, export)
  4. local internal_info_func
  5. function skynet.info_func(func)
  6. internal_info_func = func
  7. end
  8. local dbgcmd
  9. local function init_dbgcmd()
  10. dbgcmd = {}
  11. function dbgcmd.MEM()
  12. local kb, bytes = collectgarbage "count"
  13. skynet.ret(skynet.pack(kb,bytes))
  14. end
  15. function dbgcmd.GC()
  16. collectgarbage "collect"
  17. end
  18. function dbgcmd.STAT()
  19. local stat = {}
  20. stat.task = skynet.task()
  21. stat.mqlen = skynet.stat "mqlen"
  22. stat.cpu = skynet.stat "cpu"
  23. stat.message = skynet.stat "message"
  24. skynet.ret(skynet.pack(stat))
  25. end
  26. function dbgcmd.TASK()
  27. local task = {}
  28. skynet.task(task)
  29. skynet.ret(skynet.pack(task))
  30. end
  31. function dbgcmd.INFO(...)
  32. if internal_info_func then
  33. skynet.ret(skynet.pack(internal_info_func(...)))
  34. else
  35. skynet.ret(skynet.pack(nil))
  36. end
  37. end
  38. function dbgcmd.EXIT()
  39. skynet.exit()
  40. end
  41. function dbgcmd.RUN(source, filename)
  42. local inject = require "skynet.inject"
  43. local ok, output = inject(skynet, source, filename , export.dispatch, skynet.register_protocol)
  44. collectgarbage "collect"
  45. skynet.ret(skynet.pack(ok, table.concat(output, "\n")))
  46. end
  47. function dbgcmd.TERM(service)
  48. skynet.term(service)
  49. end
  50. function dbgcmd.REMOTEDEBUG(...)
  51. local remotedebug = require "skynet.remotedebug"
  52. remotedebug.start(export, ...)
  53. end
  54. function dbgcmd.SUPPORT(pname)
  55. return skynet.ret(skynet.pack(skynet.dispatch(pname) ~= nil))
  56. end
  57. function dbgcmd.PING()
  58. return skynet.ret()
  59. end
  60. function dbgcmd.LINK()
  61. skynet.response() -- get response , but not return. raise error when exit
  62. end
  63. return dbgcmd
  64. end -- function init_dbgcmd
  65. local function _debug_dispatch(session, address, cmd, ...)
  66. dbgcmd = dbgcmd or init_dbgcmd() -- lazy init dbgcmd
  67. local f = dbgcmd[cmd] or extern_dbgcmd[cmd]
  68. assert(f, cmd)
  69. f(...)
  70. end
  71. skynet.register_protocol {
  72. name = "debug",
  73. id = assert(skynet.PTYPE_DEBUG),
  74. pack = assert(skynet.pack),
  75. unpack = assert(skynet.unpack),
  76. dispatch = _debug_dispatch,
  77. }
  78. end
  79. local function reg_debugcmd(name, fn)
  80. extern_dbgcmd[name] = fn
  81. end
  82. return {
  83. init = init,
  84. reg_debugcmd = reg_debugcmd,
  85. }