24.2 hooks

Hook机制的作用:一个运行程序执行某个事件时,会调用我们注册过的相应的函数。有四种事件可以触发一个hook:
  • 调用事件(call):当Lua调用一个函数时发生;
  • 返回事件(return):当一个函数返回时发生;
  • 行事件(line):当Lua执行一行新的代码时发生
  • 计数事件(count):在执行完给定的指令条数之后发生
Lua用一个参数调用hook,就是用一个字符串表示事件:“call”(或者"tail call"),“return”,“line”或者“count”。对于行事件,函数需要第二个参数“一个新行号”。为了得到hook里面更多的信息,我们要用debug.getinfo。

通过调用debug.sethook来注册一个hook,函数有两到三个参数:第一个参数是被hook的函数;第二个参数是一个遮掩吗字符串,用于表示我们要监视的事件;第三个可选参数是一个数字,表示监视的频率(译者注:即多久监视一次)。为了监视调用、返回、行事件,我们在第二个遮掩码字符串中用('c', 'r', 'l')首字母表示。为了监视计数事件,我们只需提供一个计数器当做第三个参数。无参数的调用sethook,既可以关闭hook。

下面有一个简单的例子,在一个函数内安装一个简单的跟踪器,当Lua解析器执行每一行时,Lua会调用print输出当前的行号。
 debug.sethook(print, "l")

这个函数print安装成hook函数,当Lua执行行事件时候,通知Lua调用print。下面提供一个复杂的跟踪器,在函数里面使用getinfo得到当前的文件名:
function trace(event, line)
     local s = debug.getinfo(2).short_src
     print(s .. " : " .. line)
end

debug.sethook(trace, "l")

(译者注:当Lua执行一行代码时,此时发生了行事件,Lua会调用我们的注册函数用于处理行事件,Lua传给处理函数两个参数:line和行号。)
一个很有用的函数debug.debug()可以和hook结合使用。这个函数输出一个提示符等待用于输入Lua命令。debug.debug()的功能大致如下:
function debug1()
     while true do
          io.write("debug>")
          local line = io.read()
          if line == "cont" then break end
          assert(load(line))()
     end
end

(-----
译者注:debug.debug()的使用方法,输入cont跳出一个debug()。有点像单步调试
function trace(event, line)
     local s = debug.getinfo(1).short_src
     print(s .. " : " .. line)
     debug.debug()
end

debug.sethook(trace, "l")

a = 100
print("11")
print("22")
print("33")
)-----
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值