inject d test/inject_fuck.lua  -- d 是服务的 handle

拿 simpledb.lua 举例,修改如下

 local skynet = require "skynet"
require "skynet.manager" -- import skynet.register
local db = {} local command = {} local i =
local str = "abc"
local t = {} function command.fuck()
return i, str, t
end skynet.info_func(function()
return command.fuck()
end) function command.GET(key)
return db[key]
end function command.SET(key, value)
local last = db[key]
db[key] = value
return last
end skynet.start(function()
skynet.dispatch("lua", function(session, address, cmd, ...)
local f = command[string.upper(cmd)]
if f then
skynet.ret(skynet.pack(f(...)))
else
error(string.format("Unknown command %s", tostring(cmd)))
end
end)
skynet.register "SIMPLEDB"
end)

添加了 fuck 函数,并设置 info_func。

设置 info_func 主要用来在 debug console 中方便用 info d 来查看 inject 的结果

下面是 inject_fuck.lua

 if not _P then
print "inject error!"
return
end local function getuv(f)
local i =
local ups = {}
while true do
local name, value = debug.getupvalue(f, i)
if not name then
break
end
ups[name] = { i, value }
i = i +
end
return ups
end local function uvjoin(f, old_f, old_uv)
local i =
while true do
local name, value = debug.getupvalue(f, i)
if not name then
break
end
if old_uv[name] then
debug.upvaluejoin(f, i, old_f, old_uv[name][])
end
i = i +
end
end local command = _P.lua.command local func = command.fuck
local old_uv = getuv(func)
for k,v in pairs(old_uv) do
print(k,v[])
end print(" --- ") local t
local i
local str
function command.fuck()
return str, t, i
end uvjoin(command.fuck, func, old_uv)
-- debug.setupvalue( command.fuck, 1, 35 )

1. 取出原 fuck 函数的所有 upvalue

2. 然后关联到新的 fuck 函数

_P 内存的 key/value 其实就是 skynet.lua 里 14 行 proto 中的 name 和 dispatch 的 upvalue

 local c = require "skynet.core"
local tostring = tostring
local tonumber = tonumber
local coroutine = coroutine
local assert = assert
local pairs = pairs
local pcall = pcall local profile = require "profile" local coroutine_resume = profile.resume
local coroutine_yield = profile.yield local proto = {}
local skynet = {
-- read skynet.h
PTYPE_TEXT = ,
PTYPE_RESPONSE = ,
PTYPE_MULTICAST = ,
PTYPE_CLIENT = ,
PTYPE_SYSTEM = ,
PTYPE_HARBOR = ,
PTYPE_SOCKET = ,
PTYPE_ERROR = ,
PTYPE_QUEUE = , -- used in deprecated mqueue, use skynet.queue instead
PTYPE_DEBUG = ,
PTYPE_LUA = ,
PTYPE_SNAX = ,
} ---

再看 simpledb.lua 的例子,文件中 disptch 的 upvalue 有两个,command 和 skynet

所以 _P.lua.command 就是文件中的 command,_P.lua.skynet 就是 skynet

在 debug console 用 inject 命令时要格外小心。。

skynet inject address file.lua的更多相关文章

  1. skynet 控制台管理使用技巧

    skynet 自带了一个控制台服务.能够非常方便获取和调试 skynet 执行数据,并且能够热更新代码,所以.弄明确skynet控制台管理能够让你更好地使用skynet,甚至改进这个控制台服务.以满足 ...

  2. skynet debug console 使用

    预读 关于如何使用 skynet 可以参考 wiki 文档 更多实战内容见 https://www.lanqiao.cn/courses/2770 优惠码:2CZ2UA5u 环境测试搭建 使用示例代码 ...

  3. [转]Skynet之斗转星移 - 将控制权交给Lua

      Skynet之斗转星移 - 将控制权交给Lua http://www.outsky.org/code/skynet-lua.html Sep 7, 2014 在我看来,Skynet的一个重要优势是 ...

  4. 第6月第19天 lua动态链接库(luaopen_*函数的使用) skynet

    1. 给这个测试库取名为dylib,它包含一个函数add.lua中这样使用: local dylib = require "dylib.test"    local c = dyl ...

  5. skynet newservice API参考

    local skynet = require("skynet") skynet.start(start_func) c服务snlua启动后执行的第一个lua文件里面的主逻辑必定是s ...

  6. 白话skynet第一篇

    当你走过一个坐在自己店门前的杂货商面前.走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商.守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质, ...

  7. skynet1.0阅读笔记2_skynet的消息投递skynet.call

    为了了解 skynet.call 的调用过程,需要先看看 skynet的队列是如何把包分到不同工作线程的.看下图 查看 global_queue 的skynet_globalmq_push和skyne ...

  8. Skynet服务器框架(八) 任务和消息调度机制

    引言: 在我看来,消息和任务调度应该是skynet的核心,整个skynet框架的核心其实就是一个消息管理系统.在skynet中可以把每个功能都当做一个服务,整个skynet工程在执行过程中会创建很多个 ...

  9. skynet源码阅读<5>--协程调度模型

    注:为方便理解,本文贴出的代码部分经过了缩减或展开,与实际skynet代码可能会有所出入.    作为一个skynet actor,在启动脚本被加载的过程中,总是要调用skynet.start和sky ...

随机推荐

  1. MySQL正则表达式 REGEXP详解

    在开始这个话题之前我们首先来做一个小实验,比较一下REGEXP和Like他们两个哪个效率高,如果效率太低,我们就没有必要做过多的研究了,实验的代码如下:<?phpRequire("co ...

  2. 前端之javascript的节点操作和Event

    一 节点的增删改查 创建节点:createElement(标签名):创建一个指定名称的节点. 追加节点: 追加一个子节点:somenode.appendChild(标签名) 指定某个位置前面添加一个节 ...

  3. Oracle导入的常见语句

    登录sql > sqlplus / as sysdba 创建表空间sql > create tablespace TABLESPACE datafile 'e:\tables1.dbf' ...

  4. 2018.11.07 NOIP模拟 分糖果(贪心)

    传送门 考虑 n = 2 时的情况:假定两个人分别为(a, b),(c, d),则当且仅当min(a,d) ≤ min(b,c)时,把(a, b)放在前面更优,否则把(c, d)放在前面更优 然后把n ...

  5. myeclipse安装svn方法汇总

    myeclipse安装svn方法汇总 博客分类: eclipse   MyEclipse6.5安装SVN插件,掌握了几种方法,本节就像大家介绍一下MyEclipse6.5安装SVN插件的三种方法,看完 ...

  6. 学python之路前的一些话

    为什么学python: 这些年一直从事运维相关的工作.但做下来感觉都是些很基础的东西,无非就是对一些命令或者问题处理很熟练而已,混的都是经验.曾很羡慕会写shell脚本,会自动化安装程序的运维组组长, ...

  7. Switch 选择结构

    switch 选择器 一.语法 switch(变量名){ case 情况1: //代码块 break: case 情况1: //代码块 break: default(默认): //代码块 break: ...

  8. JavaWeb多文件上传及zip打包下载

    项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分.  首先明确一点:  无法通过页面的无刷新ajax请求,直接发下载.上 ...

  9. Windows窗口消息大全

    ////////////////////////////////////////////////////////////////////////// #include "AFXPRIV.H& ...

  10. 安装BouncyCastle

    对于Windows而言 将bcprov-jdk16-146.jar 复制到C:\Program Files\Java\jre6\lib\ext和C:\jdk1.6.0\jre\lib\ext目录下: ...