windbg记录断点命中次数

前几天调试代码,需要跟踪代码运行状态并记录断点命中次数,windbg中没有找到这个功能,只能先用vs2013代替。事后我摸索了一下windbg中实现记录断点命中次数的方法。以下面这段程序为例:

int main()
{
	int i = 0;
	while (1)
	{
		i++;
		printf("i=%d\n",i);
		Sleep(200);
	}
    return 0;
}

我想在i++处设置断点并记录程序执行到断点的次数,首先在源码i++;处设置普通断点:

0:000> bl
     0 e Disable Clear  x86 00000000`00e3180e     0001 (0001)  0:**** hits!main+0x2e

bl列出断点信息,并记录断点所在的地址,此处位于hits!main+0x2e。之后将这个断点变为条件断点,并且每次遇到断点时借用伪寄存器执行加1(t0是伪寄存器):

0:000:x86> bp hits!main+0x2e ".printf \"hits=%d\n\",$t0;r @$t0=@$t0+1;gc"
breakpoint 0 redefined

如此,再次运行windbg就会在输出窗口输出命中次数:


再进一步,如果想让windbg在断点命中若干次后中断到用户交互界面,可以修改上述条件断点为:

0:003> bp hits!main+0x2e ".if(@$t0<120){.printf \"hits=%d\",@$t0;r @$t0=@$t0+1;gc;};.else{}"
breakpoint 0 redefined
0:003> g
hits=277hits=278hits=279hits=280hits=281hits=282hits=283hits=284hits=285hits=286hits=287hits!main+0x2e:
00e3180e 8b45f8          mov     eax,dword ptr [ebp-8] ss:002b:0133f898=00000125
0:000:x86> r $t0
$t0=00000120

猜你喜欢

转载自blog.csdn.net/lixiangminghate/article/details/80753571