Lua - 查找调用函数

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

例如

function a()
    get_calling_function()    --应该打印函数 b
end

function b()
    a()
end

是否可以实现类似这样的功能?

在debug库中是否有这样的功能?

点赞
用户50476
用户50476

你可以使用 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 ?
2012-05-31 18:36:34
用户1208078
用户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