AndroidФорумПрограммирование

Проблемы с Lua на архитектуре x86

#0
19:15, 24 мар 2014

Здравствуйте! Уже довольно давно я начал использовать Lua в своих Android проектах, и вроде бы все шло хорошо, пока мне не захотелось протестировать приложение на x86 архитектуре. И тут начались глюки. При чём проблема очень специфична: выполнение скрипта внезапно прекращается после использования любой c-функции, переданной туда(при этом сама функция успешно выполняется), абсолютно никаких ошибок не возникает, lua_pcall выдает 0, в стеке тоже все в порядке, а скрипт вылетает! От чего это может быть, как исправить?

#1
21:56, 24 мар 2014

Конвенция правильно выставлена?

#2
13:11, 25 мар 2014

TarasB
> Конвенция
Какая еще конвенция?

#3
13:35, 25 мар 2014

kroonk
Конвенция вызова: __stdcall, __cdecl, __thiscall, __fastcall и т.д.

#4
14:27, 25 мар 2014

ну сделал так:

int __cdecl function(lua_State* state);

результат тот же.

#5
15:58, 25 мар 2014

kroonk
у меня отлично работает Lua на Android/IOS/Mac OS X/Windows
Тестовый проект напиши для начала самый простой вызов функции и изменения переменной. И смотри что не так.

#6
11:09, 26 мар 2014

В общем выяснилось, что это я наговнокодил. Суть в том, что в этих c-функциях нужно было получить строку из стека, для получения значения из стека у меня есть специальный метод, имеющий такой вид:

getValue(int n, int type, void* data)

Так вот чтобы получить строку я делал так:

char str[64];
script->getValue(-1, LUA_TSTRING, &str[0]);

А в методе было следующее:

strcpy((char*)data, (const char*)lua_tostring(state, n));

заменил таким образом:

char *str = new char[64];
script->getValue(-1, LUA_TSTRING, str);
...
delete[] str;

и все заработало.

#7
11:44, 26 мар 2014

kroonk
> и все заработало.
Поменял шило на мыло.
Ты просто вместо стека стал рушить кучу.

#8
12:14, 26 мар 2014

RPGman
> Ты просто вместо стека стал рушить кучу.
Ну пока больше ничего не рухнуло.
А вообще, что ты тогда предлагаешь?

#9
12:33, 26 мар 2014

kroonk
> А вообще, что ты тогда предлагаешь?

Более чем похоже что за 64 байта вылезла строка, проверяй на это.

#10
12:45, 26 мар 2014

=A=L=X=
> Более чем похоже что за 64 байта вылезла строка, проверяй на это.
Эмм... А как проверить? Ну я вызвал strlen с возвращенной из стека строкой, результат 4 для строки "test", вроде все в порядке, за 64 байта не вылезло, или ты что-то другое имеешь в виду?

#11
13:02, 26 мар 2014

kroonk
> или ты что-то другое имеешь в виду?

именно это. проверяй на длину прежде чем копировать и если больше 64 переходи на strncpy.

#12
13:04, 26 мар 2014

Короче вообще какой-то бред творится, сейчас для теста просто вызвал lua_tostring, без копирования полученной строки и прочих операций, итог - скрипт по прежнему внезапно останавливается, теперь после lua_tostring вызвал usleep(0) и проблем как не бывало! Что происходит то???

#13
13:22, 26 мар 2014

Господи! Какой же я идиот! Только сейчас заметил, что в конце функции забыл поставить return, а компилятор и не жаловался. Все, тема закрыта.

AndroidФорумПрограммирование

Тема в архиве.

Тема закрыта.