getinfo是調試Lua程序時一個很重要很常見的函數,主要用於獲取函數調用的基本信息。這個函數的難點在於各個參數的含義。下面一一介紹。
一、函數簡介:
1.原型:getinfo(level, arg)
2.調用:debug.getinfo(level, arg)
3.返回值:返回一個包含函數信息的table,table的內容由參數arg決定,包含哪個函數的信息由level決定.
4.參數解釋:
(1)level:函數調用的層級,表示要輸出哪個函數的信息。
(0:getinfo自身,1:調用getinfo的函數f1,2:調用f1的函數f2,...以此類推。f1, f2, ...也可能不是函數,而是在文件中直接調用getinfo)
(2)arg:該參數是一個字符串,其中每個字符代表一組字段,用於指定希望獲取哪些信息,可為 "n","S","l","u","f","L" 中的一個或他們的組合
【注意區分大小寫】
<英文看不懂沒關系,我簡單解釋下,加黑的表示返回的table包含的內容,即函數信息>
'n
': fills in the field name
and namewhat
;
'S
': fills in the fields source
, linedefined
, lastlinedefined
, what
, and short_src
;(source)
'l
': fills in the field currentline
;
'u
': fills in the field nups
;
'f
': pushes onto the stack the function that is running at the given level; ->func
'L
': pushes onto the stack a table whose indices are the numbers of the lines that are valid on the function. (A valid line is a line with some associated code, that is, a line where you can put a break point. Non-valid lines include empty lines and comments.) ->activelines
name:函數名, namewhat:函數類型(field, upvalue, global),what:函數類型(Lua, C, main),
short_src, source:函數所屬的文件名, linedefined, lastlinedefined:函數定義的起始和結束行號,
currentline:上級(level - 1)函數被調用的行號,nups: 函數的upvalue值的個數,
func:函數本身, activelines:一個包含行號的table,可理解為該函數運行的代碼的行號
(如果還不是很明白,可以看下面的示例,也可以自己運行一下代碼)
二、示例
假設一個文件luatest4.lua包含如下代碼:
local args = {"n","S","l","u","f","L"}
local function f1()
for level =0,3 do --不同級別
print("level================", level)
for k, v in ipairs(args) do --不同參數
print("arg======", v)
local fInfo = debug.getinfo(level, v)
for key, val in pairs(fInfo) do
print("key, val==", key, val)
end
end
end
end
local function f2()
print("f1=====", f1)
f1()
end
function main()
print("f2=====", f2)
f2()
end
print("main======", main)
main()
--========運行以上代碼,結果如下(win7上測試的)======
main====== function: 0073D128
f2===== function: 0073D108
f1===== function: 0073D0E8
level================ 0
arg====== n
key, val== name getinfo
key, val== namewhat field
arg====== S
key, val== source =[C]
key, val== what C
key, val== lastlinedefined -1
key, val== linedefined -1
key, val== short_src [C]
arg====== l
key, val== currentline -1
arg====== u
key, val== nups 0
arg====== f
key, val== func function: 0073AF70
arg====== L
level================ 1
arg====== n
key, val== name f1
key, val== namewhat upvalue
arg====== S
key, val== source @luatest4.lua
key, val== what Lua
key, val== lastlinedefined 13
key, val== linedefined 2
key, val== short_src luatest4.lua
arg====== l
key, val== currentline 7
arg====== u
key, val== nups 1
arg====== f
key, val== func function: 0073D0E8
arg====== L
key, val== activelines table: 0073BC78
level================ 2
arg====== n
key, val== name f2
key, val== namewhat upvalue
arg====== S
key, val== source @luatest4.lua
key, val== what Lua
key, val== lastlinedefined 18
key, val== linedefined 15
key, val== short_src luatest4.lua
arg====== l
key, val== currentline 17
arg====== u
key, val== nups 1
arg====== f
key, val== func function: 0073D108
arg====== L
key, val== activelines table: 0073BDE0
level================ 3
arg====== n
key, val== name main
key, val== namewhat global
arg====== S
key, val== source @luatest4.lua
key, val== what Lua
key, val== lastlinedefined 23
key, val== linedefined 20
key, val== short_src luatest4.lua
arg====== l
key, val== currentline 22
arg====== u
key, val== nups 1
arg====== f
key, val== func function: 0073D128
arg====== L
key, val== activelines table: 0073EA78
--===============================
看完這個示例后,大家應該對getinfo有所了解了吧。