【问题标题】:Finding which function allocated a heap based on a memory address within the heap根据堆中的内存地址查找哪个函数分配了堆
【发布时间】:2015-08-29 18:17:11
【问题描述】:

所以我知道一个内存地址(例如:12208e6c)在一个特定的堆内。使用windbg,有没有办法确定这个堆的起始地址是什么以及哪个函数负责分配它?

【问题讨论】:

    标签: windbg


    【解决方案1】:

    !address <address> 为您提供有关地址所在堆的信息:

    0:005> !address 03051234
    Usage:                  Heap
    Base Address:           03050000
    End Address:            0307c000
    Region Size:            0002c000
    State:                  00001000    MEM_COMMIT
    Protect:                00000004    PAGE_READWRITE
    Type:                   00020000    MEM_PRIVATE
    Allocation Base:        03050000
    Allocation Protect:     00000004    PAGE_READWRITE
    More info:              heap owning the address: !heap 0x3050000
    More info:              heap segment
    More info:              heap entry containing the address: !heap -x 0x3051234
    

    “基地址”就是你所说的“起始地址”。

    要找出谁分配了该堆,您必须启用名为“创建用户模式堆栈跟踪数据库”的功能并在 GFlags 中设置缓冲区大小。

    这样做之后,你可以像这样找出分配调用堆栈:

    0:005> !gflag
    Current NtGlobalFlag contents: 0x00001000
        ust - Create user mode stack trace database
    
    0:005> !heap -p -a 00591234
        address 00591234 found in
        _HEAP @ 590000
          HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
            00590f28 0103 0000  [00]   00590f40    00800 - (busy)
              msvcrt!_iob
            7782e159 ntdll!RtlAllocateHeap+0x00000274
            7629ade8 msvcrt!_calloc_impl+0x00000136
            7629ae43 msvcrt!_calloc_crt+0x00000016
            762a1e48 msvcrt!__initstdio+0x0000000d
            762a1fc8 msvcrt!_cinit+0x0000001e
            762a1a94 msvcrt!_core_crt_dll_init+0x000001b2
            7629a48c msvcrt!_CRTDLL_INIT+0x0000001b
            777e92e0 ntdll!__RtlUserThreadStart+0x00000021
            777f061b ntdll!RtlpAllocateHeap+0x0000083a
            777f6d84 ntdll!LdrpInitializeProcess+0x0000137e
            777f583e ntdll!RtlSetEnvironmentVariable+0x00000020
            777e9809 ntdll!LdrpUpdateLoadCount2+0x00000047
    

    【讨论】:

    • 出于某种原因,当我执行!address <address> 时,我得到以下输出。为什么会这样? ProcessParametrs 00079758 in range 00079000 0007a000 Environment 047075b0 in range 04707000 04708000 121b0000 : 12208000 - 00001000 Type 00020000 MEM_PRIVATE Protect 00000004 PAGE_READWRITE State 00001000 MEM_COMMIT Usage RegionUsageIsVAD
    • @SivaDotRender:它是 .NET 应用程序还是使用 MSXML?
    • @SivaDotRender:似乎 RegionUsageIsVAD 只出现在旧版本的 WinDbg 中。您使用哪个版本?见debugging.wellisolutions.de/windbg-versions
    • 我正在调试 WINWORD.EXE (MS word) 所以我相信它使用 MSXML?而我当前的windbg版本是6.11.0001.404 X86
    • @SivaDotRender:请将您的 WinDbg 版本至少升级到 6.2.9200。如果你 x-copy 部署它,即使是 Windows 10 版本仍然可以在 Windows 7 上运行
    猜你喜欢
    • 2017-02-24
    • 2016-09-09
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多