Учитывая указатель, как я могу найти _HEAP_ENTRY, к которому он принадлежит?

Я учусь использовать WinDbg, и я, возможно, не совсем в этом разбираюсь, но я предполагаю, что если моя программа не использует выгружаемую кучу, то вместо _DPH_HEAP_BLOCK структуры, которые "владеют" указателем на мое распределение, я бы вместо этого имел _HEAP_ENTRY для выделенных данных.

Учитывая адрес выделенных данных в куче, как я могу найти, какие _HEAP_ENTRY идет с этим (в WinDbg), или мой вопрос даже не имеет смысла?

Корень моего вопроса - мое желание узнать, было ли выделено выделение в дампе или как-то повреждена куча.

1 ответ

Решение

!heap -p -a <address>

При включенной куче страниц это выводит полезную информацию (возможно, включая стек вызовов последнего человека, который выделил / освободил этот блок кучи) - я думаю, что это визуализирует _DPH_HEAP_BLOCK.

Без включенной кучи страниц он просто показывает основную информацию - что не очень полезно. Я думаю, что это обычная структура _HEAP_ENTRY. Отладка двойного освобождения /etc в точке второго доступа практически невозможна (по крайней мере, простыми смертными, такими как я).

Когда я сталкиваюсь с проблемой кучи, я немедленно включаю проверку кучи через AppVerifier, затем снова делаю репо. Это делает две вещи:

  1. Это перемещает AV от доступа к освобожденной памяти "дальше" к более раннему моменту времени, иногда делая очевидной причину ошибок

  2. Это делает !heap -p -a <address> команда выдает намного больше полезной информации, включая стек вызовов тех, кто последний раз ее освободил (!!)

! heap + приложение верификатора довольно круто, и, вероятно, уступает только точкам останова записи в память в списке ninja-windbg-foo, который должен знать каждый.

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