在windbg中有没有办法创建一个断点,当某个参数在堆栈上传递时会触发该断点?

时间:2011-10-19 18:21:56

标签: windbg

我正在尝试追踪谁正在分配一定大小,我尝试使用用户模式堆栈跟踪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'"

2 个答案:

答案 0 :(得分:1)

使用poi(@esp+c)

在该功能的第一条指令中,您没有EBP。所以cdecl和stdcall的堆栈结构是

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

等。

答案 1 :(得分:1)

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

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