Нахождение где память была в последний раз освобождена? - PullRequest
4 голосов
/ 28 марта 2009

Очень общее: Есть ли простой способ определить, какая строка кода в последний раз освобождала блок памяти при нарушении прав доступа?

Менее общее: Мое понимание профилировщиков состоит в том, что они переопределяют процессы выделения и освобождения. Если это так, могут ли они хранить строку кода, которая в последний раз освобождала часть памяти, чтобы при последующем сбое из-за нарушения доступа вы знали, что освободило ее в последний раз?

Специфика: Windows, ANSI C, с использованием Visual Studio

Ответы [ 3 ]

7 голосов
/ 28 марта 2009

Да!

Установите Средства отладки Windows и используйте Верификатор приложений .

  1. Файл -> Добавить приложение, выберите свой .exe
  2. В разделе Основы выберите Память и кучи.
  3. Запустите отладочную сборку вашей программы под ntsd (ntsd yourprogram.exe).
  4. Воспроизвести ошибку.

Теперь, когда произойдет сбой, вы получите дополнительную информацию в отладчике из AppVerifier. Используйте! Avrf (может занять много времени (минут)), и он попытается дать вам как можно больше полезной информации.

Вы можете использовать команду dps на адресе памяти, чтобы получить всю сохраненную информацию стека (распределение, освобождение и т. Д.).

Вы также можете использовать команду! Heap для адреса памяти:

0:004> !heap -p -a 0x0C46CFE0

Который также будет сбрасывать информацию.

Дополнительная литература:

0 голосов
/ 28 марта 2009

Краткий ответ: нет.

Вам нужен отладочный malloc. Я больше не слежу за Windows, но есть несколько вариантов, включая этот бесплатный .

Обновление

Похоже, Visual Studio C имеет встроенную версию. Смотри здесь

Когда приложение связано с отладочная версия C времени выполнения библиотеки, Malloc разрешает в _malloc_dbg. Для получения дополнительной информации о том, как кучи управляется во время процесс отладки, см. ЭЛТ Кучи отладки.

... и посмотрите здесь _malloc_dbg .

0 голосов
/ 28 марта 2009

Нет, если вы не предоставите свои собственные средства выделения (например, путем перегрузки new / delete) для хранения этой информации.

То, что делают профилировщики, сильно зависит от того, что они профилируют. Я не знаю ни одного профилировщика, который бы отслеживал то, что вы ищете.

Возможно, если бы вы предоставили более подробную информацию о вашей ситуации, люди могли бы предложить альтернативные способы диагностики проблемы, с которой вы столкнулись.

...