Отсутствуют имена функций в трассировке стека 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), а не имя функции.

Другие вопросы по тегам