Я поддерживаю небольшую утилиту на C, fleetcfg: она загружает Lua-конфиг, возвращающий список хостов, копирует их в HostList, а затем выводит. TCP-проба пока TODO.
Два наблюдения, и я не понимаю, связаны ли они:
С реальным prod-конфигом на 200 хостов в нескольких строках итогового списка пустое имя или странные байты. С тестовым конфигом на 3 хоста такого не бывает. Подозреваю сторону Lua, может быть, то, что
luaL_dofileоставляет на стеке. Вызовlua_gcя практически исключил, потому что вывод был правильным ещё до того, как я его добавил. Но это не подтверждено.С LD_PRELOAD-обёрткой, которая роняет malloc/realloc после N вызовов, сбой внутри
hostlist_pushвыводит "out of memory" и завершается с кодом 1, как и задумано. Но valgrind сообщает "definitely lost", и этот блок растёт вместе с количеством хостов. Я предположил, что очистка Lua что-то пропускает, а остальное покрываетhostlist_free.
valgrind --leak-check=full ./fleetcfg $PWD/prod hosts.lua
В пути моего чекаута есть пробел, и вывод valgrind показался мне странным.
Релевантные фрагменты:
l->items = realloc(l->items, ncap * sizeof(Host));
if (l->items == NULL)
return -1;
const char *name = lua_tostring(L, -2);
...
lua_pop(L, 3);
...
hostlist_push(out, name, port)
С чего бы вы начали смотреть? Не могу обещать, что эти два бага независимы, и под отладчиком я пока ничего не запускал.
