Поиск, где была освобождена память?

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

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

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

Ответ 1

Да!

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

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

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

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

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

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

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

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

Ответ 2

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

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

Update

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

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

... и см. здесь _ malloc_dbg.

Ответ 3

Нет, если вы не предоставите свои собственные распределители (например, перегрузите новое/удалить), чтобы сохранить эту информацию.

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

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