debug.setupvalue (counter,2,10) end i = i + 1 end -- if until not name print(counter())执行以上代码输出结果为:1 2 index 1 k = 1 index 2 n = 2 11在以上实例中,计数器在每次调用时都会自增1。实例中我们使用了 getupvalue 函数查看局部变量的当前状态。我们可以设置局部变量为新值。实例中...
Lua (local)f1 test.lua:17 lua_debug> cont 测试tail call优化 我们再来测试下tail call的优化,编写如下测试脚本。我们定义了一个尾调用递归的函数foo,然后再其他函数上随便加了一个断点(为了设置hook)。然后我们foo函数一直递归调用。 localldb =require"luadebug" localsetbp = ldb.setbreakpoint localrmbp = ...
debug.sethook(hook,"c")-- 设置钩子函数的"call"事件 end returns.bpid--> 返回断点id end 因为我们支持不指定行号,但我们并不确定函数的第一个有效行是什么。为了方便地记录断点,又不至于与实际的断点行冲突,我们用了一个特殊值0来表示这种情况。 后续的逻辑与setfuncbp函数基本一致,如果已经添加了相同的断...
print(debug.getinfo(1))执行以上代码输出结果为:Stack trace stack traceback: test2.lua:2: in function 'myfunction' test2.lua:8: in main chunk [C]: ? table: 0054C6C8 Stack trace end 在以实例中,我们使用到了 debug 库的 traceback 和 getinfo 函数, getinfo 函数用于返回函数信息的表。 另...
使用带有两个或者三个参数的debug.sethook 函数来注册一个hook:第一个参数是hook函数;第二个参数是一个描述我们打算监控的事件的字符串;可选的第三个参数是一个数字,描述我们打算获取 count事件的频率。为了监控call、return和line事件,可以将他们的第一个字母('c'、'r' 或 'l')组合成一个mask字符串即可。要...
10.sethook ([thread,] hook, mask [, count]): 将一个函数作为钩子函数设入。 字符串 mask 以及数字 count 决定了钩子将在何时调用。 掩码是由下列字符组合成的字符串,每个字符有其含义: 'c': 每当 Lua 调用一个函数时,调用钩子; 'r': 每当 Lua 从一个函数内返回时,调用钩子; ...
debug.sethook简介 其实lua自带的debug就可以做到: debug库提供了一种hook的方式,可以通过注册一个handler函数,在lua脚本运行到某个调用时,会触发这个handler,获取到相应的执行信息,并且给你一个记录和数据维护的机会。 它主要有四种事件会触发这个handler的调用: 当调用一个lua函数的时候,会触发call事件 当函数返回...
void lua_sethook (lua_State *L, lua_Hook f, int mask, int count); 第二个参数f需要指向我们自己定义的钩子函数,这个钩子函数原型为: typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); 我们也可以通过下面即将介绍的调试库中的函数来设置钩子函数,效果是一样的,因为调试库函数的内部也是调...
1.debug(): 进入一个用户交互模式,运行用户输入的每个字符串。 使用简单的命令以及其它调试设置,用户可以检阅全局变量和局部变量, 改变变量的值,计算一些表达式,等等。 输入一行仅包含 cont 的字符串将结束这个函数, 这样调用者就可以继续向下运行。 2.getfenv(object): ...
lua的class实质是table,所以拿到class的Instance 直接替换函数即可 1 2 3 4 5 6 7 8 9 -- 替换 ...