Ситуация такова: я впервые в жизни пытаюсь что-то писать под Линукс и очень смутно представляю, что вообще происходит. GObject'ы впервые вижу.
Задача - получать видео с промышленной GigE камеры и прокидывать его в gstreamer. Нашел библиотеку для камеры (aravis), полистал код демонстрационной программки aravis viewer, выкинул весь UI, заменил вызов gtk_main на g_main_loop_run. Запустил, работает. Отлично.
Дальше я попробовал видео остановить и запустить еще раз. Прибил петлю через g_main_loop_quit, скопировал деиницализацию из примера. Окей. Но вот если видео запустить еще раз - segmentation fault в malloc_consolidate. При попытке вызвать любую функцию из aravis.
И вот тут я просто в тупике. Valgrind сказал, что есть утечка памяти, но что делать с этой информацией? Где течет - непонятно. mtrace сгенерил пятиметровый файл, в котором просто каждая аллокация-деаллокация отмечена, без инфы об утечках. Демонстрационная прога деинициализацию делает только при закрытии окна, то есть может и в ней тоже память течет, просто это не заметно.
Функции из aravis возвращают разнообразные объекты, которые явно выделяются динамически, только нигде я не нашел никаких упоминаний, как их потом надо освобождать и в каком порядке.
gdb info threads показывает, что после выхода из петли и остановки pipeline gstreamer'а все еще существуют два треда, что, как мне кажется, не нормально.
В принципе, я уже подобрал костыль, но мне он не нравится. И я хочу понять, как вообще такого рода ошибки отлавливать.
«Демонстрационный» код целиком http://paste.org.ru/?uhmxhq на всякий случай привожу.