【问题标题】:Is there a way in windbg to create a break point that will fire when a certain parameter is passed on the stack?windbg 中是否有一种方法可以创建一个断点,当某个参数在堆栈上传递时将触发该断点?
【发布时间】:2011-10-19 18:21:55
【问题描述】:

我正在尝试追踪谁在分配特定大小,我尝试使用用户模式堆栈跟踪 db (gflags +ust),但由于 FPO,我无法看到整个堆栈。因此,我想在 RtlAllocateHeap 产生我正在寻找的分配大小时在它上设置一个断点。唯一的问题是我似乎找不到让它工作的方法。

我最初尝试使用@esi,因为它看起来像使用此寄存器传递第三个参数,但似乎并非总是如此。于是我尝试@ebp-c 给我第三个参数,但这似乎并不总是有效,所以我尝试了@esp+14,但也没有用。

无论我做什么,我似乎都无法找到一种方法来让它在我想要的时候真正触发。看起来这应该可行,但我猜它在某些情况下使用叶函数优化,这使我无法做到这一点。

任何人都对如何让它发挥作用有任何想法。

堆堆栈跟踪:

0:013> !heap -p -a 0c060710    
address 0c060710 found in
_HEAP @ 1420000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    0c0606f8 09c3 0000  [00]   0c060710    04e00 - (busy)
    77abb234 ntdll!RtlAllocateHeap+0x00000274
    75ee404b ole32!CRetailMalloc_Alloc+0x00000016
    76454557 OLEAUT32!APP_DATA::AllocCachedMem+0x00000060
    7645476a OLEAUT32!SysAllocStringByteLen+0x0000003d
    764547bf OLEAUT32!ErrStringCopyNoNull+0x00000016
    764547e3 OLEAUT32!VariantCopy+0x0000007f

已尝试断点:

 bp ntdll!RtlAllocateHeap "j @esi == 0x4e00 ''; 'gc'"
 bp ntdll!RtlAllocateHeap "j poi(@ebp-c) == 0x4e00 ''; 'gc'"
 bp ntdll!RtlAllocateHeap "j poi(@esp+14) == 0x4e00 ''; 'gc'"

【问题讨论】:

    标签: windbg


    【解决方案1】:

    使用poi(@esp+c)

    在函数的第一条指令中,您没有 EBP。所以 cdecl 和 stdcall 的栈结构是

    <return address>
    <First arg>
    <second arg>
    

    等等。

    【讨论】:

      【解决方案2】:

      我想我已经测试过了: 分配大小中断 == 1303

      bp ntdll!RtlAllocateHeap "j(poi(@esp+c) = 0x1303) 'k';'gc'"

      【讨论】:

        猜你喜欢
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2013-11-03
        • 2013-12-03
        • 1970-01-01
        相关资源
        最近更新 更多