Skip to content

Latest commit

 

History

History
75 lines (46 loc) · 2.67 KB

0X4AHooks.md

File metadata and controls

75 lines (46 loc) · 2.67 KB

0X4A Hooks

前置知识

  • 0X49 调试

简介

其实debug模块还有一些有关用户数据类型以及函数上值的函数.但是个人认为不是非常重要,所以略去介绍.这一节介绍debug的Hooks机制.

在说Hooks之前需要简单介绍一下事件机制.所谓的事件机制简单来说就是当某一件事情发生的时候执行一个指定的函数.比如我希望每次计算的结果大于100的时候就输出一条信息.这个就可以通过事件机制来实现.你可以每次运算完都调用一个指定的函数,并且把运算结果作为参数传递给它.

如果要完成"结果大于100就输出一条信息"只需要该写那个每次都调用的函数的定义为"结果大于100就输出一条信息".

当然这个功能也可以不用事件机制实现,每次手动输入if-else语句也能达到效果.但是使用事件机制有两大好处.第一是如果新增可能产生这类事件的代码的时候,不需要复制粘贴大量代码(手工输入的if-else语句).第二是如果将来要做修改,只需要修改一处,而不需要修改所有的地方.比如我想要在每次计算结果之后"如果结果小于100,就读入一个数字".只需要该写事件处理函数的定义就可以.

当然事件处理机制在很多地方都可以应用,不仅仅是Lua,也不仅仅是debug.你可以使用自己实现的事件机制,也可以使用别人实现好的事件机制.

我们这里要介绍的Lua的debug模块中的Hooks就是专用于调试的事件机制.当一些调试中定义的事件发生的时候做相应处理.

事件类型

常用的调试中的事件类型用一些字符串来表示:

'l'表示每当Lua虚拟机执行一行代码的时候. 'c'表示每当发生函数调用的时候. 'r'表示每当发生返回的时候.

注册事件

所谓的'注册',就是通知事件机制,当某类事情发生的时候有一个新的动作要做(一个新的函数要执行).

使用函数debug.sethook进行设置.

例如我希望每执行一行代码都输入一个行号就写:

debug.sethook(print,'l')

如果我希望每次调用函数前都输出一句话,就写:

function func(...)
print(...)
print('calling...')
end

debug.sethook(func,'c')

注册之后再执行任何代码,都会在事件发生的时候执行所设定的函数.除非用nil再设置一遍相同的事件,以取消hook.

这里给出一个小例子,在执行do-end语句中的内容的时候会显示行号:

debug.sethook(print,'l')

do
    x=1
    y=2
    x=x+y
    print(x)
end

debug.sethook(nil,'l')

获取注册事件

如果想要查看当前设置的hooks可以调用函数debug.gethook.

后续推荐

  • 0X4B 与C交互