Проверка всех видов использования памяти во время выполнения приложения C++

Я использую CentOS 7 и запускаю приложение C++. Недавно я переключился на более новую версию библиотеки, которую приложение использовало для различных функций MySQL C API. Но после интеграции новой библиотеки я увидел огромное увеличение использования памяти программой, т. Е. Приложение аварийно завершает работу, если работает дольше одного или двух дней. Точно, происходит то, что использование памяти приложением начинает увеличиваться до такой степени, что приложение само использует 74,9% общей памяти системы, а затем оно принудительно отключается системой.

Есть ли способ, как отслеживать использование памяти всего приложения, включая статические переменные. Я уже пробовал инструмент Вальгринда Массив.

Может кто-нибудь сказать мне, что может быть возможными причинами увеличения использования памяти или какие-либо инструменты, которые могут дать мне глубокое понимание того, как распределяется память (как статическая, так и динамическая). Есть ли инструмент, который может рассказать нам о распределении памяти для приложения C++, работающего в среде Linux?

Заранее спасибо!

1 ответ

Статическая память выделяется при запуске программы. Вы видите увеличение памяти или увеличение стартапа?

Поскольку для аварийного завершения работы требуется один или два дня, проблема, вероятно, заключается в утечке памяти или неограниченном росте структуры данных. Valgrind должен быть в состоянии помочь с обоими. Если valgrind показывает большую утечку с опцией --leak-check-full, то вы, вероятно, найдете проблему.

Чтобы проверить неограниченный рост, поместите в программу упреждающий _exit() в точке, где вы подозреваете, что куча выросла. Например, поместите таймер в основной цикл, и программа выйдет через 10 минут. Если valgrind показывает большое "использование при выходе", то вы, вероятно, имеете неограниченный рост структуры данных, но не утечку. Массив может помочь отследить это. Ms_print дает подробную информацию о распределении с помощью стека функций.

Если вы обнаружили проблему, попробуйте вернуться к более старой версии вашей библиотеки. Если проблема исчезнет, ​​проверьте и убедитесь, что вы правильно используете API в новой версии. Если у вас нет исходного кода, то вы немного застряли с точки зрения исправления.

Если вы хотите пройти лишнюю милю, вы можете написать средство вставки в общую библиотеку для malloc / free, чтобы увидеть, что происходит. Вот хорошее начало. Linux имеет функцию обратной трассировки, которая может помочь в определении точного стека.

Наконец, если вы должны использовать стороннюю библиотеку и обнаружите, что куча растет без каких-либо ограничений или утечек, вы можете использовать промежуточную библиотеку для прямого вызова free / delete. Это рискованная стратегия, не рекомендуемая в последнюю очередь, но я использовал ее в производстве, чтобы затормозить процесс.

Другие вопросы по тегам