解析关于Lua调试器案例实现

移动开发 iOS
作为一个调试器,应该支持一些最简单而又常用的功能,比如:单步跟踪、输出调试信息、设置断点等。要探索如何实现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指令。

  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调试器案例实现的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-24 16:41:38

lua调试器

2011-08-31 16:39:06

Lua调试器

2011-08-24 11:08:09

Lua

2011-08-31 16:51:12

Lua调试器

2011-08-25 16:34:27

Lua调试器

2010-03-01 11:06:52

Python 调试器

2020-03-16 10:05:13

EmacsGUDLinux

2016-09-27 20:12:33

Android虚拟机Android动态调试

2009-12-14 10:57:34

Ruby调试器

2023-02-28 11:39:55

CMake脚本项目

2009-06-23 11:05:05

Mircosoft C

2011-08-29 16:48:50

Lua配置文件C++

2022-05-23 09:22:20

Go语言调试器Delve

2010-02-24 09:32:24

Python 调试器

2023-03-13 00:21:21

调试器断点开发者

2022-07-22 12:45:39

GNU

2011-08-29 16:37:21

Lua协同线程

2017-04-19 21:35:38

Linux调试器工作原理

2011-02-22 11:07:24

Python

2017-06-28 14:21:22

Linux调试器断点
点赞
收藏

51CTO技术栈公众号