debug.traceback 如何获取其信息?

使用 Lua demo 页面上的以下代码,我试图获得被 pcall 调用的函数的名称。

function test()
    local info = debug.getinfo(1);

    for k, v in pairs(info) do
        print(k, v);
    end;
end;

pcall(function()
    test();
end);

这是成功的,因为我收到了以下输出,包含名称:

source  =input
func    function: 0x25a1830
nparams 0
short_src   input
isvararg    false
name    test
namewhat    global
istailcall  false
linedefined 1
lastlinedefined 7
nups    1
currentline 2
what    Lua

如果我将代码更改为以下内容,则不再获得该信息:

function test()
    local info = debug.getinfo(1);

    for k, v in pairs(info) do
        print(k, v);
    end;
end;

pcall(test);

输出如下:

func    function: 0x21ee790
linedefined 1
nups    1
short_src   input
namewhat
lastlinedefined 7
isvararg    false
istailcall  false
what    Lua
source  =input
currentline 2
nparams 0

但是,如果我将代码更改为以下内容,则可以获取传递给 pcall 的函数的名称:

function test()
    local traceback = debug.traceback();

    print(traceback);
end;

pcall(test);

输出如下:

stack traceback:
    input:2: in function 'test'
    [C]: in function 'pcall'
    input:7: in main chunk
    [C]: in function 'pcall'
    demo.lua:49: in main chunk
    [C]: in ?

debug.traceback 如何获取这些额外信息?在仅使用 Lua 的情况下,是否有一种方法可以获得它而无需从 debug.traceback 的返回值中提取它?

点赞
用户787480
用户787480

debug.getinfodebug.traceback 从各种来源获取它们的信息,其中一些方式很 hacky。例如,函数名通常从调用函数的源代码中提取出来:无论代码用什么名称来查找它所调用的函数,都会使用该名称作为名称。(这就是为什么你的第二个代码片段没有给你名称的原因:pcall 没有 Lua 字节码支持它,因此它不能告诉你 "test",除非有一个在它前面调用它的函数叫做 "test"。)Lua 函数没有固有的名称,就像 Lua 整数一样;函数只是另一种类型的值,可以通过一些语法糖自动分配给变量。

2018-09-02 21:15:29
用户2226988
用户2226988

函数就是值。值没有名称。

函数并不像其他语言中一样“声明”。当函数定义被求值时,函数值被创建。

调试输出只是在简单情况下试图通过给出调用函数值与变量相关联的名称来提供帮助。

2018-09-07 23:36:32