противоречие между !heap -x -v и !heap -flt s

Я анализирую дамп, который показывает что-то странное: кажется, есть противоречие между командой !heap -x -v hexadecimal_address и !heap -flt s size_of_block

Я спрашиваю о висящих указателях. В этом дампе этот висячий указатель оказался: 0x0bdd00c0

Чтобы получить информацию о блоке памяти кучи, я использую !heap -x -v 0bdd00c0, который возвращает

    Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
    -----------------------------------------------------------------------------
    0bdd00b8  0bdd00c0  003b0000  0bc00000        98        20         8  busy

Что показывает именно то, что в этом случае:

  • блок памяти в режиме busy (большую часть времени в других моих дампах память здесь свободна)
  • блок памяти имеет размер 0x98 байт
  • блок памяти управляется внутри кучи 003b0000.

Что меня озадачивает:

Когда я запускаю !heap -flt s 98 (просто хочу наблюдать за другими объектами того же размера), я получаю этот результат, который не отображает указатель 0bdd00c0 моего исследования

      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
   _HEAP @ 3b0000
       14b24fa8 0014 0014  [01]   14b24fb0    00098 - (busy)
       0bc645a8 0014 0014  [01]   0bc645b0    00098 - (busy)
       0bc66398 0014 0014  [01]   0bc663a0    00098 - (busy)
       0bcbedf8 0014 0014  [01]   0bcbee00    00098 - (busy)
       0bce2cc8 0014 0014  [01]   0bce2cd0    00098 - (busy)
       0bceff88 0014 0014  [00]   0bceff90    00098 - (free)
       0bdf2f78 0014 0014  [01]   0bdf2f80    00098 - (busy)
       0be28c50 0014 0014  [01]   0be28c58    00098 - (busy)
       0be57470 0014 0014  [00]   0be57478    00098 - (free)
       0beed050 0014 0014  [01]   0beed058    00098 - (busy)
       0bf1aaf0 0014 0014  [00]   0bf1aaf8    00098 - (free)
       0bf214c0 0014 0014  [00]   0bf214c8    00098 - (free)
       0bf99bf0 0014 0014  [00]   0bf99bf8    00098 - (free)

(Я дал вам только отрывок, связанный с кучей 3b0000)

Так что я пришел к выводу, что, похоже, есть противоречие.

Я делаю/предполагаю что-то не так? Что я мог сделать, чтобы понять, что не так?


person Stephane Rolland    schedule 13.11.2014    source источник


Ответы (1)


Вы проглядели 8 неиспользуемых байтов, попробуйте

!heap -flt s 90

Из моей тестовой программы:

0:000> !heap -x -v 0x003dc710 
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
 -----------------------------------------------------------------------------
 003dc708  003dc710  003d0000  003d0000      1310        40         d  busy 

0:000> ? 1310-d        
Evaluate expression: 4867 = 00001303

0:000> !heap -flt s 1303
_HEAP @ 3d0000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    003dc708 0262 0000  [00]   003dc710    01303 - (busy)

Подробнее о распределении здесь:

0:000> !heap -i 3d0000
Heap context set to the heap 0x003d0000
0:000> !heap -i 003dc708 
Detailed information for block entry 003dc708
Assumed heap       : 0x003d0000 (Use !heap -i NewHeapHandle to change)
Header content     : 0x6334FAFC 0x0D00FD4A (decoded : 0x61010262 0x0D000008)
Owning segment     : 0x003d0000 (offset 0)
Block flags        : 0x1 (busy )
Total block size   : 0x262 units (0x1310 bytes)
Requested size     : 0x1303 bytes (unused 0xd bytes)
Previous block size: 0x8 units (0x40 bytes)
Block CRC          : OK - 0x61  
Previous block     : 0x003dc6c8
Next block         : 0x003dda18
person Kjell Gunnar    schedule 13.11.2014