成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解如何實現Lua調試器案例

移動開發 iOS
如何實現Lua調試器案例是本文要介紹的內容,主要是來學習lua調試器的實現,具體內容的實現來看本文詳解。

如何實現Lua調試器案例是本文要介紹的內容,主要是來學習lua調試器的實現,具體內容的實現來看本文詳解。

本文簡單介紹了如何實現一個Lua調試器,實現Lua調試器的目的僅僅是寄希望借此熟悉Lua源代碼。所編寫的Lua調試器功能越強,表明你對Lua源碼越了解。

先前用lua寫過一些應用,感覺Lua是一個很小巧的語言,Lua源代碼無疑是研究語言相關的***。“Lua雖小,五臟俱全”!為了研究Lua源代碼,就打算著手寫一個簡單的Lua調試器,發現其中還是有些收獲的,特記錄如下。

作為一個調試器,應該支持一些最簡單而又常用的功能,比如:單步跟蹤、輸出調試信息、設置斷點等。要探索如何實現Lua調試器,還是帶著這些問題去找答案吧。本文使用的開發環境為:win7,lua 5.1.4源代碼。

1、Lua虛擬機是如何暫停的?

Lua虛擬機和普通的CPU一樣,包含兩部分:數據存儲區和邏輯控制區。數據存儲區對應著CPU的寄存器、狀態等,在Lua中實際上就是lua_State。邏輯控制區對應著CPU的每條指令的具體實現。Lua虛擬機邏輯控制區的相關的源代碼位于lvm.c中。其中,執行Lua指令的函數為luaV_execute。

為了方便調試,函數luaV_execute在執行每條Lua指令之前,會去查找是否存在調試鉤子(hook):存在的話,去執行鉤子。然后,判斷Lua虛擬機的狀態是否為暫停,若是的話就返回,而不執行當前Lua指令。若不存在調試鉤子,則正常執行Lua指令。

  1.  if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&  
  2.  (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {  
  3.  traceexec(L, pc); // 內部會執行相應的鉤子函數  
  4.  if (L->status == LUA_YIELD) { // 鉤子函數是否將狀態轉為暫停?  
  5.  L->savedpc = pc - 1;  
  6.  return; // 此處離開函數luaV_execute,導致虛擬機暫停執行  
  7.  }  
  8.  base = L->base;  

由此想到一個辦法可以讓Lua虛擬機暫停:

首先,設置鉤子函數,可以使用函數lua_sethook來實現。通常Lua調試器要支持單步跟蹤,可以使用LUA_MASKLINE類型的鉤子。但是要注意的是,這個鉤子函數會在執行一條Lua指令之前觸發。

然后,鉤子函數中修改Lua虛擬機的狀態。可以使用Lua的C函數API lua_yield。該函數只是簡單的Lua虛擬機的狀態設置為LUA_YIELD,這樣可以保證在執行指令之前退出。

2、Lua虛擬機是如何繼續執行的?

了解了Lua虛擬機是如何暫停之后,就很容易看到,可以采用如下步驟:首先,將Lua虛擬機的狀態設置為0(正常狀態),然后執行函數luaV_execute即可。這兩步操作可以采用Lua的C函數lua_resume即可。

3、Lua調試器的其它功能該如何實現?

其它的一些功能,比如:獲取Lua虛擬機中的一些信息,這些還是比較容易實現的。因為,一旦Lua虛擬機暫停后,可以通過查找lua_State中的信息來查詢,具體怎么查詢,那就取決于你對lua源代碼的熟悉程度了。反正都在lua_State里面,可以直接獲取的。

4、Lua調試器究竟該怎么實現?

考慮到,調試器可能是命令行版本的,也可能是包含界面的調試器。可以考慮將調試器作為一個庫來實現,然后這個庫提供了一些接口,方便和前臺銜接。一下就是我封裝的一些接口,僅供參考:

  1. ECode luad_init(const char * filename);  
  2. ECode luad_command_step(int * pErr);  
  3. ECode luad_command_go(int * pErr);  
  4. ECode luad_command_bk(int line);  
  5. ECode luad_command_bkinfo(int ** ppBklines, int * pNum);  
  6. int luad_currentline();  
  7. Boolean luad_is_script_ended(); 

這個庫加上前段的命令輸入控制,就很容易做出一個命令行版的Lua調試器了。同理,做界面版的也很容易。下面是我寫的Lua調試器命令行版運行截圖。

詳解如何實現Lua調試器案例

小結:詳解如何實現Lua調試器案例的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: CSDN博客
相關推薦

2011-08-31 16:47:07

Lua調試器

2011-08-31 16:39:06

Lua調試器

2011-08-31 16:51:12

Lua調試器

2011-08-24 11:08:09

Lua

2011-08-25 16:34:27

Lua調試器

2010-03-01 11:06:52

Python 調試器

2020-03-16 10:05:13

EmacsGUDLinux

2011-08-29 15:30:53

JavaMELua

2016-09-27 20:12:33

Android虛擬機Android動態調試

2009-12-14 10:57:34

Ruby調試器

2023-02-28 11:39:55

CMake腳本項目

2010-02-24 09:32:24

Python 調試器

2022-05-23 09:22:20

Go語言調試器Delve

2009-06-23 11:05:05

Mircosoft C

2022-07-22 12:45:39

GNU

2023-03-13 00:21:21

調試器斷點開發者

2011-08-24 15:28:02

Lua編譯器解釋器

2011-02-22 11:07:24

Python

2017-06-28 14:21:22

Linux調試器斷點

2017-04-19 21:35:38

Linux調試器工作原理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲色图综合 | 久久久久久成人 | 欧美男人的天堂 | 国产一级视频在线播放 | 夜夜骑天天干 | 一区二区三区视频在线 | 国产精品夜间视频香蕉 | 9191成人精品久久 | 日韩精品极品视频在线观看免费 | 一区二区在线 | 久久国 | 99精品国产一区二区青青牛奶 | 成人黄色电影免费 | 欧美国产日本一区 | 色性av | 国产精品18久久久久久久 | 午夜精品网站 | 一级毛片色一级 | 亚洲第一成年免费网站 | 国产亚洲精品一区二区三区 | 欧美在线视频一区二区 | 国产乱肥老妇国产一区二 | 国产精品永久免费视频 | 欧美日韩成人影院 | 日韩精品区 | 日韩伦理一区二区 | 超碰97人人人人人蜜桃 | 欧美性猛交一区二区三区精品 | 国产精品一区一区 | 欧美日韩亚洲一区 | 国产一区二区三区在线看 | 色橹橹欧美在线观看视频高清 | 久在线 | 在线观看成人 | 91中文视频 | 国产精品久久久久久久久久东京 | 国产视频一区在线观看 | 超碰97免费在线 | 亚洲bt 欧美bt 日本bt | 亚洲免费在线观看 | 国产亚洲精品久久情网 |