解析關于Lua調試器案例實現
文章介紹了如何實現一個Lua調試器,實現Lua調試器的目的僅僅是寄希望借此熟悉Lua源代碼。所編寫的Lua調試器功能越強,表明你對Lua源碼越了解。
先前用lua寫過一些應用,感覺Lua是一個很小巧的語言,Lua源代碼無疑是研究語言相關的首選。“Lua雖小,五臟俱全”!為了研究Lua源代碼,就打算著手寫一個簡單的Lua調試器,發現其中還是有些收獲的,特記錄如下。
作為一個調試器,應該支持一些最簡單而又常用的功能,比如:單步跟蹤、輸出調試信息、設置斷點等。要探索如何實現Lua調試器,還是帶著這些問題去找答案吧。本文使用的開發環境為:win7,lua 5.1.4源代碼。
Lua虛擬機是如何暫停的
Lua虛擬機和普通的CPU一樣,包含兩部分:數據存儲區和邏輯控制區。數據存儲區對應著CPU的寄存器、狀態等,在Lua中實際上就是lua_State。邏輯控制區對應著CPU的每條指令的具體實現。Lua虛擬機邏輯控制區的相關的源代碼位于lvm.c中。其中,執行Lua指令的函數為luaV_execute。
為了方便調試,函數luaV_execute在執行每條Lua指令之前,會去查找是否存在調試鉤子(hook):存在的話,去執行鉤子。然后,判斷Lua虛擬機的狀態是否為暫停,若是的話就返回,而不執行當前Lua指令。若不存在調試鉤子,則正常執行Lua指令。
- if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
- (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
- traceexec(L, pc); // 內部會執行相應的鉤子函數
- if (L->status == LUA_YIELD) { // 鉤子函數是否將狀態轉為暫停?
- L->savedpc = pc - 1;
- return; // 此處離開函數luaV_execute,導致虛擬機暫停執行
- }
- base = L->base;
- }
小結:解析關于Lua調試器案例實現的內容介紹完了,希望通過本文的學習能對你有所幫助!