WinDbg-当堆栈上存在某些值时计数断点命中
我不是说调用堆栈 我想计算当ESP持有的地址中有某个值时,某个函数被调用的次数。在您告诉我检查返回地址之前,我对此不感兴趣-返回地址位于ESP+4,在本例中,[ESP]持有在函数返回之前弹出的值。细节不重要 我可以使用以下语法计算函数调用:WinDbg-当堆栈上存在某些值时计数断点命中,windbg,Windbg,我不是说调用堆栈 我想计算当ESP持有的地址中有某个值时,某个函数被调用的次数。在您告诉我检查返回地址之前,我对此不感兴趣-返回地址位于ESP+4,在本例中,[ESP]持有在函数返回之前弹出的值。细节不重要 我可以使用以下语法计算函数调用: bp MyFunction "r @$t0 = @$t0 + 1; r @$t0; gc" 我可以通过添加在[ESP]中显示双字 dd $csp L1 按上面的命令 问题是有相当多的电话,我只对某些电话感兴趣,并且在每个断点后手动跟踪它们既烦人又耗时 我
bp MyFunction "r @$t0 = @$t0 + 1; r @$t0; gc"
我可以通过添加在[ESP]中显示双字
dd $csp L1
按上面的命令
问题是有相当多的电话,我只对某些电话感兴趣,并且在每个断点后手动跟踪它们既烦人又耗时
我仍然在使用WinDbg的语法。我的.if语句中的条件应该如何
我尝试了一些疯狂的事情,比如
.if( (dd $csp L1) == 2 )
但这显然是错误的
我还考虑过在[ESP]的值在局部变量中移动后在函数中的某个位置设置断点(类似于bp MyFunction+eip_after_赋值),但这有点太晚了。我想我可以解决这个问题,但如果我能在一开始就检查一下[ESP],事情就会简单一些 0:000>lsa.
2: int dummy=0;
3: void useless(int in) {
4: dummy=in;
5: }
> 6: void main(void) {
7: for(int i=0;i<0xffffffff;i++)
8: useless(i);
9: }
0:000>bl
0:000>bp 0040100b“。如果(poi(@$csp+8)!=1337){gc}”
0:000>.bpcmds
countfunc!useless [c:\countfunc.cpp @ 3]:
3 00401000 55 push ebp
3 00401001 8bec mov ebp,esp
4 00401003 8b4508 mov eax,dword ptr [ebp+8]
4 00401006 a320bb4000 mov dword ptr [countfunc!dummy (0040bb20)],eax
5 0040100b 5d pop ebp
5 0040100c c3 ret
bp0 0x0040100b ".if ( poi(@$csp+8) != 1337 ) {gc}";
0:000>g
> eax=00001337 ebx=7ffdf000 ecx=00001337 edx=0040c340 esi=00000000
> edi=0098f6ee eip=0040100b esp=0013ff68 ebp=0013ff68 iopl=0 nv
> up ei pl nz ac po cy cs=001b ss=0023 ds=0023 es=0023 fs=003b
> gs=0000 efl=00000213 countfunc!useless+0xb: 0040100b 5d
> pop ebp
0:000>??在int 0n4919
0:000>dv
in=0n4919
0:000>?0n4919/1
计算表达式:4919=00001337 在同一代码上稍微复杂一点的条件中断条件中断确实需要大量时间调试对时间敏感的代码可能会很有挑战性
0:000> r $t0 = 0; bp 0040100b ".if ( poi(@$csp+8) != @$t0*1337 ) {gc} .else { .echotime ;? poi(@$csp+8) ; r$t0 = @$t0+1 ;gc }"
0:000> .bpcmds
bp0 0x0040100b ".if ( poi(@$csp+8) != @$t0*1337 ) {gc} .else { .echotime ;? poi(@$csp+8) ; r$t0 = @$t0+1 ;gc }";
0:000> .echotime
Debugger (not debuggee) time: Tue Sep 30 12:12:15.890 2014
0:000> g
Debugger (not debuggee) time: Tue Sep 30 12:12:24.062 2014
Evaluate expression: 0 = 00000000
Debugger (not debuggee) time: Tue Sep 30 12:12:32.578 2014
Evaluate expression: 4919 = 00001337
Debugger (not debuggee) time: Tue Sep 30 12:12:41.093 2014
Evaluate expression: 9838 = 0000266e
Debugger (not debuggee) time: Tue Sep 30 12:12:49.609 2014
Evaluate expression: 14757 = 000039a5
Debugger (not debuggee) time: Tue Sep 30 12:12:58.156 2014
Evaluate expression: 19676 = 00004cdc
Debugger (not debuggee) time: Tue Sep 30 12:13:06.687 2014
Evaluate expression: 24595 = 00006013
Debugger (not debuggee) time: Tue Sep 30 12:13:15.218 2014
Evaluate expression: 29514 = 0000734a
Debugger (not debuggee) time: Tue Sep 30 12:13:23.765 2014
Evaluate expression: 34433 = 00008681
Debugger (not debuggee) time: Tue Sep 30 12:13:32.828 2014
Evaluate expression: 39352 = 000099b8
Debugger (not debuggee) time: Tue Sep 30 12:13:40.906 2014
Evaluate expression: 44271 = 0000acef
这个简单的代码可能需要86天才能完成,如果继续这样下去,在windbg中处理4919个函数调用似乎需要约8.5秒您可以尝试
。如果(poi($csp)==2)
,请?@Thomas W。这就是我要找的。谢谢现在所有的电话都会中断,但只有我感兴趣的电话会被计算在内。我想有一种方法可以在条件不满足时根本不中断?你的意思是像。if(condition){Commands}。else{g;}
?很抱歉,我现在无法尝试所有这些。这仍然会中断,但会进入else路径并发出continue命令。类似.if(条件){break}的东西。当有大量呼叫时,由于大量中断,系统会冻结几秒钟。现在不是什么问题,只是好奇而已。“我会玩弄一下EIP,看看我的结局是什么。”托马斯说。else分支应该使用gc
而不是g
,以便使用以前使用的相同执行类型继续执行。