Lua - 查找调用函数
2012-5-31 18:12:29
收藏:0
阅读:194
评论:2
在 Lua 中,是否可以知道哪个函数调用了当前函数。
例如
function a()
get_calling_function() --应该打印函数 b
end
function b()
a()
end
是否可以实现类似这样的功能?
在debug库中是否有这样的功能?
点赞
用户1208078
你可以使用 debug.sethook() 设置一个钩子,每当 Lua 中发生某些特殊事件时都会调用它。这对于像这样的事情很有用。
local debugInfo = { caller = nil, callee = nil }
function hook()
local info = debug.getinfo(2)
if info == nil then
debugInfo.callee = nil
return
end
-- 我们只想监视 Lua 函数调用(不是 C 函数)
if info.what ~= "Lua" then
debugInfo.callee = "C function"
return
end
debugInfo.caller = debugInfo.callee
debugInfo.callee = info.name
end
debug.sethook(hook, "c")
function caller1()
if debugInfo.caller ~= nil and debugInfo.callee ~= nil then
msg = debugInfo.callee.. " 是由 ".. debugInfo.caller.. " 调用的!"
print(msg)
end
end
function caller2()
caller1()
end
caller2()
这将打印 'caller1 是由 caller2 调用的!'
debug.sethook 可以处理第二个参数中的三个不同字符,因此您可以让它知道何时通知您。 'c' 表示在 Lua 中调用任何函数时调用您的钩子函数, 'r' 表示每次 Lua 中的函数返回时调用您的钩子函数,而 'l' 表示每当 Lua 处理一行新代码时调用您的钩子函数。
如果您真的想要这样做,则可以设置此项来构建自己的自定义堆栈跟踪,并且在您的钩子中甚至可以使用 debug.getlocal() 尝试解决传递给调用函数的参数是什么。
为 lhf 进行编辑。如果您不需要跟踪此内容,而且只需要知道函数调用的上下文,则可以使用以下更简单的方法。
function caller1()
local current_func = debug.getinfo(1)
local calling_func = debug.getinfo(2)
print(current_func.name.. " 是由 ".. calling_func.name.. " 调用的!")
end
function caller2()
caller1()
end
2012-05-31 18:56:04
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你可以使用
debug.traceback():function a() print(debug.traceback()) end function b() a() end b()它将输出:
stack traceback: ./test.lua:45: in function 'a' ./test.lua:50: in function 'b' ./test.lua:53: in main chunk [C]: in ?