Lua 提供了 debug 库用于提供创建我们自定义调试器的功能。Lua 本身并未有内置的调试器,但很多开发者共享了他们的 Lua 调试器代码。
Lua 中 debug 库包含以下函数:
上表列出了我们常用的调试函数,接下来我们可以看些简单的例子:
- function myfunction ()
- print(debug.traceback("Stack trace"))
- print(debug.getinfo(1))
- print("Stack trace end")
- return 10
- end
- myfunction ()
- print(debug.getinfo(1))
执行以上代码输出结果为:
- Stack trace
- stack traceback:
- test2.lua:2: in function 'myfunction'
- test2.lua:8: in main chunk
- [C]: ?
- table: 0054C6C8
- Stack trace end
在以实例中,我们使用到了 debug 库的 traceback 和 getinfo 函数, getinfo 函数用于返回函数信息的表。
我们经常需要调试函数的内的局部变量。我们可以使用 getupvalue 函数来设置这些局部变量。实例如下:
- function newCounter ()
- local n = 0
- local k = 0
- return function ()
- k = n
- n = n + 1
- return n
- end
- end
-
- counter = newCounter ()
- print(counter())
- print(counter())
-
- local i = 1
-
- repeat
- name, val = debug.getupvalue(counter, i)
- if name then
- print ("index", i, name, "=", val)
- if(name == "n") then
- debug.setupvalue (counter,2,10)
- end
- i = i + 1
- end -- if
- until not name
-
- print(counter())
执行以上代码输出结果为:
- 1
- 2
- index 1 k = 1
- index 2 n = 2
- 11
在以上实例中,计数器在每次调用时都会自增1。实例中我们使用了 getupvalue 函数查看局部变量的当前状态。我们可以设置局部变量为新值。实例中,在设置前 n 的值为 2,使用 setupvalue 函数将其设置为 10。现在我们调用函数,执行后输出为 11 而不是 3。
命令行调试器有:RemDebug、clidebugger、ctrace、xdbLua、LuaInterface - Debugger、Rldb、ModDebug。
图形界调试器有:SciTE、Decoda、ZeroBrane Studio、akdebugger、luaedit。