Печать в памяти объектов с WinDbg - PullRequest
1 голос
/ 11 декабря 2011

У меня есть простая служба C ++, которая читает текст из файла и отправляет его по сети. Со временем потребление памяти этой услугой увеличивается на сайте клиента. При тестировании QA такого поведения не наблюдается.

Я хотел бы знать, возможно ли извлечь все строковые объекты, которые находятся в памяти в любой момент времени.

Можно ли будет автоматизировать этот процесс таким образом, чтобы я в разное время брал у клиента дампы, каждый раз узнавал размеры или содержимое памяти и сравнивал результаты.

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Для c ++ ответ - нет (в C # это другая история).В мире c ++, если вы подозреваете, что у вас есть утечка, вы бы хотели включить отслеживание стека пользовательского режима (+ ust в gflags.exe) в процессе до того, как произойдет «утечка».После того, как произошла утечка, получите дамп процесса и проверьте его.Чтобы проверить его (я предположил, что вы используете собственную кучу окон в этом ответе), вам нужно пройтись по структурам кучи, чтобы выяснить, где находятся распределения, а затем проверить обратную трассировку стека для выборки наиболее распространенного размера распределения..

Пример.

  1. Перед запуском приложений запустите gflags / i MyApp.exe + ust.Это устанавливает regkey, который предоставляет ОС специальные инструкции о том, как обрабатывать процесс MyApp.exe
  2. Запустите программу и дайте «плохому поведению» произойти
  3. Соберите дамп процессав то время как плохое поведение легко увидеть (чем легче его увидеть, тем легче будет его найти)
  4. Откройте дамп в Windbg
  5. ! heap -summary и найдите кучу с помощьючисло виртуальных байтов:
  6. Первый столбец - это ваш дескриптор кучи.Используйте дескриптор кучи из записи, найденной на предыдущем шаге, и запустите! Heap -stat -h -grp.Это перечислит распределения кучи, которые используют больше всего места в данной куче.
  7. Итак, теперь мы знаем, какая куча была большой, и размер записей, которые являются наиболее распространенными.Мы знаем, что нужен адрес нескольких, чтобы мы могли посмотреть на стек вызовов, который их выделил.Запустите! Heap -flt s.
  8. Последний шаг (мы ооочень близки).Беги! Куча -p -a.Теперь у вас будет обратная трассировка стека для того, какой кодовый путь сгенерировал это распределение.Теперь вы можете вернуться к своему коду и выяснить, почему он не освобождается.
1 голос
/ 13 декабря 2011

http://msdn.microsoft.com/en-us/library/ff558947(v=vs.85).aspx - ваш лучший выбор для того, что вы хотите сделать.

1 голос
/ 12 декабря 2011

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

...