2013-09-10 3 views
6

Я уже много лет использую! Heap -p -a для различных задач. Теперь я начинаю отлаживать Win8 с помощью WinDbg 6.2.9200, найденного в последнем Win8 sdk.! Heap -p -a VS! Heap -x

Здесь я обнаружил, что! Heap -p -a не всегда работает, и что вывод от ! Адрес «рекламирует» использование! Heap -x (см. Ниже).

После прочтения кучи -? , Я не понимаю разницы! Кто знает разницу?

Какую команду вы используете для просмотра деталей кучного блока?

0:008> !address 335168f8 
<cut cut> 

Usage:     Heap 
Base Address:   32b43000 
End Address:   33540000 
Region Size:   009fd000 
State:     00001000 MEM_COMMIT 
Protect:    00000004 PAGE_READWRITE 
Type:     00020000 MEM_PRIVATE 
Allocation Base:  32570000 
Allocation Protect:  00000004 PAGE_READWRITE 
More info:    heap owning the address: !heap 0xa80000 
More info:    heap segment 
More info:    heap entry containing the address: !heap -x 0x335168f8 


0:008> !heap -x 0x335168f8 
Entry  User  Heap  Segment  Size PrevSize Unused Flags 
----------------------------------------------------------------------------- 
335168f0 335168f8 00a80000 32570000  30  30  1c busy extra fill 

0:008> !heap -p -a 0x335168f8 

0:008> .echo "nothing !!" 
nothing !! 
+2

Не запрашивает ли «-p» информацию о куче страницы? Я думаю, что кучи страниц должны быть включены сначала (перед запуском рассматриваемого процесса) с чем-то вроде gflags. –

+0

Да, я согласен, что -p звучит как куча страниц, но «-p -a» всегда работал, даже если куча страниц не включена. Также он намного быстрее, чем -x. В любом случае, если -x - путь, я должен справиться с этим. –

+1

6.2.9200 также не выводится на мою машину. Также 6.12.2. Какова была ваша старая версия? У меня много версий, поэтому я мог бы попробовать. –

ответ

3

Windbg использует другой механизм для поиска информации о куче в зависимости от того, какой флаг вы используете.

Флаг -p сообщает, что вы включили Page Heap через или аналогичный. Когда функция «Куча страниц» включена, Windows сохраняет отдельный набор структур (_DPH_HEAP_ROOT и co) для отслеживания распределений. Если PageHeap не включен, таких структур не будет, поэтому вы не получите выход. Я также ожидаю, что -p -a будет просто искать назад от адреса, чтобы найти _DPH_HEAP_BLOCK, который описывает распределение.

Флаг -x сообщает Windbg о том, как использовать структуры, которые Windows использует для отслеживания распределений, для обработки структур _HEAP/_HEAP_ENTRY. Этот набор структур описывает все активные распределения, которые прошли через стандартные распределители (например, malloc, new, LocalAlloc, HeapAlloc` и т. Д.).

Есть несколько замечательных статей о внутренних компонентах распределителей кучи Windows. Мне очень нравится paper Chris Valasek (@nudehaberdasher) сделал несколько лет назад в куче Low Fragmentation Heap, которая была реализована в Windows 7 (и принципы все еще применяются в Win8).