1

Тема: Где взять lua5.1.dll? делаем ее на основе qlua.dll

При использовании сторонних библиотек для Lua в QUIK возникает стандартная проблема: надо где-то взять run-time библиотеки Lua, чтобы все это заработало. Как минимум, это файл lua5.1.dll, однако помимо него часто приходится еще разыскивать и run-time библиотеки MS Visual C++ (например, всякие msvcrt80.dll и т.п). Кроме того, хотелось бы запускать скрипты на Lua отдельно от QUIK, что удобно для изучения.

Обычно для всего этого рекомендуют установить пакет Lua для Windows, где все указанное содержится. Хотя и тут часто не все проходит гладко, прыжки с поиском и перекладыванием библиотек почти гарантированы.

Было бы здорово решить обе эти задачи без установки Lua. И это вполне возможно, ведь у нас есть готовая qlua.dll, которая содержит в себе полную реализацию Lua, к ней бы только прицепиться! Кто сам делает [url=https://quik2dde.ru/viewtopic.php?id=18]свои библиотеки на C++ для Lua[/url] – может легко прицепиться к qlua.dll и не зависеть от lua5.1.dll; а вот те, кто использует готовые библиотеки, теперь может воспользоваться готовым рецептом из этого поста. И никакую Lua for Windows теперь можно не устанавливать!

Идея проста: сделать «прокси-dll», которая будет называться lua5.1.dll, будет иметь идентичный с ней интерфейс, но для выполнения всех функций будет обращаться исключительно к qlua.dll.

На мой взгляд, от такой прокси-библиотеки, помимо упрощения развертывания сторонних библиотек, есть еще один плюс. Т.к. в QUIK работа Lua кода возможна как минимум в двух потоках, вся синхронизация содержится в qlua.dll и полностью отсутствует с обычной lua5.1.dll, что наверняка может порождать различные проблемы.

Как происходит работа с Lua-стеком (данными Lua-машины) при использовании обычной lua5.1.dll из поставки Lua, и внешней библиотеки в составе скрипта, запущенного из QUIK (для примера сторонняя библиотека названа wxLua):

https://quik2dde.ru/static-img/47/1img-1.png

Схема, конечно, упрощенная, но важно вот что: qlua.5.1.dll и qlua.dll работают с памятью независимо. Это не страшно в однопоточном приложении, однако в многопоточном наличие синхронизации в qlua.dll нас уже не спасает от «не вовремя» сработавшей процедуры в wxLua одновременно с qlua.dll, если такое срабатывание происходит в разных потоках, что обязательно приведет к несинхронной модификации одной и той же памяти.

Если же мы работаем через прокси-dll, то картинка одновременной работы QUIK и внешней библиотеки получается уже другая, вся работа происходит через qlua.dll:

https://quik2dde.ru/static-img/47/1img-2.png

Архив с бинарными файлами [url=https://quik2dde.ru/static-img/47/lua5.1.dll-cover.bin.zip]скачивать здесь[/url]. Он содержит два файла:

  • lua5.1.dll

  • do_lua.exe

lua5.1.dll предоставляет наружу те же интерфейсы, что и библиотека с тем же названием из поставки Lua, только все вызовы из нее передаются сразу в qlua.dll. Никакого кода кроме загрузки qlua.dll эта прокси-библиотека не содержит.

do_lua.exe небольшая консольная утилита, позволяющая при помощи lua5.1.dll выполнять Lua-скрипты из файлов. Я специально ее сделал, чтобы полностью исключить надобность в пакете «Lua for Windows». Формат запуска простой:

do_lua.exe <имя_файла.lua>

Установка: копируем файлы из архива lua5.1.dll и do_lua.exe в папку с установленным QUIK - и все. Это обеспечивает, во-первых, среду для выполнения сторонних библиотек, зависящих от lua5.1.dll, во-вторых, позволяет запускать произвольные Lua-скрипты, причем выполняться они будут с использованием qlua.dll! Теперь-то уж точно можно будет проверить: кривая там реализация или нет.

Кому интересно как это сделано – смотрят следующий пост.

Еще раз ссылка: [url=https://quik2dde.ru/static-img/47/lua5.1.dll-cover.bin.zip]скачать архив с бинарными файлами lua5.1.dll и do_lua.exe[/url].

2

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Идея изготовления прокси-dll простая: заэкспортировать из нее все те же функции, что в оригинальной lua5.1.dll, при этом, поскольку каждая из «торчащих наружу» функций ничего содержательного делать не должна – достаточно, чтобы каждая из них просто делала JMP на соответствующую функции в qlua.dll.

Схематично покажу и поясню код на основе проксирования только одной функции lua_pcall, т.к. все функции сделаны по единому шаблону. (Код здесь несколько упрощаю, убрав проверку на ошибки; полный код в [url=https://quik2dde.ru/static-img/47/lua5.1.dll-cover.src.zip]приложенном архиве с исходниками[/url].)

Для каждой экспортируемой функции глобально определена переменная, в которую загружается полученный адрес соответствующей функции из qlua.dll (здесь это переменная pFunc_lua_pcall).

FARPROC pFunc_lua_pcall;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
        const HMODULE hDll = LoadLibrary("qlua.dll");
        pFunc_lua_pcall = GetProcAddress(hDll, "lua_pcall");
}

Сама экспортируемая «прокси-функция» выглядит следующим образом:

extern "C" __declspec(dllexport) __declspec(naked) void lua_pcall()
{
        _asm {
                push pFunc_lua_pcall
                ret
        }
}

Т.к. надо всего лишь сделать переход по адресу оригинальной функции в qlua.dll (JUMP или JMP) и анализ аргументов не требуется – прототип в части входных/выходных параметров можно сделать любым. Для простоты я написал void.
Конструкция extern "C" __declspec(dllexport) нужна для экспорта функции из dll, а директива __declspec(naked) добавлена для того, чтобы исключить обычно вставляемый компилятором пролог и эпилог функции, т.к. их наличие будет портить нам стек; в результате такой декларации получаем, что прокси-функция содержит буквально указанный ассемблерный код и ничего более. Ну а внутри нее простым трюком "поместить значение переменной (адрес) в стек и сделать переход по адресу на вершине стека" производится фактически безусловный переход на сохраненный в переменной адрес, указывающий на соответствующую функцию в qlua.dll.

Чтобы вставить все нужные функции я, при помощи программы depends, получил список всех функций, которые экспортируются из lua5.1.dll и сделал небольшой скрипт (на Lua, разумеется), который по подготовленному шаблону генерирует идентичный код на C++ для всех функций и переменных.
Надо отметить, что, как оказалось, из qlua.dll не экспортируется несколько функций, которые есть в qlua.dll. Перед такими функциями в списке стоит символ #, скрипт при генерации такие строки пропускает.

[url=https://quik2dde.ru/static-img/47/lua5.1.dll-cover.src.zip]Скачать zip-архив с исходниками[/url].

3

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

---------------------------------------------------------------------------

Вместе с терминалом QUIK начиная с версии 6.6 штатно стала поставляться "прокси" библиотека lua5.1.dll, функционально аналогичная той, что была предложена в этой ветке.
В связи  с чем предложенное здесь решение потеряло актуальность, используем штатное решение.

(Поставляемая в терминалом lua5.1.dll - это именно "прокси" в qlua.dll, что правильно для корректного использования сторонних библиотек.)

---------------------------------------------------------------------------

4 (2013-05-20 18:23:31 отредактировано naquad)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

я положил файлы lua5.1.dll и do_lua.exe в каталог с Quik Junior. всё хорошо, пока не доходит до загрузки сторонних библиотек... собственно зачем всё это и затевалось. на попытку загрузить bit.dll я получаю:

Точка входа в процедуру luaD_growstack не найдена в библиотеке DLL lua5.1.dll

так на всё. от socket до iup и wx.

как с этим бороться?

UPD: попытка пересборки библиотеки из исходника с учётом функции luaD_growstack успехом не увенчалась, т.к. сама qlua.dll не содержит такой функции :\

UPD: заглушка на luaD_growstack помогла. теперь другая проблема: luaF_newproto. но тут уже заглушка не поможет.

Кому-то вообще удавалось заставить работать сторонние библиотеки напрямую с QLua рантаймом? Мне кажется, что разработчики Quik умудрились не только написать ужасную программу в стиле индийского кода, но ещё и поломать Lua hmm

5

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Хм, такие функции действительно не экспортируются из qlua.dll, правда и используют их далеко не все внешние библиотеки. Хотя из lua5.1.dll действительно экспортируются.
Наверное есть смысл написать на форум ARQA чтобы добавили экспорт этих функций.

6

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Кому-то вообще удавалось заставить работать сторонние библиотеки напрямую с QLua рантаймом? Мне кажется, что разработчики Quik умудрились не только написать ужасную программу в стиле индийского кода, но ещё и поломать Lua hmm

Начиная с версии терминала 6.6 все необходимые функции экспортируются из qlua.dll
Поэтому есть два решения:
1. сделать из qlua.dll lib-файл и собрать свой проект с ним.
2. скопировать qlua.dll в lua5.1.dll и положить рядом ее рядом с вашим модулем.

кстати, а что не так с "индийским кодом"?

7

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

naquad,
кстати, а где вы взяли файл bit.dll ?
В архиве поставки от ARQA есть такой файл (архив с примерами), и библиотека bit.dll из той поставки не просит указанных вами функций.
Другое дело, что она подключается не к lua5.1.dll, а к lua51.dll (ну так собрана)
Это в общем-то эквивалентно о всех отношениях, просто откопировать еще раз прокси файл lua5.1.dll, назвав его lua51.dll.
Проверьте, пожалуйста, какой библиотекой пользуется имеющийся у вас файл bit.dll и напишите где вы его взяли. Любопытно.

8

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

mbul
нет, не экспортируются, смотрите моё письмо.
с индийским кодом всё так, только работает раз через два.

admin
bit.dll из поставки LuaForWindows. как и IUP, который тоже валится.
у меня qlua.dll в данный момент скопирован как: lua.dll, lua5.1.dll, lua5.dll и lua51.dll.

сейчас хочу пальнуть по комарам из пушки: сделать RPC сервер для Quik на Lua.
судя по коду luasocket, проблем с многопоточностью возникнуть не должно, так что runtime можно подхватить и родной, из LuaForWindows + пара плюшек типа шифрования (luasec) и авторизации. я так полагаю, что если рулить этим всем из main, организовав очередь сообщений, то будет работать нормально.

9

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

меня qlua.dll в данный момент скопирован как: lua.dll, lua5.1.dll, lua5.dll и lua51.dll.

Здесь ваша ошибка, считаю. С разными именами надо раскопировать прокси-dll из этого поста, а не qlua.dll, т.к. копирование нескольких экземпляров qlua.dll ничего полезного не дает совершенно. С тем же успехом можно стандартную lua51.dll скопировать (получив при этом все доступные в ней экспортруемые функции).

bit.dll из поставки LuaForWindows

Можно поточнее сылку и версию LuaForWindows? тем версиям, которые я видел, хватало экспортируемых из qlua.dll функций.

А в остальном - успехов! Буду очень признателен, если продолжите делиться здесь результатами (в этой ветке или отдельной).

10

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

admin пишет:

Здесь ваша ошибка, считаю. С разными именами надо раскопировать прокси-dll из этого поста, а не qlua.dll, т.к. копирование нескольких экземпляров qlua.dll ничего полезного не дает совершенно. С тем же успехом можно стандартную lua51.dll скопировать (получив при этом все доступные в ней экспортруемые функции).

от этого, к сожалению, нужные функции не появятся, тем более что мне не столько bit.dll нужен, сколько iuplua.dll,
который как раз таки эти функции требует

admin пишет:

Можно поточнее сылку и версию LuaForWindows? тем версиям, которые я видел, хватало экспортируемых из qlua.dll функций.

[url=https://code.google.com/p/luaforwindows/downloads/detail?name=LuaForWindows_v5.1.4-46.exe]5.1.4-46[/url]

admin пишет:

А в остальном - успехов! Буду очень признателен, если продолжите делиться здесь результатами (в этой ветке или отдельной).

вкратце: заработало. приём-поставновка ордеров работает. немного дурной протокол правда получился,

длина:[опциональный-id-пакета:]json-данные

+ пришлось поизголяться с синхронизацией, т.к. получилась асинхронная программа, но в остальном работает. надо будет пару моментов порефакторить и вообще погонять всё это дело, но пока всё смотрится довольно неплохо.

11

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

naquad,
Скачал и установил указанный вами файл с инсталляшкой Lua версии 5.1.4-46.
В папке clibs после установки есть файлы iuplua51.dll и bit.dll.
Через можно сказать классическую прогу [url=http://www.dependencywalker.com/]Dependency Walker[/url] посмотрел список статически импортируемых ими функций из LUA5.1.DLL. Указанная вами функций luaD_growstack отсутствует в списке импортируемых.

Все же снова возникет вопрос: какими именно версиями iuplua51.dll и bit.dll вы пользуетесь? может вы сами их собрали из исходников, причем какие-то дебажные версии?

12

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

вкратце: заработало. приём-поставновка ордеров работает. немного дурной протокол правда получился,

длина:[опциональный-id-пакета:]json-данные

+ пришлось поизголяться с синхронизацией, т.к. получилась асинхронная программа, но в остальном работает. надо будет пару моментов порефакторить и вообще погонять всё это дело, но пока всё смотрится довольно неплохо.

Я правильно понимаю что все заработало на версии терминала и qlua.dll 6.6.1?

13 (2013-05-30 16:02:00 отредактировано naquad)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

6.6.0, даже 6.5.0 пусть и без таблицы с логами, не тестировал правда толком, но должно работать нормально. единственное что, QLua безбожно течёт. не простояло даже суток, вылетела ошибка о нехватке памяти (виртуалка крутится с 512M RAM). точно известно, что прблема не в в скрипте, т.к. скрипт с генератором событий простоял в 5.1.5 неделю и я не видел никаких проблем.

UPD: похоже ручное пинание garbagecollect() помогло, но ещё не уверен. погоняю - отпишу.

14 (2013-05-30 16:23:54 отредактировано naquad)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

кстати говоря, насколько я понимаю QLua.dll - плагин. есть ли документация по тому как писать такие плагины?

UPD: фиг. никакой документации и вообще "низзя":

Здравствуйте,
Плагины пишутся только нами.
Документации нет, и в ближайшем будущем не планируется, формат полностью закрыт.

от так от. "мыши кололись, плакали, но всё равно продолжали жрать кактус..."

15 (2013-05-30 19:16:47 отредактировано admin)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Судя по давно предпринятым ковыряниям одного известного пользователя QUIK, так его назовем, все что можно в плагине - можно теперь на Lua делать: все события, отправка заявок и т.д. Фактически скриптовая среда для плагинов, на сколько я понимаю. Только со взаиможействием с GUI QUIK туго очень-очень. Но и сюда, как видим, есть явные подвижки.

А что с экспортируемыми/импортируемыми функциями?

16 (2013-05-31 00:01:56 отредактировано naquad)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

admin пишет:

Судя по давно предпринятым ковыряниям одного известного пользователя QUIK, так его назовем, все что можно в плагине - можно теперь на Lua делать: все события, отправка заявок и т.д. Фактически скриптовая среда для плагинов, на сколько я понимаю. Только со взаиможействием с GUI QUIK туго очень-очень. Но и сюда, как видим, есть явные подвижки.

не-а, нету, попробуйте скриптово добавить инструмент (API для этого просто нет). или отправить заявку любого типа. мне кажется что ARQA самое время задуматься над тем чтобы принять на работу авторов QL.lua, которая делает из их чересчур низкоуровневого API (см. sendTransaction) хоть что-то с чем можно работать. Добавьте к этому отсутствие родного UI...

+ к тому в данный момент я не могу сказать что состояние среды разработки под Quik на Lua хотябы удовлетворительное (2 горы косяков, числа и строки просто не отличаются: getQuoteLevel2 возвращает СТРОКИ, а по документации должны быть числа; течёт. вызываешь collectgarbage - не течёт, но виснет, и т.д.).

Как бывший фанат Forex'a говорю: Quik ужасная поделка против того же Metatrader 4/5 + MQL на порядок грамотней. Какие бы "сподвижки" у Quik'a не были, он так и останется локальной поделкой.

Из биржевых,  мне ещё Transaq понравился, довольно интересная штука, вот только в Украине его никто не предоставляет sad

admin пишет:

А что с экспортируемыми/импортируемыми функциями?

а ничего. Версия, о которой говорил mbul мне так и не пришла, техсап игнорирует мои запросы, зато на другие вопросы отвечает нормально.

Итог сей истории: "маем тэ шо маем" или боремся вместо того чтобы работать. Печально что украинские площадки предоставляют только Quik и ничего другого, есть, конечно, Univer, но они хотят каких-то странных денег за подключение Plaza II, так что как вариант даже не рассматриваются.

Вроде бы как проблемы починены у Stock#, но какие-то лицензии, огромное API, всё под Windows, ... нехорошо это всё, поэтому и была задумка сделать на Lua.

17

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

попробуйте скриптово добавить инструмент

В смысле? куда добавить?
А в API-плагинов такая возможность есть?

или отправить заявку любого типа

Какие заявки не отправляются?

а ничего.

Что значит "ничего"?
Вы так и не ответили предметно на вопрос: где вы взяли версии dll-библиотек, которые импортируют luaD_growstack. Вы писали, что это bit.dll и библиотеки из состава iup, но как-то не нахожу я этому подтверждение.
Вот и хотелось бы понять как же так, что я делаю не так, как говорится? если этн - станет понятно можно ли это исправить своими усилиями, или будем совместно пинать ARQA.
Просто эмоции - он бесполезны.

18

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

admin пишет:

В смысле? куда добавить?
А в API-плагинов такая возможность есть?

В том-то и дело, что нет.

admin пишет:

Какие заявки не отправляются?

все отправляются, только функция sendTrasnaction настолько низкоуровневая,
что без QL.lua с ней работать адски неудобно.

admin пишет:

Что значит "ничего"?
Вы так и не ответили предметно на вопрос: где вы взяли версии dll-библиотек, которые импортируют luaD_growstack. Вы писали, что это bit.dll и библиотеки из состава iup, но как-то не нахожу я этому подтверждение.
Вот и хотелось бы понять как же так, что я делаю не так, как говорится? если этн - станет понятно можно ли это исправить своими усилиями, или будем совместно пинать ARQA.
Просто эмоции - он бесполезны.

Предметно: я вам уже дал ссылку на LuaForWindows, после установки которого в папке <куда поставили LuaForWindows>\5.1\clibs вы найдёте тот самый bit.dll, который я пытаюсь подгрузить. Из состава iup она просто не могла быть по логике вещей, т.к. iup - библиотека.

Код всего скрипта был отправлен в саппорт, который говорит что у меня руки кривые и их не смущает что скрипт в обычном интерпретаторе работает более чем нормально: без утечек, без падений, без зависаний. Плюс к тому если скрипт в Quik вызывает collectgarbage(), то он не течет, но в конечном итоге виснет или валится с ошибкой.

Мне обещали прислать Quik 6.6.1, где он будет работать кроме quik.ru - даже не знаю, но попробую, может и поможет.

mbul так же обещал посмотреть на скрипт более основательно, но я сомневаюсь, что он найдёт в нем ошибку. Логика там простая как таз. Если бы хоть что-то там глючило, то оно бы глючило и в интерпретаторе + сразу было видно.

Исходя из того, что сам по себе QLua начал соответствовать нормальному интерпретатору Lua только в не выпущенной ещё версии 6.6.1, выводы получаются такие:

  • QLua не отлажена.

  • Никто толком её не использовал.

  • Работает нестабильно. QLua скрипты приводят к падениям, зависаниям, утечкам памяти.

  • Всё вышеуказанное самостоятельно исправить невозможно. Только ARQA, только ждать, только доказывать, что не скрипт виноват.

Я сначала попытался поработать с Quik через DDE. Это был страх и ужас. На первых порах QLua казалась решением всех проблем, но похоже что теперь вместо одной проблемы - реализация торговой стратегии - у меня их две: реализовать торговую стратегию и каким-то образом заставить QLua работать...

Подход того же Transaq: вот вам DLL и бодайтесь с ней как хотите. Всё. Никаких DDE, никаких настроек GUI, никаких вылетов, никаких проблем с автологином или перезапуском в случае ошибки. Просто как дверь и надёжно как лом.

Без обид, но я не понимаю как софт столь низкого качества, использующий прадревние технологии, которые даже Microsoft не рекомендует использовать и не называет его иначе как "legacy" (это я про DDE), вобще смог стать доминирующим на рынке? Трейдер, с которым я работаю, тоже совершенно не в восторге от Quik'a. UX Quik'a - то ещё счастье. ARQA приплачивает площадкам? Я негодую.

19

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Код всего скрипта был отправлен в саппорт, который говорит что у меня руки кривые и их не смущает что скрипт в обычном интерпретаторе работает более чем нормально: без утечек, без падений, без зависаний. Плюс к тому если скрипт в Quik вызывает collectgarbage(), то он не течет, но в конечном итоге виснет или валится с ошибкой.

Если уж по честному, то в запуск кода в Lua.exe и в квик две большие разницы. В первом случае код никаких данных не получает и не обрабатывает.
Речь идет не просто об утечках. При подключении к боевому потоку скрипт за 5 минут отъедает 4Гб памяти. Понятно что я могу получить на порядок больше данных для тестов, но тем  не менее на утечку это не похоже. Если бы была такая адская дыра, то мы бы об этом знали.
Что бы смотреть на скрипт основательно в нем надо разбираться, тем более что куча логики скрыта в dll, пока времени на это нет. Из стандартных рекомендаций - отключаете весь функционал, подключаете поочереди и смотрите когда начнет течь память.

Исходя из того, что сам по себе QLua начал соответствовать нормальному интерпретатору Lua только в не выпущенной ещё версии 6.6.1, выводы получаются такие:
QLua не отлажена.
Никто толком её не использовал.
Работает нестабильно. QLua скрипты приводят к падениям, зависаниям, утечкам памяти.
Всё вышеуказанное самостоятельно исправить невозможно. Только ARQA, только ждать, только доказывать, что не скрипт виноват.

Начиная с версии 6.6.1 qlua стала наружу экспортировать АБСОЛЮТНО все функции Lua. Именно с целью поддержать пользователей при использовании своих dll.
Если Вы не знаете, то это не значит что никто ее не использует. Скрипты приводят к падениям, зависаниям и утечкам только в случае внешних модулей. Других случаев нами не  зарегистрировано.
Еще хочу сказать что проект в общем молодой и находится в начале своего пути. Мы очень хотели бы развить его до нормального уровня, и поэтому мы никогда не отмахиваемся от проблем пользователей и готовы к диалогу и сотрудничеству.

20 (2013-06-01 13:01:11 отредактировано naquad)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

mbul пишет:

Если уж по честному, то в запуск кода в Lua.exe и в квик две большие разницы. В первом случае код никаких данных не получает и не обрабатывает.

Это-то как раз понятно. Просто с моей стороны, единственное, что я могу сделать - погонять всё в нативном Lua, показав, таким образом, что проблемы в самом скрипте нет.

mbul пишет:

Речь идет не просто об утечках. При подключении к боевому потоку скрипт за 5 минут отъедает 4Гб памяти. Понятно что я могу получить на порядок больше данных для тестов, но тем  не менее на утечку это не похоже. Если бы была такая адская дыра, то мы бы об этом знали.

Всё-таки попробую с Quik 6.6.1, возможно каким-то необъяснимым образом из-за двух рантаймов (DLL'ка подымает родной lua5.1.dll у меня) оно и течёт.

mbul пишет:

Что бы смотреть на скрипт основательно в нем надо разбираться, тем более что куча логики скрыта в dll, пока времени на это нет. Из стандартных рекомендаций - отключаете весь функционал, подключаете поочереди и смотрите когда начнет течь память.

Последняя модификация - подгружать auth (require'ит lfs и md5) и ssl только в случае их включения, так что единственное, что остаётся - socket/core.dll, bit.dll. Я попробую их убрать. У вас без клиентов отрабатывает только код в remoteq.lua, больше ничего. Ни парсер протокола, ни очередь сообщений отправки, ни SSL (вырублен в конфиге), ни авторизация (тоже вырублена в конфиге), ни конвертация кодировок, ничего.

mbul пишет:

Если Вы не знаете, то это не значит что никто ее не использует.

Пусть и немного, но сообщения о просьбах помочь разобраться или формата "что же делать и как же быть?" до сети доходят, а гугл показывает очень малое количество результатов по "quik qlua", которые не просто новости, а форумы, сообщения, заметки, статьи...

mbul пишет:

Еще хочу сказать что проект в общем молодой и находится в начале своего пути. Мы очень хотели бы развить его до нормального уровня, и поэтому мы никогда не отмахиваемся от проблем пользователей и готовы к диалогу и сотрудничеству.

Ну и на том спасибо. Всё-таки столько времени уже угрохал, обидно будет, если не заведётся.

Мне ещё не даёт покоя collectgarbage() - если оно помогает, то скорее всего проблема-таки не в DLL.

В любом случае, я попробую в понедельник (сейчас данных - ноль, вроде растёт, но непонятно) поубирать вообще все библиотеки: заменить select на sleep, убрать создание socket'a. Если и тогда будет течь, то тогда проблема 100% в QLua.

P.S. Отдельная библиотека для связи с сервером без запуска Quik'a, я так понимаю, в ближайшем обозримом будущем не планируется?

21

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Хотелось бы вернуться к luaD_growstack

naquad:

Предметно: я вам уже дал ссылку на LuaForWindows, после установки которого в папке <куда поставили LuaForWindows>\5.1\clibs вы найдёте тот самый bit.dll, который я пытаюсь подгрузить.

Предметно что я сделал:
1) Откопировал всю папку с чистым QUIK (у меня версия 6.6.0.118), чтобы точно все проверить.
2) В эту папку с QUIK из [url=https://quik2dde.ru/static-img/47/lua5.1.dll-cover.bin.zip]архива с бинарными файлами из самого первого сообщения этой ветки[/url] скопировал файл lua5.1.dll, который, как известно, прокси к qlua.dll
3) В эту же папку с QUIK скопировал файл bit.dll из указанного вами архива Lua версии 5.1.4-46.
4) Т.к. bit.dll залинкована с файлом с именем lua51.dll (это видно, если открыть его в [url=http://www.dependencywalker.com/]Dependency Walker[/url], я просто скопировал lua5.1.dll в файл с именем lua51.dll. Получилось как бы две прокси-библиотеки к одному "ядру" в qlua.dll
5) Открыл в QUIK вот такой тестовый скрипт и запустил его. Скрипт отработал успешно, вывел 0x00000015 (шестрадцатеричное представление десяточного 21)

local bit = require("bit")
message("0x"..bit.tohex(21), 1)

Собственно вопрос у меня то же самый: при чем тут якобы недостающая фукция luaD_growstack? как видим, она совершенно никому не нужна.

Поверьте, у меня нет ни малейшего желания вас подловить. Мне действительно хотелось бы помочь вам разобраться с проблемой.
Подозреваю штука в том, что библиотеку вы пересобрали, причем в дебажном режиме.
Либо укажите, пождалуйста, отличие ваших действий от моих.

22

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Плюс к тому если скрипт в Quik вызывает collectgarbage(), то он не течет, но в конечном итоге виснет или валится с ошибкой.

Тут, наверное, надо определиться что мы понимаем под термином "течет".
Я понимаю так: память течет, если потребление ее увеличивается, причем безвозвратно впринципе.
Если же память нормально освобождается вызовом collectgarbage(), то это означает лишь, что память никуда не утекла, она вся под контролем, однако Lua самостоятельно по каким-то причинам не занимается сборкой мусора. Впрочем, еще большой вопрос: должна ли Lua автоматически заниматься сборкой мусора (фактически как раз вызывая collectgarbage()).

То, что в момент сборки мусора происходят падения - это, безусловно, плохо. Вот только хорошо бы эти падения воспроизвести на чистой Lua-скрипте, т.к. если вы использвете свои или сторонние dll-библиотеки - то запросто может оказаться, что проблема именно в них. Ну или в их взаимодействии с Lua. Такая вот петрушка.
Если же проблема с памятью будет повторяться на каком-то чистом Lua скрипте (без сторонних библиотек) - самое время будет писать в ARQA, пусть разбираются.

23

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Хм. Действительно, bit.dll загрузился, но iup.dll всё так же не грузится.

[url]http://clip2net.com/s/5a75w3[/url] - загрузка iup.dll.

admin пишет:

Если же память нормально освобождается вызовом collectgarbage(), то это означает лишь, что память никуда не утекла, она вся под контролем, однако Lua самостоятельно по каким-то причинам не занимается сборкой мусора. Впрочем, еще большой вопрос: должна ли Lua автоматически заниматься сборкой мусора (фактически как раз вызывая collectgarbage()).

Должна, безусловно. Иначе бы не называлась языком с автоматическим управлением памяти.

admin пишет:

То, что в момент сборки мусора происходят падения - это, безусловно, плохо. Вот только хорошо бы эти падения воспроизвести на чистой Lua-скрипте,

В том-то и дело, что они не воспроизводятся. Скрипт на родном интерпретаторе работает как часы.

admin пишет:

т.к. если вы использвете свои или сторонние dll-библиотеки - то запросто может оказаться, что проблема именно в них. Ну или в их взаимодействии с Lua. Такая вот петрушка. Если же проблема с памятью будет повторяться на каком-то чистом Lua скрипте (без сторонних библиотек) - самое время будет писать в ARQA, пусть разбираются.

Да, именно до этого договорились с mbul по почте. Завтра утром буду пробовать.
Я отпишу что у нас получилось. + надеюсь получить Quik 6.6.1 в понедельник, с ним тоже попробую.

24 (2013-06-04 20:04:23 отредактировано admin)

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

Свершилось! На QLua.dll от 6.6.1 всё заработало!

Всем спасибо.

UPD: Слегка подробнее.

Таки текло из-за библиотек, на старой версии были выброшены все внешние модули (ssl, socket, bit) и после этого течь перестало. Непонятно как таким образом помогал вызов collectgarbage(), но как-то помогал.

Я пытался так же заставить всё это дело работать с proxy-dll из первого поста. С последней версией из LuaForWindows не завелось со стандартным воплем. Хотя непонятно почему, т.к. вроде бы ни luaD_growstack, ни luaF_newproto не импортируются. Взял версию предыдущую версию и заработало.

Но всё равно текло :\

В конечном итоге, я взял исходники proxy-dll, раскомментировал недостающие функции, собрал, заменил в 6.6.0.118 родную QLua.dll на переименованный lua5.1.dll из того архива что прислал mbul и всё завелось. Не течёт, не падает.

25

Re: Где взять lua5.1.dll? делаем ее на основе qlua.dll

naquad пишет:

В конечном итоге, я взял исходники proxy-dll, раскомментировал недостающие функции, собрал, заменил в 6.6.0.118 родную QLua.dll на переименованный lua5.1.dll

Что на что заменили?!
ниего не понял.