Lua 调试库
http://blog.csdn.net/vermilliontear/article/details/50851045
http://blog.csdn.net/vermilliontear/article/details/50865156
Q:什么是活动函数?
A:程序中被调用但还未执行完成的函数。
function g()
--[[ 此时函数"g"被调用但还未执行完成,是活动函数。所以这里获取的是函数"g"的信息。
"debug.getinfo(2)"获取的才是函数"f"的信息。]]
local x = debug.getinfo(1, "n")
for k, v in pairs(x) do
print(k, v)
end
end
function f()
-- 此时函数"f"被调用但还未执行完成,是活动函数。所以这里获取的是函数"f"的信息。
local x = debug.getinfo(1, "n")
for k, v in pairs(x) do
print(k, v)
end
print()
g()
end
f()
--[[ result:
namewhat global
name f
namewhat global
name g
]]
Q:什么是调用栈?
A:Lua存储活动函数所使用的栈。每个线程都有自己独立的调用栈。
Q:什么是调用栈的级别?
A:调用调试库函数的函数的栈级别是1,调用该函数的函数的栈级别是2,以此类推。
function foo()
-- 调用调试库的函数。
...
end
function goo()
foo()
end
function hoo()
goo()
end
--[[ 被调用的调试库函数栈级别为0,"foo"的栈级别为1,"goo"的栈级别为2,"hoo"的栈级别为3。
如果还有别的函数调用"hoo()",则栈级别以此类推。]]
hoo()
Q:如何查看调用栈信息?
A:
--[[ debug.traceback([thread,] [message [, level]])
首先打印"message",接着从第"level"个栈级别开始打印"thread"线程中的调用栈信息。
如果"message"不是字符串或"nil",则函数不做任何处理直接返回"message"。
"thread"默认为当前线程,"level"默认为1。]]
function foo()
print(debug.traceback("This is traceback: "))
print()
print(debug.traceback("Traceback from stack_level 2: ", 2))
print()
print(debug.traceback({}))
end
function goo()
foo()
end
function hoo()
goo()
end
hoo()
--[[ results:
This is traceback:
stack traceback:
E:\a.lua:2: in function 'foo'
E:\a.lua:8: in function 'goo'
E:\a.lua:12: in function 'hoo'
E:\a.lua:15: in main chunk
[C]: in ?
Traceback from stack_level 2:
stack traceback:
E:\a.lua:8: in function 'goo'
E:\a.lua:12: in function 'hoo'
E:\a.lua:15: in main chunk
[C]: in ?
table: 00522F78
]]
Q:如何查看函数信息?
A:
--[[ debug.getinfo([thread,] f [, what])
返回一个"table",其中包含线程"thread"中的函数"f"由"what"指定的相关信息。
"thread"默认为当前线程。"f"可以是函数名,也可以是一个数值,如果是数值则代表该函数的栈级别。
如果通过名字指定的函数不存在,则报错;如果通过数值指定的函数不存在,则返回"nil"。
如果"what"不指定,默认情况下返回除合法行号表外的所有域:
source: 创建这个函数的"chunk"的名字。
如果"source"以'@'打头,表示这个函数定义在一个文件中,而'@'之后的部分就是文件名。
若"source"以'='打头,表示之后的部分由用户行为来决定如何表示源码。
其它的情况下,这个函数定义在一个字符串中,而"source"正是那个字符串。