Lua - 找出呼叫功能

Sat*_*hJM 13 lua function

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

例如

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


function b()
    a() 
end 
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*ers 20

你可以使用debug.traceback():

function a()
    print(debug.traceback())
end 


function b()
    a() 
end 

b()
Run Code Online (Sandbox Code Playgroud)

哪个会打印:

stack traceback:
    ./test.lua:45: in function 'a'
    ./test.lua:50: in function 'b'
    ./test.lua:53: in main chunk
    [C]: in ?


Mik*_*ran 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()
Run Code Online (Sandbox Code Playgroud)

这打印'caller1是从caller2调用的!'

debug.sethook可以在第二个参数中处理3个不同的字符,这样您就可以知道何时通知您.'c'表示在lua中调用函数时调用hook函数,'r'表示每次函数在lua中返回时调用hook函数,'l'表示每当lua处理新的代码行时调用hook函数.

你可以设置它来构建你自己的自定义堆栈跟踪,如果你真的想要,你也可以在你的钩子中使用debug.getlocal()甚至尝试找出传递给被调用函数的参数.

编辑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
Run Code Online (Sandbox Code Playgroud)

  • 你不需要在钩子里调用`debug.getinfo`.您可以直接在函数内调用`debug.getinfo`. (5认同)
  • 使用尾调用优化,如果`caller2`对caller1的调用最终优化了尾调用,则较简单的版本可能会给出错误的结果,因为这会阻止添加到调用堆栈中。 (2认同)