Улучшение Lua сообщений об ошибках - PullRequest
5 голосов
/ 18 июля 2010

Всякий раз, когда возникает ошибка в скрипте Lua, я бы хотел записать значения всех локальных и глобальных переменных на экран /, необязательно, в файл - в дополнение к обычной трассировке стека.

Как я могу сделать так, чтобы это было поведением по умолчанию для всех ошибок?

Ответы [ 4 ]

3 голосов
/ 19 июля 2010

Если вы используете стандартный интерпретатор Lua, замените debug.traceback своей собственной функцией. Если вы встраиваете Lua в свою программу, используйте функцию трассировки в lua_pcall.

2 голосов
/ 03 февраля 2014

Модуль StackTracePlus делает то, что вам нужно, отображая локальные переменные на каждом уровне трассировки стека. Он не сбрасывает всю глобальную таблицу, но это, вероятно, излишне.

Чтобы установить его с LuaRocks, используйте

luarocks install stacktraceplus

Затем в вашем коде выполните:

local STP = require "StackTracePlus"
debug.traceback = STP.stacktrace

В Lua 5.1 это автоматически преобразует все следы стека; для кода Lua 5.2 вам нужно обернуть свой код xpcall, как предлагается в других ответах.

1 голос
/ 21 июля 2010

Более правильным решением было бы использование xpcall вокруг всего вашего кода.

local function myerrhandler ( errobj )
    print(debug.traceback())
    for k,v in pairs(_G) do print("GLOBAL:" , k,v) end
    return false
end

xpcall( function ()
--Your code here
end , myerrhandler )
0 голосов
/ 24 июля 2012

Ваш обработчик ошибок может быть перезаписан.Если вы вызываете Lua из C, чтобы всегда печатать стопку, вы можете подключиться к функции luaG_errormsg .

В lua напишите:

local _HandlingError = 0
function _ErrorHandler ( errobj )
    if( _HandlingError == 0 ) then
        _HandlingError = 1
        local errStr = tostring(errobj) or ""
        if( type(errobj)=='table' ) then
          errStr = "Table: {" .. table.concat(errobj, ',') .. "}"
        end
        print("Error: \"" .. errStr .. "\"")
        --for k,v in pairs(_G) do print("GLOBAL:" , k,v) end
        if( type(errobj)=='thread' ) then
            print(debug.traceback(errobj))
        else
            print(debug.traceback('',2))
        end
        _HandlingError = 0
    end
    return false
end

Тогдав ldebug.c , добавьте к luaG_errormsg после , если (L-> errfunc! = 0)

else
{
    lua_getfield(L, LUA_GLOBALSINDEX, "_ErrorHandler");
    if (!lua_isfunction(L, -1)) {
        lua_pop(L, 1);
    }
    else {
        lua_pushvalue(L, 1);
        lua_call(L, 2, 1);
        lua_pop(L, 1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...