Поиск, где была освобождена память?
Очень общее:
Есть ли простой способ сказать, какая строка кода освободила блок памяти при нарушении прав доступа?
Меньше общего:
Мое понимание профилировщиков заключается в том, что они переопределяют процессы распределения и освобождения. Если это так, может случиться, что они сохраняют строку кода, которая в последний раз освободила секцию памяти, так что, когда она позже выйдет из-за нарушения доступа, вы знаете, что ее освободить?
Особенности:
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
Нет, если вы не предоставите свои собственные распределители (например, перегрузите новое/удалить), чтобы сохранить эту информацию.
Что делают профилиры, сильно зависит от того, что они профилируют. Я не знаю, какой профилировщик отслеживает то, что вы ищете.
Возможно, если бы вы предоставили более подробную информацию о своей ситуации, люди могли бы предложить альтернативный способ диагностики проблемы, с которой вы сталкиваетесь.