ماذا تعني أرقام "الحجم" في إخراج Windbg! الكومة؟
سؤال
أرى إخراج مثل هذا في ملف 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)
تقول مستندات Windbg هذا:
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)
التباعد غريب في المستندات رغم ذلك. هل هذا يعني "عنوان الإدخال" و "الحجم السابق" و "حجم المنحنى" ، أم أن "الإدخال" السابق "و" cur "ليس للخط أدناه؟
ماذا يعني "الحجم السابق" و "حجم المنحنى"؟ خاصة فيما يتعلق بـ "البايتات المستخدمة". ما هو الفرق بين "البايتات المستخدمة" و "حجم منحنى"؟
المحلول
جزء الكومة هو كتلة مستمرة من الذاكرة لكومة معينة. كما أنها سلسلة من إدخالات الكومة.
للسير في قائمة من إدخالات الكومة للأمام ، يمكننا استخدام حجم CUR باعتباره إزاحة للوصول إلى إدخال الكومة التالي.
للسير في قائمة من إدخالات الكومة للخلف ، يمكننا استخدام حجم PRED كإزاحة للوصول إلى بداية الإدخال السابق.
هنا (الصورة أدناه) يمكنك رؤية Psize (الحجم السابق) وعلاقته بالحجم (الحجم الحالي) للإدخال قبل ذلك.
يتم حساب البايتات المستخدمة عن طريق طرح الحجم من عدد البايتات غير المستخدمة في نهاية هذه الكتلة التي لم يتم تخصيصها بالفعل. يتيح لك ذلك تحديد حجم التخصيص الذي تم طلبه قبل تقريب الحجم المطلوب لتخصيص التفاصيل.