钩子 (Hook)

简介: 钩子 (Hook)

调试库中的钩子机制允许用户注册一个钩子函数,这个钩子函数会在程序运行中某个特定事件发生时被调用。有四种事件能够触发一个钩子:

  1. 每当调用一个函数时产生的call事件
  2. 每当函数返回时产生的return事件
  3. 每当开始执行一行新代码时产生的line事件
  4. 执行完指定数量的指令后产生的count事件。(这里的指令指的是内部操作码


Lua 语言用一个描述导致钩子函数被调用的事件的字符串为参数来调用钩子函数,包括 "call" (或 "tail call" )、 "return""line""count" 。对于 line 事件来说,还有第二个参数,即新行号。我们可以在钩子函数内部调用函数 debug.getinfo 来获取更多的信息。


要注册一个钩子,需要用两个或三个参数来调用函数 debug.sethook :第一个参数是钩子函数,第二个参数是描述要监控时间的掩码字符串,第三个参数是一个用于描述以何种频度获取 count 事件的可选数字。如果要监控 callreturnline 事件,那么只需要把这几个事件的首字母( crl )放入掩码字符串。如果要监控 count 事件,则只需要在第三个参数中指定一个计数器。如果要关闭钩子,只需不带任何参数地调用函数 sethook 即可。


作为一个简单的示例,以下代码安装了一个简单的跟踪器,它会输出解释器执行的每一行代码:

debug.sethook(print, "l")


这句调用只是简单地把函数 print 安装为一个钩子函数,并告诉 Lua 语言在 line 事件发生时调用它。一个更精巧的跟踪器可以使用函数 getinfo 获取当前文件名并添加到输出中:

function trace (event, line)
  local s = debug.getinfo(2).short_src
  print(s .. ":" .. line)
end
debug.sethook(trace, "l")


与钩子一起被使用的一个很有用的函数是 debug.debug 。这个简单的函数可以提供一个能够执行任意 Lua 语言命令的提示符,其等价于如下的代码:

function debug1()
  while true do
    io.write("debug> ")
    local line = io.read()
    if line == "cont" then break end
    assert(load(line))()
  end
end


当用户输入命令 "cont" 时,函数返回。这种标准的实现十分简单,并且在全局环境中运行命令,位于正在被调试代码的定界范围之外。

目录
相关文章
|
8月前
|
自然语言处理 JavaScript 开发者
生命周期钩子1
生命周期钩子1
|
8月前
|
JavaScript 开发者
生命周期钩子2
生命周期钩子2
|
3月前
|
JavaScript 前端开发
useEffect 钩子中可以执行哪些操作?
【10月更文挑战第20天】`useEffect` 是 React 中非常重要的一个钩子,它允许我们在函数组件的渲染过程中执行一些副作用操作。在 `useEffect` 中,我们可以进行各种各样的操作,以满足不同的需求。
25 6
|
3月前
|
前端开发 JavaScript
useReducer 钩子实战
【10月更文挑战第13天】在 React 中,`useState` 是常用的状态管理钩子,但面对复杂状态逻辑时,`useReducer` 提供了更结构化的方式。本文从基础到进阶介绍 `useReducer` 的使用方法、常见问题及解决方案,并通过计数器和表单组件的示例加深理解。
62 3
|
JavaScript
钩子函数讲解
钩子函数讲解
93 0
|
前端开发
封装 useUpdate 钩子
封装 useUpdate 钩子
106 0
|
测试技术
Cyprerss的钩子函数
大家好,我是阿萨。昨天学习了如何使用describe,context,specify 和it 去组织自动化测试用例。大家也学会了如何去写好一个test suites了。 有同学就问了,之前用selenium 或者其他测试框架的时候,都有setup 和teardown 等函数。cypress 咋没见这2个函数。哪如何实现每个测试的suite 之前都执行某个代码逻辑或者是每个测试用例之前都需要执行代码?
118 0
Cyprerss的钩子函数
C/C++ IAT HOOK MessageBoxW
最近在研究各种姿势的 HOOK,虽然 HOOK 这个东西已经是很久之前就有的技术了,但好在目前应用仍然很广泛,所以老老实实肯大佬们 10 年前啃过的骨头,下面是庄重的代码献祭时刻。
|
前端开发
有趣的 hook - useWorker
前几天看到个有趣的 hook: useWorker。可以直接将函数转换为 worker,然后调用执行,这样便可以将一些耗时、阻塞的计算放到 worker 中执行,避免主线程阻塞。 由于很好奇这个 hook 如果在不支持 worker 的浏览器上有没有做兼容,就把源码看了一下,这里记录一下。📝
|
前端开发 JavaScript Windows
JavaScript中的钩子(钩子机制\钩子函数\hook)是什么?
我们前端的JavaScript中,经常提到钩子,毋庸置疑,那这个东西肯定也尤为重要。
264 0