【问题标题】:contradiction between !heap -x -v and !heap -flt s!heap -x -v 和 !heap -flt s 之间的矛盾
【发布时间】:2015-01-10 17:46:17
【问题描述】:

我正在分析显示一些奇怪的转储:命令 !heap -x -v hexadecimal_address!heap -flt s size_of_block 之间似乎存在矛盾

我正在询问悬空指针。 在这个转储中,这个悬空指针恰好是:0x0bdd00c0

要检索有关堆内存块的信息,我使用返回的 !heap -x -v 0bdd00c0

 条目用户堆段大小 PrevSize 未使用标志
    -------------------------------------------------- --------------------------
    0bdd00b8 0bdd00c0 003b0000 0bc00000 98 20 8 忙

这表明在这种情况下:

  • 内存块处于busy 模式(大部分时间在我的其他转储中,内存在这里是空闲的)
  • 内存块是0x98 字节大
  • 内存块在堆内管理003b0000

让我困惑的是:

当我启动 !heap -flt s 98 时(只是想观察其他具有相同大小的对象) 我得到这个结果 不显示我调查的指针 0bdd00c0

HEAP_ENTRY 大小 Prev 标志 UserPtr UserSize - 状态 _HEAP @ 3b0000 14b24fa8 0014 0014 [01] 14b24fb0 00098 - (忙) 0bc645a8 0014 0014 [01] 0bc645b0 00098 - (忙) 0bc66398 0014 0014 [01] 0bc663a0 00098 - (忙) 0bcbedf8 0014 0014 [01] 0bcbee00 00098 -(忙) 0bce2cc8 0014 0014 [01] 0bce2cd0 00098 -(忙) 0bceff88 0014 0014 [00] 0bceff90 00098 -(免费) 0bdf2f78 0014 0014 [01] 0bdf2f80 00098 -(忙) 0be28c50 0014 0014 [01] 0be28c58 00098 - (忙) 0be57470 0014 0014 [00] 0be57478 00098 -(免费) 0beed050 0014 0014 [01] 0beed058 00098 - (忙) 0bf1aaf0 0014 0014 [00] 0bf1aaf8 00098 -(免费) 0bf214c0 0014 0014 [00] 0bf214c8 00098 -(免费) 0bf99bf0 0014 0014 [00] 0bf99bf8 00098 -(免费)

(我只给了你heap 3b0000相关的摘录)

所以我得出结论,似乎存在矛盾。

我在做/假设有什么问题吗?我该怎么做才能了解问题所在?

【问题讨论】:

    标签: heap-memory windbg


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 1970-01-01
      • 2012-05-04
      • 2011-10-04
      • 2014-02-26
      • 2014-07-04
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多