Function 使用Lua访问函数体

Function 使用Lua访问函数体,function,debugging,lua,function-pointers,visualizer,Function,Debugging,Lua,Function Pointers,Visualizer,在这里我将回到基本内容,但在Lua中,您可以这样定义一个表: myTable = {} myTable [1] = 12 打印表引用本身会返回指向它的指针。要访问其元素,您需要指定一个索引(即,与数组完全相同) 现在,函数是另一回事了。您可以这样定义和打印函数: myFunc = function() local x = 14 end --Defined function print(myFunc) --Printed pointe

在这里我将回到基本内容,但在Lua中,您可以这样定义一个表:

myTable = {}
myTable [1] = 12
打印表引用本身会返回指向它的指针。要访问其元素,您需要指定一个索引(即,与数组完全相同)

现在,函数是另一回事了。您可以这样定义和打印函数:

myFunc = function() local x = 14 end     --Defined function
print(myFunc)                            --Printed pointer to function

是否有方法访问已定义函数的主体。我正在尝试组合一个小型代码可视化工具,并希望使用特殊函数/变量“种子”给定函数,以允许可视化工具将自身“挂钩”到代码中,我需要能够从变量或字符串重新定义函数。

您可以通过为每个函数创建一个以及使用全局(相对于局部)变量。在函数中创建的变量将在函数执行后出现在环境表中

env = {}
myFunc = function() x = 14 end
setfenv(myFunc, env)
myFunc()
print(myFunc)    -- prints pointer
print(env.x)     -- prints 14
或者,您可以使用:

对您来说,使用而不是显式地进入调试模式(即添加debug.debug()调用)检索局部变量可能更有用

Lua C API中也有一个调试库。

请在调试库中签出

自我反省的主要功能 调试库是debug.getinfo 功能。它的第一个参数可能是 函数或堆栈级别。当你 调用debug.getinfo(foo)获取一些 函数foo,你可以得到一张有 关于该函数的一些数据。这个 表可能包含以下字段:


我想您需要的字段是func。

无法访问普通Lua中给定函数的主体源代码。源代码在编译成字节码后被丢弃

请注意,可以使用类似loadstring的工具在运行时定义函数

部分解决方案是可能的——取决于您实际想要实现的目标

如果启用了调试库,并且没有从字节码中删除调试符号,则可以从调试库中获取源代码位置。之后,您可以加载实际的源文件并从中提取代码

您可以使用所需的元数据手动装饰感兴趣的函数。请注意,Lua中的函数是有效的表键,所以您可以创建一个用于元数据表的函数。您可能希望将此表设置为弱键控,这样就不会阻止GC收集函数


如果您需要分析Lua代码的解决方案,请查看。

使用调试库是您唯一的选择。使用它,您可以获取字符串(如果函数是在使用“loadstring”加载的块中定义的)或定义函数的文件名;以及函数定义开始和结束的行号。看


在我目前的工作中,我们修补了Lua,这样它甚至可以为您提供函数开始和结束的列号,这样您就可以使用它获取函数源。该补丁不太难复制,但我不认为我可以发布在这里:-(

虽然这可能对某些事情有用,但我需要能够解析函数体并查看执行的所有内容,而不仅仅是变量声明。我还需要允许使用局部变量。我目前无法查看您链接到的页面,但我稍后会仔细查看。请记住,lua中的函数实际上并不需要d必须用名称定义,因为它们是第一类,可以传递。它们也可以是匿名函数,由另一个函数返回(请参见闭包-),而这是一个正确的步骤,如debug.getinfo()返回函数的名称、定义它的行等,“func”字段仍然只返回指向函数的指针。我还查看了调试库,其中似乎没有一个能够完成我需要的任务。请在同一个表中尝试short_src或source,否则可能会返回“source”和“short_src”同样的事情。'source'返回@和'short_src'返回。在我看来,我也是SOL。不幸的是,我没有重新编译Lua的权限(我在Lua沙盒环境中)。我可以设置一些方法来自动为包含列的函数创建一个表。问题主要是我没有访问文件系统的权限。谢谢你的建议。
env = {}
myFunc = function() x = 14 end
setfenv(myFunc, env)
myFunc()
print(myFunc)    -- prints pointer
print(env.x)     -- prints 14
> myFunc = function() local x = 14 ; debug.debug() end
> myFunc()
> lua_debug> _, x = debug.getlocal(3, 1)
> lua_debug> print(x) -- prints 14