关闭

24.2 hooks

960人阅读 评论(0) 收藏 举报
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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:71621次
    • 积分:1145
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:0篇
    • 译文:12篇
    • 评论:10条
    文章分类
    最新评论