在Lua中,是否可以知道哪个函数调用了当前函数。
例如
function a()
get_calling_function() --Should print function b
end
function b()
a()
end
这样的事情可能吗?
调试库是否具有此类功能?
答案 0 :(得分:19)
您可以使用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 ?
答案 1 :(得分:9)
你可以使用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
-- we only want to watch lua function calls (not C functions)
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.. " was called by ".. debugInfo.caller.. "!"
print(msg)
end
end
function caller2()
caller1()
end
caller2()
这打印'caller1是从caller2调用的!'
debug.sethook可以在第二个参数中处理3个不同的字符,这样您就可以知道何时通知您。 'c'表示在lua中调用函数时调用hook函数,'r'表示每次函数在lua中返回时调用hook函数,'l'表示每当lua处理新的代码行时调用hook函数。
如果你真的想要,你可以设置它来构建你自己的自定义堆栈跟踪,你也可以在你的钩子中使用debug.getlocal()来尝试找出传递给被调用函数的参数。< / p>
编辑lhf。这实际上是一种更简单的方式来做你想要的,如果你不需要跟踪它,只需要知道函数被调用的上下文。
function caller1()
local current_func = debug.getinfo(1)
local calling_func = debug.getinfo(2)
print(current_func.name.. " was called by ".. calling_func.name.. "!")
end
function caller2()
caller1()
end