Учитывая указатель, как я могу найти _HEAP_ENTRY, к которому он принадлежит?
Я учусь использовать WinDbg, и я, возможно, не совсем в этом разбираюсь, но я предполагаю, что если моя программа не использует выгружаемую кучу, то вместо _DPH_HEAP_BLOCK
структуры, которые "владеют" указателем на мое распределение, я бы вместо этого имел _HEAP_ENTRY
для выделенных данных.
Учитывая адрес выделенных данных в куче, как я могу найти, какие _HEAP_ENTRY
идет с этим (в WinDbg), или мой вопрос даже не имеет смысла?
Корень моего вопроса - мое желание узнать, было ли выделено выделение в дампе или как-то повреждена куча.
1 ответ
!heap -p -a <address>
При включенной куче страниц это выводит полезную информацию (возможно, включая стек вызовов последнего человека, который выделил / освободил этот блок кучи) - я думаю, что это визуализирует _DPH_HEAP_BLOCK.
Без включенной кучи страниц он просто показывает основную информацию - что не очень полезно. Я думаю, что это обычная структура _HEAP_ENTRY. Отладка двойного освобождения /etc в точке второго доступа практически невозможна (по крайней мере, простыми смертными, такими как я).
Когда я сталкиваюсь с проблемой кучи, я немедленно включаю проверку кучи через AppVerifier, затем снова делаю репо. Это делает две вещи:
Это перемещает AV от доступа к освобожденной памяти "дальше" к более раннему моменту времени, иногда делая очевидной причину ошибок
Это делает
!heap -p -a <address>
команда выдает намного больше полезной информации, включая стек вызовов тех, кто последний раз ее освободил (!!)
! heap + приложение верификатора довольно круто, и, вероятно, уступает только точкам останова записи в память в списке ninja-windbg-foo, который должен знать каждый.