lua_getinfo
int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
返回一個指定的函數或函數調用的信息。
當用於取得一次函數調用的信息時,參數 ar
必須是一個有效的活動的記錄。這條記錄可以是前一次調用lua_getstack
得到的,或是一個鈎子 (參見lua_Hook
)得到的參數。
用於獲取一個函數的信息時,可以把這個函數壓入堆棧,然后把 what
字符串以字符 '>
' 起頭。(這個情況下,lua_getinfo
從棧頂上彈出函數。)例如,想知道函數f
在哪一行定義的,你可以下下列代碼:
lua_Debug ar; lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* 取到全局變量 'f' */ lua_getinfo(L, ">S", &ar); printf("%d\n", ar.linedefined);
what
字符串中的每個字符都篩選出結構 ar
結構中一些域用於填充,或是把一個值壓入堆棧:
- '
n
': 填充name
及namewhat
域; - '
S
': 填充source
,short_src
,linedefined
,lastlinedefined
,以及what
域; - '
l
': 填充currentline
域; - '
u
': 填充nups
域; - '
f
': 把正在運行中指定級別處函數壓入堆棧; (譯注:一般用於獲取函數調用中的信息, 級別是由 ar 中的私有部分來提供。 如果用於獲取靜態函數,那么就直接把指定函數重新壓回堆棧, 但這樣做通常無甚意義。) - '
L
': 壓一個 table 入棧,這個 table 中的整數索引用於描述函數中哪些行是有效行。 (有效行指有實際代碼的行, 即你可以置入斷點的行。 無效行包括空行和只有注釋的行。)
這個函數出錯會返回 0 (例如,what
中有一個無效選項)。
如果你想輸出多個,what字符串可以放幾個上面列舉的參數,例如 lua_getinfo(L, "Sln", &ar);
'l
'參數可以看見當前處於第幾行,對查看崩潰很有幫助。