首页 > 代码库 > Lua2.4 参考手册(五)

Lua2.4 参考手册(五)

(接上篇)
--------------------------------------
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 也是两个钩子的默认值。
(未完待续)

Lua2.4 参考手册(五)