Неописуемые ошибки LuaBridge

#c #lua #compilation #luajit #luabridge

#c #lua #Сборник #luajit #luabridge

Вопрос:

Я использую LuaJIT и LuaBridge для компиляции кода lua и его выполнения. Когда код lua выдает ошибку, это действительно сложно отлаживать — я не знаю, в какой строке это произошло или что вызвало это.

Это пример: [string "1"]:0: bad argument #1 to 'info' (string expected, got table) в коде:

 "function foo(bar)n"
        "   logger:info(bar.moo);" 
  

Как мне перевести [string "1"] в соответствующую строку кода?
Могу ли я получить трассировку стека?

Код lua «компилируется» с выполнением string.dump над текстовым кодом, а затем загружается с помощью luaL_loadbuffer . Псевдокод, который загружает и вызывает функцию lua:

 int result = luaL_loadstring(L, script.c_str());
auto script_function = luabridge::LuaRef::fromStack(L);
auto string_module = luabridge::getGlobal(L, "string");
auto string_dump = string_module["dump"];
auto code = luabridge::LuaRef_cast<std::string>(string_dump(script_function, strip));
luaL_loadbuffer(L, code.data(), code.size(), std::to_string(current_id  ).c_str());
lua_pcall(L, 0, LUA_MULTRET, -1);

auto func_to_call = luabridge::getGlobal(L, "foo");
func_to_call(amp;bar);
  

Комментарии:

1. Как перенести код в Lua?

2. Я извлекаю функцию с помощью getGlobal и вызываю ее auto func_to_call = luabridge::getGlobal(L, "foo"); func_to_call(amp;bar);

3. Но как вы загружаете код в Lua?

4. ах да, я использую string.dump, чтобы «скомпилировать» код lua в байтовый код (не совсем мой код, пропустил его) и загрузить его с luaL_loadbuffer

5. (1) Как вы загрузили исходный код Lua? и (2) как вы вызываете luaL_loadbuffer и (3) почему мне нужно продолжать запрашивать соответствующую информацию?

Ответ №1:

[string "1"] происходит из имени блока, которое вы указали здесь: std::to_string(current_id ).c_str()

Поскольку он не начинается с @, он обрабатывается как строка, которая была загружена, отсюда и [string ""] синтаксис. Если вы хотите, чтобы сообщение об ошибке рассматривалось как имя файла, поставьте @ перед именем файла.

И я подозреваю, что причина номера строки равна 0, потому что вы сказали Lua удалить номера строк, установив для «strip» значение true.