У нас есть многопоточное приложение C++, скомпилированное с g ++, работающим на встроенном powerpc. Для проверки утечки памяти это в ходе непрерывного теста интеграции мы создали анализатор кучи, который загружается с ld_preload
.Должен ли загрузочный модуль LD_PRELOAD или просто использовать модуль для замены символов
Мы хотели бы гарантировать, что функция в модуле ld_preloaded
вызывается до того, как что-либо еще произойдет (включая создание статических объектов и т. Д.). Еще более важно, что мы хотели бы иметь еще одну функцию, которая вызывается непосредственно перед выходом из процесса, поэтому анализатор кучи может выводить свои результаты. Проблема, которую мы видим, заключается в том, что вектор в нашем приложении создается в области глобального файла, прежде чем что-либо произойдет в нашем модуле ld_preloaded
. Вектор растет в пределах основного. При выключении функция destructor
в нашем предварительно загруженном модуле вызывается до того, как вектор будет уничтожен.
Есть ли способ кодировать предварительно загруженный модуль для запуска функции перед чем-либо еще и после всего остального? Мы пробовали использовать __attribute__((constructor))
и destructor
без успеха.
Возвращаясь к заголовку вопроса, я начинаю подозревать, что ld
только просматривает предварительно загруженный модуль при разрешении символов для последующих нагрузок модулей. Он не загружает предварительно загруженный модуль. Может ли кто-нибудь пролить свет на это для нас?
К сожалению, это не повлияло. Дальнейшее чтение, кажется, предполагает, что существует бесконечный квест для реальной точки входа в приложение C++. – Fenster34
Жаль, что это не сработало. Я могу только предложить обходное решение для вас тогда. Если вы динамически выделяете свой анализатор кучи, он никогда не будет уничтожен. Если он сохраняет свое состояние в файле с отображением памяти, вы можете проанализировать файл позже, когда программа закончится. – jxh
Это отличная идея, поскольку она всегда гарантирована для работы. Мы решили изменить наш код, чтобы избежать проблемы, но я буду записывать это как будущий аспект. благодаря – Fenster34