Используйте Valgrind для разделяемой библиотеки, которая закрывается до выхода из приложения - PullRequest
0 голосов
/ 12 февраля 2019

Как найти утечки памяти в разделяемой библиотеке (.so), которая динамически загружается в стороннее приложение, для которого код недоступен (но был создан с информацией отладки)?Возможно, проблема в том, что разделяемая библиотека dlclose'd до выхода из приложения, и Valgrind больше не имеет отладочной информации приложения и сообщает адреса утечек памяти в виде вопросительных знаков.

В настоящее время пробовалиследующее:

  1. Создание проекта с отладочной информацией с использованием компиляторов clang и gcc
  2. LD_PRELOAD разделяемая библиотека перед запуском приложения

Есть ли что-нибудь, чтоможно сделать так, чтобы Valgrind мог обнаруживать символы отладки?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вот выдержка из valgrind 3.14 НОВОСТИ:

  • Новая опция --keep-debuginfo = no | yes (по умолчанию no) может использоваться для сохранения отладочной информации для выгруженного кода,Это позволяет сохраненным следам стека (например, для утечек памяти) включать информацию файла / строки для кода, который был dlclose'd (или подобный).См. Руководство пользователя для получения дополнительной информации и известных ограничений.

Таким образом, просто использование --keep-debuginfo = yes должно показать правильные трассировки стека для утечек.

0 голосов
/ 12 февраля 2019

Используя правильные флаги для компоновщика в gcc, разделяемая библиотека вынуждена оставаться загруженной до выхода из приложения.Эта опция называется:

-z nodelete

Примеры флагов для сборки с gcc:

gcc -fPIC -g -c -Wall -z nodelete

и для CMAKE:

set(CMAKE_SHARED_LINKER_FLAGS, "-z nodelete")

Выше были протестированы только сНКА.

...