windbg记录断点命中次数

本文介绍如何使用Windbg设置特殊断点来记录代码执行过程中断点的命中次数,并在达到特定次数后暂停程序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天调试代码,需要跟踪代码运行状态并记录断点命中次数,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
### 设置 WinDbg 断点 为了在 WinDbg 中为 `CreateFile` 函数设置断点,需要了解该函数位于哪个 DLL 文件中。通常情况下,`CreateFileW` 和 `CreateFileA` 是 Windows API 的一部分,存在于 kernel32.dll 或者其他核心库中。 可以在 WinDbg 命令窗口输入以下命令来查找确切位置: ```plaintext x kernel32!CreateFile* ``` 这会列出所有匹配的符号名称及其内存地址。对于 Unicode 版本(推荐),通常是 `kernel32!CreateFileW`;而对于 ANSI 版本,则是 `kernel32!CreateFileA`[^1]。 一旦确认了具体的函数名,就可以通过下面的方法之一为其设置断点: #### 方法一:使用 bp 命令直接设断点 假设要中断于 `CreateFileW` 调用处,在命令行键入如下指令即可实现目的: ```plaintext bp kernel32!CreateFileW ``` 此操作会在每次应用程序尝试执行这个特定版本的 `CreateFile` 时暂停调试器。 #### 方法二:利用 sxe 来捕获异常并自动附加到目标进程中 如果希望更灵活地控制何时触发断点,比如仅当某个条件满足时才停止运行,那么可以考虑采用软件事件扩展 (sxe) 功能配合条件表达式一起工作。不过这种方法相对复杂一些,适用于高级场景下的需求分析。 #### 示例代码片段展示如何设置简单的断点 ```plaintext 0:000> .sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols // 配置符号服务器路径 0:000> .reload // 加载最新符号信息 0:000> x kernel32!CreateFile* // 查找 CreateFile 相关符号 0:000> bp kernel32!CreateFileW // 对 CreateFileW 设定断点 0:000> g // 继续执行直到遇到设定好的断点 ``` 上述脚本首先设置了 Microsoft 符号文件下载目录,并重新加载了模块列表以确保能够获取最新的符号表数据。接着查询了所有可能的目标函数变体,并最终选择了其中一个作为实际打断的位置。最后让程序继续运行直至命中指定断点为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值