LINUX.ORG.RU

valgrind и .so библиотека

 ,


1

2

Подскажите пожалуйста как искать утечки в .so либе.

Либа и приложение её использующее собраны с debug mode

Приблизительное расположение файлов: build_dir/bin buil_dir/lib/lib.so

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

Валгринд хорошо показывает утечки и файлы где есть утечка - если утечка принадлежит как-бы приложению.

А как с его помощью можно конкретизировать место утечки в библиотеке?


Никак, вызывай из библиотеки функции вызывающие подозрения и тестируй, в идеале напиши тест где будут использованы 100% функций библиотеки. Про вариативность я молчу, если в либе 100500 флагов исполнения то придётся покрывать все варианты вызова функций

Deleted ()

если ты используешь эту либу, он выловит все утечки. правда, валграйнд иногда склонен к параноиду и некоторые вещи типа выделения буферов с удалением их где-то сильно потом он может не отследить и завалить тебя варнингами об утечке. надо включать track-origins и разбираться. и ещё: запуск приложения с валграйндом иногда меняет его поведение, из-за замедления. некоторые баги (обычно ошибки синхронизации) просто могут просто не проявиться в таких условиях.

Iron_Bug ★★★★★ ()
Ответ на: комментарий от mos

Просто либу нельзя же, нужно явно делать вызовы, если в исполняемом файле не будет вызова функций с утечками то и valgrind будет молчать

Deleted ()
Ответ на: комментарий от mos

Нет, но ты аргументируй или ты лалка?

P.S. Хотя, чукча не читатель, мне показалось что он хочет отдельно либу через valgrind прогнать, именно это я имел в виду когда говорил что «никак»

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

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

т.е. происходит некая итерация работы и именно апа разрастается с каждой итерацией в памяти

Но валгринд не видит этого. Например если сделать преднамеренную утечку в самой апе то валгринд увидит и скажет файл где это происходит.

Попробовал пересобрать либу из so в статическую - валгринд всеравно не находит утечек :(

Дополнитильный вопрос.

Допустим апа работает в бесконечном цыкле, дергает библиотечные ф-ии (пусть статик либы, которая вроде как по идее должна быть частью апы), ну или динамик либы - не важно.

Вопрос в том что например я сделал нужное кол-во итераций и убиваю апу sigkill - это норм для валгринда? или что бы он норм отработал нужно какое-то более мягкое завершение проги, которое сама прога инициировала?

bober ()

Ребят, если сделать статическую либу (а я это могу легко) то валгринд вроде как начинает что-то видеть.

Вообще я пускаю из QtCreator-а проверку, но там не нашел как менять опции запуска именно мемчека. Поэтому мне нужно в консоле.

Но тут возникает вопрос:

Как передать на stdin работающей программы текст, если она запущена в Valgrind?

echo «text» > /proc/`pgrep -u user app_name`/fd/0

Но если апа запущена в валгринде - то этот текст просто выводится на терминал где запущен валгринд и не попадает на stduin апы.

Если кто сможет подсказать как передать на stdin апы из валгринда запущенной - то пожалуй я смогу найти утечку в апе :)

Ну либо придется в самой апе писать кучу кода для воспроизведения тех шагов что я могу добиться через stdin

bober ()
Ответ на: комментарий от bober

как передать на stdin апы из валгринда запущенной

Просто при вызове же можно:

echo text | valgrind ./myapp
xaizek ★★★★★ ()
Ответ на: комментарий от bober

У меня сейчас голова не варит, но я бы тупо взял и грепнул на calloc/malloc/free/realloc исходники либы и поискал проблему явно в коде в тех функциях при вызове которых у меня утечка

Deleted ()

всё разобрался. Нашел куда тыкнуть в QtCreator чтобы валгринд запускался с нужными параметрами, теперь он показывает предположительные места утечек. Но правда таки пришлось линковку со динамик на статик изменить, хотя по идее вроде бы есть возможность искать в статик либах, но не освоил эту возможность.

bober ()
Ответ на: комментарий от bober

Нашел куда тыкнуть в QtCreator чтобы валгринд запускался с нужными параметрами

не --leak-check=full ?

backbone ★★★★★ ()

Если не находит валгринд попробуй санитайзеры.

Дабы не ходить два раза - раскрой нам, как ты выяснил, что:

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

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

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