#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.