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

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

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

Особенности: Windows, ANSI C, использование Visual Studio

3 ответа

Решение

Да!

Установите средства отладки Windows и используйте Application Verifier.

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

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

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

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

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

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

Дальнейшее чтение:

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

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

Обновить

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

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

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

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

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

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

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