Отсутствуют имена функций в трассировке стека Lua
Я пытаюсь улучшить обработку ошибок в моей программе, которая запускает скрипт Lua. Упрощенная версия:
function _errH(msg)
print(msg .. "\n" .. debug.traceback(nil, 1))
end
function _main()
-- cause some random error
print(a-2)
end
function main()
xpcall(_main, errH)
end
main()
Дает мне следующий стек вызовов (пожалуйста, игнорируйте неправильные номера строк):
stack traceback:
[string ""]:7428: in function '__sub'
[string ""]:7651: in function <[string ""]:7432>
[C]: in function 'xpcall'
[string ""]:7658: in function 'main'
[string ""]:7928: in main chunk
Теперь мне интересно, почему есть [string ""]
везде.
Есть ли способ повлиять на эти пропущенные тексты? Нужно ли называть функции в дополнение к их определению? Почему я вижу in function '__sub'
но нет in function '_main'
например?
2 ответа
Как правило, вы можете назначить имя чанка при загрузке. Использование вспомогательной функции lua_load
и большинство установит имя чанка в зависимости от типа загружаемого контента:
lua_load
принимает имя чанкаluaL_loadfile
будет использовать имя файлаluaL_dofile
использованияluaL_loadfile
luaL_loadstring
будет использовать содержимое строкиluaL_dostring
использованияluaL_loadstring
luaL_loadbuffer
принимает имя чанка
Если вы посмотрите на исходный код luaL_loadstring:
LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
return luaL_loadbuffer(L, s, strlen(s), s);
}
Обратите внимание, что на самом деле это просто удобная функция, которая вызывает luaL_loadbuffer
со строкой в качестве имени чанка. Итак, вам нужно загрузить ваш код из таких строк, как:
luaL_loadbuffer(L, s, strlen(s), "=my_chunk");
куда "=my_chunk"
Имя чанка, который будет отображаться в отладочной информации.
Знак равенства перед именем меняет трассировку обратно:
my_chunk:1: in main chunk
Где пропуск знака равенства покажет:
[string "my_chunk"]:1: in main chunk
Тот [string ""]
происходит от того, как вы загружаете куски в VM. Вы не указали имя файла в качестве аргумента для lua_dofile / lua_loadfile / lua_dostring / lua_loadstring или просто дали пустую строку там.
И обратите внимание, что строка - это имя файла lua (lua chunk), а не имя функции.