Как интерпретировать результат! Heap -l от Windbg - PullRequest
0 голосов
/ 21 мая 2018

У меня есть файл дампа 3.5 Гб от процесса, который, как я подозреваю, имеет утечку памяти.Я использовал Windbg для анализа файла дампа, и я использовал конкретную команду! Heap -l (для обнаружения утечек).Результат показал, что 807258 потенциальных недоступных блоков были обнаружены.Однако я не знаю, как использовать результаты анализа.Отчет имеет следующий формат:

Entry |Пользователь |Куча |Сегмент |Размер |PrevSize |Неиспользованный |Флаги

00000000002e4190 |00000000002e41a0 |0000000000260000 |0000000000260000 |210 |60 |10 |Занято

...... (остальные 807258 строк)

Насколько я понимаю, столбец кучи сообщает вам, какая куча происходит в результате утечкиот, но что означает Entry и User?Я не смог найти никакого объяснения в онлайн-документе Microsoft.Может кто-нибудь помочь мне понять, что означает каждый из этих столбцов?

1 Ответ

0 голосов
/ 21 мая 2018

Entry - это адрес HEAP_ENTRY для этого выделения кучи.Это недокументировано, но выглядит примерно так .

Вы можете посмотреть, как это выглядит в вашей системе, используя dt nt!_HEAP_ENTRY или даже посмотреть на эту конкретную запись кучи, используя dt nt!_HEAP_ENTRY 00000000002e4190.

Вот схема nt!_HEAP_ENTRY в моей системе:

0:007> dt nt!_HEAP_ENTRY
ntdll!_HEAP_ENTRY
   +0x000 UnpackedEntry    : _HEAP_UNPACKED_ENTRY
   +0x000 PreviousBlockPrivateData : Ptr64 Void
   +0x008 Size             : Uint2B
   +0x00a Flags            : UChar
   +0x00b SmallTagIndex    : UChar
   +0x008 SubSegmentCode   : Uint4B
   +0x00c PreviousSize     : Uint2B
   +0x00e SegmentOffset    : UChar
   +0x00e LFHFlags         : UChar
   +0x00f UnusedBytes      : UChar
   +0x008 CompactHeader    : Uint8B
   +0x000 ExtendedEntry    : _HEAP_EXTENDED_ENTRY
   +0x000 Reserved         : Ptr64 Void
   +0x008 FunctionIndex    : Uint2B
   +0x00a ContextValue     : Uint2B
   +0x008 InterceptorValue : Uint4B
   +0x00c UnusedBytesLength : Uint2B
   +0x00e EntryOffset      : UChar
   +0x00f ExtendedBlockSignature : UChar
   +0x000 ReservedForAlignment : Ptr64 Void
   +0x008 Code1            : Uint4B
   +0x00c Code2            : Uint2B
   +0x00e Code3            : UChar
   +0x00f Code4            : UChar
   +0x00c Code234          : Uint4B
   +0x008 AgregateCode     : Uint8B

User - это просто начало выделения, возвращаемое RtlAllocateHeap() или HeapAlloc().

Обычно он равен Entry адресу плюс sizeof(_HEAP_ENTRY).

...