Почему сканирование памяти непредсказуемо, когда я просматриваю программу в отладчике gdb
? Я пытаюсь использовать gdb, чтобы узнать, почему программа использует гораздо больше памяти, чем должна, и она не сотрудничает.После распределения памяти в gdb
Я шагаю через исходный код во время мониторинга использования памяти процесса, но я не могу найти какую строку() распределяет память по двум причинам:
- Сообщил использование памяти только вскакивает с шагом (обычно, но не всегда точно) 64 МБ. Я подозреваю, что вижу эффекты какого-либо менеджера памяти. Я не знаю, какие резервы 64 МБ за один раз и маскирует несколько меньших распределений.
- Скачок не происходит в согласованном месте в коде. Это происходит не только на разных линиях во время различных прогонов gdb; это также иногда происходит в нелогичных местах, таких как закрывающая скобка (C++). Возможно ли, что сам gdb влияет на распределение памяти?
Любые идеи/предложения для более эффективных инструментов, которые помогут мне перейти к строкам кода, которые действительно ответственны за эти распределения памяти?
Вот некоторые сведения о системе: Я запускаю x86_64-redhat-linux-gnu версию 7.2-64.el6-5.2 на виртуальной машине CentOS Linux под Windows. Программа построена на удаленном сервере с помощью сложного сценария сборки, поэтому отслеживание того, какие опции использовались в любой момент, само по себе является немного сложной задачей. Я отслеживаю использование памяти как с помощью утилиты top
(«virt» или столбец виртуальной памяти), так и путем чтения файла мониторинга в реальном времени /proc/<pid>/status
, и они согласны. Поскольку в этой программе используется большой набор сторонних библиотек, может быть задействована одна или несколько переопределенных функций malloc()
, о которых я не знаю - их поиск - часть этой задачи.
Вы использовали 'valgrind'? Это мой первый порт захода, до 'gdb' для таких исследований. –
Наш код проверяется периодически с valgrind, хотя я не очень хорошо знаком с ним. Я думал, что это только для поиска утечек памяти (?) То, что я ищу здесь, кажется, раздувается, но не протекает. – user2084572
'valgrind' - контейнерный инструмент; вы можете проверить наличие утечек с помощью компонента 'memcheck', но его набор инструментов делает гораздо больше. Это почти плагиновая архитектура. Я не уверен, есть ли суб-инструмент, который делает то, что вы хотите, но это, безусловно, стоит проверить. См. Сообщение в блоге [«Valgrind - это НЕ NOT * средство проверки утечки»] (http://maintainablecode.logdown.com/posts/245425-valgrind-is-not-a-leak-checker). –