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. 可以用WebRTC来做视频直播吗?

    https://www.zhihu.com/question/25497090   作者:韦易笑链接:https://www.zhihu.com/question/25497090/answer/72 ...

  2. 使用xtrabackup备份innodb引擎的数据库

    innodb引擎的数据库可以使用mysqldump备份,如果表很大几十个G甚至上百G,显示用mysqldump备份会非常慢.然后使用xtrabackup 可以很快的在线备份innodb数据库.Inno ...

  3. Cantor表(NOIP1999)

    题目链接:Cantor表 这道题很水,但有的人没看懂题意,这不怪大家,怪题目没说清楚. 给张图: 看到这,你应该明白题目意思了. 先看看有什么规律. 我把这个数列写出来: 1/1,1/2,2/1,3/ ...

  4. Linux运维之Ansible自动化运维管理工具

    Ansible简介:Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务.后面会提到批量安装 ...

  5. 63.delegate回调 和block回调

    效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...

  6. Bootstrap之javascript组件

    一 模态框 模态框放在body标签里面的,是body标签的子元素 静态实例: <div class="modal fade" tabindex="-1" ...

  7. Java设计模式——行为型模式

    行为型模式,共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 11种模式的关系: 第一类:通过父类与子类的关系 ...

  8. vue 开发系列(五) 调用原生API

    概要 我们在开发手机端程序的时候了,我们经常需要使用到拍照,二维码的功能.数字天堂公司提供了大量的原生API支持. http://www.html5plus.org/doc/ 实现 1.在hbuild ...

  9. IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA 实体类浅谈

    一.实体类分析 一般用到的实体类的类型有 String类型.Long类型.Integer类型.Double类型.Date类型.DateTime类型.Text类型.Boolean型等 1.String类 ...

  10. 整合Spring+Struts2+Mybatis加spring单元测试等

    前言 自己是在CentOS7的IntelliJ IDEA里开发的,里面中文输入法有问题经常用不了,所以这里用了很多chinglish,希望不要介意: 一:pom依赖 <?xml version= ...