Нахождение где память была в последний раз освобождена?
Очень общий: есть ли простой способ определить, какая строка кода в последний раз освобождала блок памяти при нарушении доступа?
Менее общее: я понимаю, что профилировщики переопределяют процессы выделения и освобождения. Если это так, могут ли они хранить строку кода, которая в последний раз освобождала часть памяти, так что, когда она позже падает из-за нарушения доступа, вы знаете, что освободило ее в последний раз?
Особенности: Windows, ANSI C, использование Visual Studio
3 ответа
Да!
Установите средства отладки Windows и используйте Application Verifier.
- Файл -> Добавить приложение, выберите свой.exe
- Под Основами выберите Память и Кучи.
- Запустите отладочную сборку вашей программы под ntsd (ntsd yourprogram.exe).
- Воспроизведите ошибку.
Теперь, когда произойдет сбой, вы получите дополнительную информацию в отладчике из AppVerifier. Используйте! Avrf (может занять много времени (минут)), и он попытается дать вам как можно больше полезной информации.
Вы можете использовать команду dps для адреса памяти, чтобы получить всю сохраненную информацию о стеке (распределение, освобождение и т. Д.).
Вы также можете использовать команду! Heap для адреса памяти:
0:004> !heap -p -a 0x0C46CFE0
Который будет сбрасывать информацию также.
Дальнейшее чтение:
Краткий ответ: нет.
Что вам нужно, это отладочный malloc. Я больше не слежу за Windows, но есть несколько вариантов, включая эту бесплатную.
Обновить
Похоже, Visual Studio C имеет встроенную версию. Смотрите здесь
Когда приложение связано с отладочной версией библиотек времени выполнения C, malloc разрешает
_malloc_dbg
, Для получения дополнительной информации об управлении кучей во время процесса отладки см. Куча отладки CRT.
... и посмотрите здесь для _malloc_dbg.
Нет, если вы не предоставите свои собственные средства выделения (например, путем перегрузки new/delete) для хранения этой информации.
То, что делают профилировщики, сильно зависит от того, что они профилируют. Я не знаю ни одного профилировщика, который отслеживал бы то, что вы ищете.
Возможно, если бы вы предоставили более подробную информацию о вашей ситуации, люди могли бы предложить альтернативные способы диагностики проблемы, с которой вы столкнулись.