Учитывая указатель, как я могу найти _HEAP_ENTRY, которому он принадлежит? - PullRequest
3 голосов
/ 19 января 2010

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

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

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

1 Ответ

4 голосов
/ 19 января 2010

!heap -p -a <address>

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

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

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

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

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

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

...