LINUX.ORG.RU

Как отлаживать segfault/утечки памяти?

 , , ,


0

2

Ситуация такова: я впервые в жизни пытаюсь что-то писать под Линукс и очень смутно представляю, что вообще происходит. 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 на всякий случай привожу.

Падение в malloc_consolidate - это испорченный чанк памяти, который, например, освободили, но в который продолжается запись. Обрати внимание на коммент arturpub.

mv ★★★★★
()
2 сентября 2016 г.
Ответ на: комментарий от arturpub

Запоздало, но для потомков напишу - да, device_id освобождать было не нужно. В примере он брался из gtk_tree_model_get, который возвращает копию, а его брал из arv_get_device_id.

Но честно говоря, догадаться, что нужно освобождать, а что не нужно, довольно тяжело; комментов у функций этой либы почти нет.

И вывод valgrind'a мне нужно было читать повнимательнее, он таки показывал, где память течет.

poganoe_lamerishe
() автор топика
Ответ на: комментарий от anonymous

Приведенные по ссылке рецепты с G_* переменными актуальны только для glib-based софта. Но для Qt и ICU, думаю, должно быть что-то похожее

kravich ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.