第一版是为 Lua 5.0 编写的。虽然对于后续版本来说仍然有很大关联性,但有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


23.2 – 钩子

调试库的钩子机制允许我们在程序运行时注册一个函数,该函数将在特定事件中被调用。有四种类型的事件可以触发钩子:每次 Lua 调用函数时都会发生调用事件;每次函数返回时都会发生返回事件;当 Lua 开始执行新代码行时会发生事件;在给定数量的指令之后会发生计数事件。Lua 使用单个参数调用钩子,该参数是一个字符串,描述生成调用的事件:"call""return""line""count"。此外,对于行事件,它还传递第二个参数,即新行号。我们始终可以使用 debug.getinfo 在钩子中获取更多信息。

要注册钩子,我们使用两个或三个参数调用 debug.sethook:第一个参数是钩子函数;第二个参数是一个字符串,描述我们要监视的事件;可选的第三个参数是一个数字,描述我们希望获取计数事件的频率。要监视调用、返回和行事件,我们在掩码字符串中添加它们的首字母(`c`´`r`´`l`´)。要监视计数事件,我们只需提供一个计数器作为第三个参数。要关闭钩子,我们调用不带任何参数的 sethook

作为一个简单的示例,以下代码安装了一个原始跟踪器,该跟踪器打印解释器执行的每行新代码

    debug.sethook(print, "l")
它只是将 print 安装为钩子函数,并指示 Lua 仅在行事件中调用它。更精细的跟踪器可以使用 getinfo 将当前文件名添加到跟踪中
    function trace (event, line)
      local s = debug.getinfo(2).short_src
      print(s .. ":" .. line)
    end
    
    debug.sethook(trace, "l")