¿Qué significan los números de 'tamaño' en el windbg! Salida del montón?
Pregunta
Veo una salida como ésta en mi archivo DMP:
Heap entries for Segment00 in Heap 00150000
00150640: 00640 . 00040 [01] - busy (40)
00150680: 00040 . 01808 [01] - busy (1800)
00151e88: 01808 . 00210 [01] - busy (208)
00152098: 00210 . 00228 [00]
001522c0: 00228 . 00030 [01] - busy (22)
001522f0: 00030 . 00018 [01] - busy (10)
00152308: 00018 . 00048 [01] - busy (3c)
Los documentos WINDBG dicen lo siguiente:
Heap entries for Segment00 in Heap 250000
0x01 - HEAP_ENTRY_BUSY
0x02 - HEAP_ENTRY_EXTRA_PRESENT
0x04 - HEAP_ENTRY_FILL_PATTERN
0x08 - HEAP_ENTRY_VIRTUAL_ALLOC
0x10 - HEAP_ENTRY_LAST_ENTRY
0x20 - HEAP_ENTRY_SETTABLE_FLAG1
0x40 - HEAP_ENTRY_SETTABLE_FLAG2
Entry Prev Cur 0x80 - HEAP_ENTRY_SETTABLE_FLAG3
Address Size Size flags (Bytes used) (Tag name)
00250000: 00000 . 00b90 [01] - busy (b90)
00250b90: 00b90 . 00038 [01] - busy (38)
00250bc8: 00038 . 00040 [07] - busy (24), tail fill (NTDLL!LDR Database)
El espacio es raro en la documentación sin embargo. Hace que 'dirección de entrada' media y 'tamaño Anterior' y 'Tamaño cur', o es el 'entrada' 'Anterior' y 'act' no para la línea de abajo?
¿Qué significa 'tamaño Anterior' y 'Tamaño act' media? Especialmente con respecto a 'bytes utilizados'. ¿Cuál es la diferencia entre 'bytes utilizados' y 'act tamaño'?
Solución
Un montón segmento es un bloque continuo de memoria para un montón dada. También es una cadena de entradas montón.
Para caminar una lista de entradas montón remitimos podemos usar el tamaño del Cur como una compensación para llegar a la siguiente entrada montón.
Para caminar una lista de entradas del montón hacia atrás podemos usar el tamaño Anterior como una compensación para llegar al principio de la entrada anterior.
Aquí (foto de abajo) se puede ver la psize (tamaño anterior) y su relación con el tamaño (tamaño actual) para la entrada justo antes de la misma.
Los Bytes utilizados se calcula restando el tamaño de la el número de bytes no utilizados al final de este bloque que no fueron realmente asignados. Esto le permite determinar el tamaño de la asignación que se solicitó antes de doblar el tamaño solicitado a la granularidad de asignación.