debug.traceback如何获取其信息?

时间:2018-09-02 20:59:10

标签: lua

使用Lua演示页面上的以下代码,我试图获取被调用的函数的名称。

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的返回值中提取出来?

2 个答案:

答案 0 :(得分:2)

debug.getinfodebug.traceback从各种来源获得他们的信息,其中一些来源很骇人。例如,函数名称通常是从调用函数的源代码中提取的:无论用于查找其所调用对象的代码名称是什么,都将用作名称。 (这就是为什么您的第二个代码片段没有给您命名的原因:pcall没有备份Lua字节码,因此除非中间有一个函数可以调用它,否则它不会告诉您“测试” Lua函数没有固有名称,与Lua整数没有的不同。函数只是另一种值,可以通过某种语法糖将其自动分配给变量。

答案 1 :(得分:1)

函数是值。值没有名称。

未像某些其他语言一样“声明”功能。在评估函数定义时会创建一个函数值。

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