博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua2.4 参考手册(五)
阅读量:6378 次
发布时间:2019-06-23

本文共 2382 字,大约阅读时间需要 7 分钟。

  hot3.png

(接上篇)

--------------------------------------
7 调试接口
--------------------------------------
Lua 没有内置的调试功能。而是借助于函数和钩子(hook)提供了一个特殊接口,可以用来构建不同种类的调试器,分析器(profile)和一些其它的需要解释器内部信息的工具。这个接口在 luadebug.h 文件中声明。
-------------------
7.1 栈和函数信息
-------------------
获得解释器栈信息的主要函数是:
lua_Function lua_stackedfunction (int level);
它返回一个句柄(lua_Function),该句柄指向一个在给定层级(level)上正在运行的函数。0 级是正在运行的函数,层级 n+1 是调用层级 n 的函数。当用一个高于的深度的层级调用时,lua_stackedfunction 返回 LUA_NOOBJECT。
类型 lua_Function 只是 lua_Object 的另一名字。然而,在这个库中,一个 lua_Function 可以用在需要 lua_Object 的任何地方, lua_Function 接收的参数只处理 lua_stackedfunction 的返回。
另外三个函数提供函数的额外的信息:
void lua_funcinfo (lua_Object func, char **filename, int *linedefined);
int lua_currentline (lua_Function func);
char *lua_getobjname (lua_Object o, char **name);
lua_funcinfo 给出给定的已经定义函数文件名和行号。如果函数是在主模块中的代码,linedefined 是 0。如果函数是 C 函数, linedefined 是 -1,文件名是 "(C)"。
lua_currentline 给出当前正在执行的函数的行号。它只在函数在预编译时带调试选项(参见 4.8 节)时有效。如果没有可用的行信息,它返回 -1。
lua_getobjname 试图为给定函数找个合理的名字。因为函数在 Lua 中是第一类值,它们没有固定的名字。一些函数可能是很多全局变量的值,而另一些则可能只保存在表的字段中。函数 lua_getobjname 首先检查给定的函数是否是一个 fallback。如果是,它返回 "fallback" 字符串,并且把名字设置为指向的回退函数名字。否则,如果给定的函数是一个全局变量 lua_getobjname 返回 "global" 字符串,并且名字指向变量名。如果给定的函数不是 fallback 或者全局变量,lua_getobjname 返回空字符串,并且名字设置为 NULL。
-------------------
7.2 局部变量的操作
-------------------
下面的函数可以用来操作活动记录上的局部变量。它们只在预编译时带调试信息的情况下工作(参见 4.8 节)。
lua_Object lua_getlocal (lua_Function func, int local_number, char **name);
int lua_setlocal (lua_Function func, int local_number);
第一个函数返回局部变量的值,并且设置名字为指向的局部变量名。local_number 是局部变量的索引。第一个参数索引为 1,依此类推,直到最后一个活动的局部变量。当用一个大于活动局部变量个数的 local_number 值调用时,或者活动记录没有调试信息时,lua_getlocal 返回 LUA_NOOBJECT。
函数 lua_setlocal 用先前压栈的值(参见 5.2 节)设置局部变量 local_number 。如果函数成功则返回 1。如果 local_number 大于活动的局部变量个数,或者活动记录没有调试信息,函数出错并返回 0。
-------------------
7.3 钩子 (Hooks)
-------------------
Lua 解释器为调试提供了两个钩子。
typedef void (*lua_CHFunction) (lua_Function func, char *file, int line);
extern lua_CHFunction lua_callhook;
typedef void (*lua_LHFunction) (int line);
extern lua_LHFunction lua_linehook;
解释器进入或者离开一个函数时会调用第一个。当进入一个函数,它的参数是一个到函数活动记录的句柄,以及函数被定义的文件和行号(同样的信息也由 lua_funcinfo 提供);当退出一个函数的时候,func 是 LUA_NOOBJECT, file 是 "(return)", line 是 0。
解释器每次改变正在执行的代码的行号的时候会调用第二个。它唯一的参数是行号(同样的信息也由 lua_currentline(lua_stackedfunction(0)) 调用提供)。第二个钩子只在活动的函数在预编译时包含调试信息(参见 4.8 节)时会被调用。
钩子是无效的如果它的值为 NULL(0) ,NULL 也是两个钩子的默认值。
(未完待续)

转载于:https://my.oschina.net/xhan/blog/323739

你可能感兴趣的文章
数据科学挑战重重 get新技能成当务之急
查看>>
未来信息安全咨询市场总值将达到261.5亿美元
查看>>
Facebook的秘密,如何靠正确的增长指标杀出重围?
查看>>
360公司总裁齐向东:协调联动已经成为了网络安全的标配
查看>>
历史新高:硅太阳能电池光电转换率首超26%
查看>>
智慧城市走出概念将成现实 2016重点研发项目启动
查看>>
如何学习开源框架
查看>>
仪电电子“结盟”复旦大数据学院
查看>>
Nedap Velos RFID智能化母猪群养管理系统 可提高猪场效益
查看>>
Selenium Webdriver系列教程(2)—浏览器的简单操作
查看>>
WinRT重生!Win10S应用将破千
查看>>
AWS中国(北京)区域正式商用 将由光环新网负责运营
查看>>
追赶三星 东芝斥资再建3D NAND闪存工厂
查看>>
Java 8中10个不易察觉的错误
查看>>
51Testing专访陈晔:畅谈移动互联网测试
查看>>
FBI曾悬赏300万抓“CTB-Locker”勒索病毒制造者
查看>>
可再生能源补贴捉襟见肘 绿证如何化解?
查看>>
日本社交软件Line上调IPO定价 估值两年缩水近半
查看>>
力推农业电商大数据共享开放
查看>>
首届中国通信网络优化高级研讨会在京成功举行
查看>>