条件断点(condition breakpoint)的是指在上面3种基本断点停下来后,执行一些自定义的判断。

在基本断点命令后加上自定义调试命令,可以让调试器在断点触发停下来后,执行调试器命令。每个命令之间用分号分割。

语法格式如:

0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "

0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"

这两条是等价的.

当然

.if

{

}

.else

{

}

更好理解.

0:000> bp `mysource.cpp:143` "j (poi(MyVar)>0n20) ''; 'gc' " 
0:000> bp `mysource.cpp:143` ".if (poi(MyVar)>0n20) {} .else {gc}"

若MyVar大于20则不stop,

否则stop下来进行调试.

MyVar符号表示符号所在的内存地址,而不是符号的数值,相当于C语言中的 &操作符的作用。Windbg命令poi的作用是取这个地址上的值,相当于C语言中的*操作符.因此这里取得MyVar的值.

伪寄存器,帮助保存调试的中间信息

考虑这样的情况,如果要记录某一个函数被执行了多少次,应该怎么做?简单的做法就是修改代码,在对应的函数入口做记录。可是,如果要记录的函数是系统API呢?

设置寄存器   条件断点

当eax内的值为0xa3时断点Sop. 没问题,Hah.

0:000> bp mydriver!myFunction "j @eax = 0xa3  '';'gc'" 
0:000> bp mydriver!myFunction ".if @eax = 0xa3  {} .else {gc}"

但以下就不一定了,当eax中人值为0xc0004321时,

不一定会断下来.

为什么呢?

原因是内核态时,MASM会对EAX中的值进行符号扩展.

那么0xc0004321  会变成0xFFFFFFFFc0004321 

这样当然断不下来啦。

0:000> bp mydriver!myFunction "j @eax = 0xc0004321  '';'gc'" 
0:000> bp mydriver!myFunction ".if @eax = 0xc0004321  {} .else {gc}"

如何处理呢?看看下面就知道了.

0:000> bp mydriver!myFunction "j (@eax & 0x0`ffffffff) = 0x0`c0004321  '';'gc'" 
0:000> bp mydriver!myFunction ".if (@eax & 0x0`ffffffff) = 0x0`c0004321  {} .else {gc}"

爽吧,高位清0!

下面的命令可以统计VirtualAllocEx被执行了多少次:

bp /1 /c @$csp @$ra;g

bp kernel32!VirtualAllocEx "r $t0=@$t0+1;.printf /"function executes: %d times /",@$t0;.echo;g"

这里用到的$t0就是Windbg提供的伪寄存器。可以用来存储中间信息。这里用它来存储函数执行的次数。r命令可以用来查看,修改寄存器(CPU寄存器和Windbg的伪寄存器都有效)的值。随便挑一个繁忙的进程,用这个命令设定断点后观察:

0:009> bp kernel32!VirtualAllocEx "r  $t0=@$t0+1;.printf  
/"function executes: %d times /",@$t0;.echo;g"
0:009> g
function executes: 1 times
function executes: 2 times 
function executes: 3 times 
function executes: 4 times

哈哈,这确实是一个好方法.

Windbg设置条件断点相关推荐

  1. Pycharm设置条件断点

    参考   Pycharm设置条件断点 - 云+社区 - 腾讯云 我们通常在调试程序的时候会遇到大块的循环,如果都运行很浪费时间,使得调试很麻烦,这时候可以使用条件断点技巧,下面用一个例子来说明条件断点 ...

  2. gdb 笔记(03)— 某一行设置断点、为函数(单个唯一函数、多个同名函数、使用正则)设置断点、设置条件断点、设置临时断点

    断点 breakpoint,即为了调试的需要,在程序中设置一些特殊标志,代码执行到这些具有特殊标志的位置时会暂停.一旦程序暂停,我们就可以查看或者修改程序运行的一些信息,比如内存信息.堆栈信息等,并且 ...

  3. WinDBG中设置条件断点

    条件断点:断点指令 + "j(Excecute If-Else) 和 gc (Go from Conditional Breakpoint)" 形如:bp Address &quo ...

  4. 图解 windbg设置符号文件路径和使用入门

    下载下来的windbg如下,有三个版本,x86,x64,汉化: 进入如下网址,选择合适版本的符号文件: 查看本机系统版本:选择Win7 Service Pack 1的版本下载: 下载后的符号文件安装包 ...

  5. 将windbg设置为默认调试器命令

    前提条件:安装好windbg软件(默认安装位置) 以截取组态王运行系统崩溃为例: 64位系统 0.文件更新替换 将Touchvew.exe以及Touchvew.pdb覆盖替换C:\Program Fi ...

  6. Eclipse设置条件断点

    如图

  7. [转]两个经典的windbg调试案例,值得学习。

    1. 调试Bug的神兵利器:通过WinDbg条件断点收集Log 原文地址:http://blogs.msdn.com/yizhang/archive/2009/03/30/bug-windbg-log ...

  8. windbg+VM 设置内核调试环境(双机调试)

    虚拟机是XP情况: 启动项添加调试启动,并设置波特率为115200 具体操作可在boot.ini中添加如下代码: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS ...

  9. windbg 脚本学习总结

    windbg 脚本简单入门 http://blog.csdn.net/superliuxing/article/details/19206985 Windbg的功能自然不必说,集内核调试,应用程序调试 ...

最新文章

  1. 终于有人把计算机视觉讲明白了
  2. 怎么把页面内容填满一页_Excel表格太宽,一张纸打印不下,两张纸又空太多!怎么办?...
  3. linux启动phpstudy,phpstudy启动不了解决方法
  4. oracle主键增长方式,oracle 自增长主键
  5. 通过History Trends Unlimited通过统计服务器上Edge浏览器Top10网页历史访问量(2021.11.23)
  6. Java开发技巧——并发控制中的乐观锁与悲观锁
  7. 送福利 | 送书5本《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发
  8. Spark中RDD与DataFrame与DataSet的区别与联系
  9. 统计信息自动更新导致查询超时
  10. linux安装qt4 creator,ubuntu14.04下安装qt4.8.6 +qt creator
  11. php 代付功能_常见的第三方支付平台代付接口(php源码)
  12. 基于F340 实现Bridge功能(二):上位机应用程序编写
  13. Apache虚拟主机配置
  14. 协同开发 ----以码云为例
  15. java matlab 遗传算法_简单遗传算法MATLAB实现
  16. 华为mate50pro和华为p50pro哪个好
  17. 人脸识别之表情识别(七)--面部表情识别阶段综述
  18. 解决Windows下cmder中使用babun运行conda命令报错TypeError: LoadLibrary() argument 1 must be str, not None
  19. zzulioj 1029: 三角形判定
  20. 特殊人群康复新途径:虚拟现实技术来帮忙

热门文章

  1. RGB_YUV_YCbCr
  2. 使用WC“.NET研究”F实现SOA面向服务编程——简单的WCF开发实例
  3. 微软聘请游说公司为收购雅虎作势
  4. 知识点030-邮件告诉自己备份是否成功
  5. 打开AD组策略编辑器提示“strings区段项目太长被截断”的解决
  6. Spring Cloud Zuul
  7. 关于windows service不能访问网络共享盘(NetWork Drive)的解决方案
  8. 第30本:《怎样解题》
  9. 升级TortoiseSVN-1.9.0.26652-x64-svn-1.9.0导致错误提示
  10. mysql 同步备份数据库