调试lua代码
lua沒有調(diào)試器,但是它提供了很強(qiáng)的調(diào)試功能(debug 庫), 所以其實(shí)一些常用的調(diào)試功能都能很方便的使用,就像使用一個命令行調(diào)試器一樣:
【例子程序】
-- debug.luagvar1 = 100 function foo()local var2 = 10function bar()debug.debug()return var2endbar() enddebug.debug() foo()
?
【設(shè)置斷點(diǎn)】
這個比較麻煩一點(diǎn),需要修改代碼加入一句:
debug.debug()
如果你要條件斷點(diǎn),或者計數(shù)斷點(diǎn),沒問題,直接寫代碼就是了
【開始調(diào)試】
直接運(yùn)行就是:
lua debug.lua
進(jìn)入斷點(diǎn)顯示:
[baiyanh@baiyanh-VirtualBox:~/source/arena/lua/PIL/c23-debug.lib]
$ lua debug.lua
lua_debug>
要繼續(xù)則運(yùn)行cont(inue):
lua_debug> cont
【打印callstack】
lua_debug> print(debug.traceback()) stack traceback: (debug command):1: in main chunk [C]: in function 'debug' debug.lua:5: in function 'bar' debug.lua:8: in function 'foo' debug.lua:12: in main chunk [C]: ?注意因為斷點(diǎn)是調(diào)用庫函數(shù)debug.debug才進(jìn)入的,stack trace中的前2幀是debug函數(shù)引入的,需要注意。
【查看全局變量】
lua_debug> print(gvar1) 100 lua_debug> for k, v in pairs(_G) do io.write(k) io.write(" ") end lua_debug> string xpcall package tostring print os unpack require getfenv setmetatable next assert tonumber io rawequal collectgarbage arg getmetatable bar module rawset foo gvar1 math debug pcall table newproxy type coroutine _G select gcinfo pairs rawget loadstring ipairs _VERSION dofile setfenv load error loadfile【查看局部變量】
局部變量不能直接訪問,需要用debug.getlocal,比如這里訪問foo函數(shù)的局部變量:
lua_debug> print(debug.getlocal(4,1)) var2 10這里getlocal的第一個參數(shù)為幀數(shù),我們根據(jù)debug.traceback返回的數(shù)據(jù),知道foo對應(yīng)第4幀。
【查看upvalue】
這里查看函數(shù)bar的upvalue,也就是foo里的那個局部變量
lua_debug> print(debug.getupvalue(debug.getinfo(3,"f").func, 1)) var2 10?
這應(yīng)付日常的調(diào)試應(yīng)該已經(jīng)足夠了(除了那些print黨:))。
當(dāng)然,我們可以把這些復(fù)雜的調(diào)用事先寫成函數(shù)放在一個文件里,比如debug,然后可以:
lua debug debug.lua這樣就更方便了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/baiyanhuang/archive/2013/01/01/2841398.html
總結(jié)
- 上一篇: win7无线局域网_局域网共享一键修复
- 下一篇: DllImport的用法