Lua - 找出呼叫功能

时间:2012-05-31 18:12:29

标签: function lua

在Lua中,是否可以知道哪个函数调用了当前函数。

例如

function a()
    get_calling_function()    --Should print function b
end 


function b()
    a() 
end 

这样的事情可能吗?
调试库是否具有此类功能?

2 个答案:

答案 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