C ++. Как отследить выделение памяти для модуля .so в linux - PullRequest
2 голосов
/ 07 апреля 2020

Привет, мы находимся в ситуации, когда у нас большое приложение, и теперь есть ситуация, в которой необходимо знать, какой модуль .so выделяет объем памяти. Я понятия не имею здесь, мне было интересно, пользовательский оператор переопределения нового распределителя, но это не помогло, потому что я все еще не могу проследить, какой модуль делает для выделения. Замена нового пользовательским распределителем была бы ужасной работой. Кто-нибудь знает, как я могу сказать, какой модуль делает, сколько выделений?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вы можете использовать LD_PRELOAD трюк , чтобы поймать malloc, realloc, free и т.д. c. Это в сочетании с информацией, полученной из boost.stacktrace, даст вам большую часть (если не все) того, что вам нужно. Хотя нетривиально.

1 голос
/ 07 апреля 2020

Это не просто.

Вы можете подключить malloc, free, realloc в глобальном масштабе в приложении. Соответствующие статьи о Stackoverflow: Как использовать __malloc_hook? , Альтернатива устаревшей функциональности __malloc_hook в glib c.

Вы можете получить адрес вызывающего из этого перехватывает __builtin_return_address и сравнивает его с адресами разделяемых библиотек. Возможно, вам нужно изучить более глубокий адрес фрейма, чтобы получить правильный адрес в библиотеке, а не адрес libc ++. Прочитайте эту статью Stackoverflow __buildin_return_address возвращает значение NULL для индекса> 0? .

...