• Lua调试函数 debug.getinfo() namewhat详解


    Lua调试的时候会用到debug.getinfo()函数,what的值文档给了解释:

    • "Lua" : Lua function
    • "C" : C function
    • "main" : main part of a chunk (通过load函数等执行的语句)

    关于namewhat的值到底表示什么,官方文档只是简单列举(不全)。

    列举一些常见情况

    local getinfo = debug.getinfo
    local format = string.format
    local hook = function(event, line)
      local t = getinfo(2, "nS")
      local msg = format("[%s:%s] %s (%s:%s)", t.what, t.namewhat, t.name, t.source, t.linedefined)
      print(msg)
    end
    debug.sethook(hook, "c")
    
    local M = {}
    
    print(123)
    -- [C:global] print (=[C]:-1)
    
    local _print = print
    _print(123)
    -- [C:local] _print (=[C]:-1)
    
    function M.Func1(a)
    end
    
    function M:Func2(a)
    end
    
    M.Func1()
    -- [Lua:field] Func1 (@.\test.lua:19)
    M.Func2()
    -- [Lua:field] Func2 (@.\test.lua:22)
    M:Func2()
    -- [Lua:method] Func2 (@.\test.lua:22)
    
    local list = {1, 2, 3}
    for i in pairs(list) do
      local a = 0
    end
    --[[
      [C:global] pairs (=[C]:-1)
      [C:for iterator] for iterator (=[C]:-1)
      [C:for iterator] for iterator (=[C]:-1)
      [C:for iterator] for iterator (=[C]:-1)
    ]]
    
    local t = { a = 1 }
    setmetatable(t, {
      __index = function(t, k)
      end
    })
    local a = t.a
    local b = t.b
    -- [Lua:metamethod] index (@.\test.lua:46)
    
    function GlobalFunc1()
    end
    
    function GlobalFunc2()
      return GlobalFunc1()
    end
    
    GlobalFunc2()
    --[[
      [Lua:global] GlobalFunc2 (@.\test.lua:56)
      [Lua:] nil (@.\test.lua:53)
    --]]
    
    function M.Func3()
      local a = 1
      local closure_func = function()
        a = a + 1
      end
    
      closure_func()
      return a
    end
    
    M.Func3()
    --[[
      [Lua:field] Func3 (@.\test.lua:66)
      [Lua:local] closure_func (@.\test.lua:68)
    ]]
    
    function M.Func4(f)
      f()
    end
    
    M.Func4(function() end)
    --[[
      [Lua:field] Func4 (@.\test.lua:82)
      [Lua:local] func (@.\test.lua:86)
    ]]
    
    local FileFunc1
    local FileFunc2
    
    FileFunc1 = function()
    end
    
    FileFunc2 = function()
      FileFunc1()
    end
    
    FileFunc2()
    --[[
      [Lua:local] FileFunc2 (@.\test.lua:98)
      [Lua:upvalue] FileFunc1 (@.\test.lua:95)
    ]]
    
    FileFunc3() = function()
    end
    
    local FileFunc4() = function()
      FileFunc3()
    end
    
    FileFunc4()
    --[[
      [Lua:local] FileFunc4 (@.\test.lua:111)
      [Lua:global] FileFunc3 (@.\test.lua:108)
    ]]
    
    load("return 1")()
    --[[
      [C:global] load (=[C]:-1)
      [main:] nil (return 1:0)
    ]]
    
    local obj = setmetatable({}, {__index = { Func1 = function() end } })
    obj:Func1()
    --[[
      [C:global] setmetatable (=[C]:-1)
      [Lua:method] Func1 (@.\test.lua:127)
    ]]
    

    具体含义归纳总结

    • "": 通过load()等函数执行的代码块
    • "for iterator": 迭代器
    • "metamethod": meta方法
    • "field": 通过M.FuncName()形式调用的函数
    • "method": 通过M:FuncName()形式调用的函数
    • "global": 调用global值
    • "local": 调用local值
    • "upvalue": 调用upvalue值

    应用

    ""正常来说是没太大意义的,load()执行的语句一般只有调试会用,不需要对调试代码本身进行分析
    "global"可用于查找没有写类似local print = print的文件
    "local"可用于查找闭包函数 (还需要加更多判断,来和直接写在文件内的调用进行区分,但如果根据短期内调用频率进行统计的话,直接判断"local"就足够了)

  • 相关阅读:
    这份Java大厂常见面试题解析,你的闭关修练宝典!
    React + Typescript领域初学者的常见问题和技巧
    安装Docker报错求解答~~
    学习新知识时的几个技巧
    计算机毕业设计Java学科竞赛管理系统(源码+系统+mysql数据库+Lw文档)
    ZJCA数字证书用户责任书
    神经网络matlab代码程序,matlab神经网络能做什么
    QCustomPlot 坐标轴间隔显示刻度标签
    设计模式学习笔记(一)
    每日一题:web常见的攻击方式有哪些?如何防御?
  • 原文地址:https://www.cnblogs.com/lunoctis/p/18039838