位置断点:

              就是普通的按F9设置的断点,没什么好说的.

 

临时改变变量值:

1)通过“即时窗口”(调试->窗口->即时),可以在程序运行过程中(当然是在断点状态下),临时改变某个变量的取值(比如在即时窗口中输入Width = 32,然后回车使其生效,左边局部变量会将改的值显示为红色)!

 

2)直接在局部变量的值上双击,再输入要改的值

3鼠标停留在要改的变量上,在弹出的变量值上单击,输入要改的值

 

 

优点:可以不必为调试变量的每一个取值而不停地终止测试/修改代码/重新调试,尤其当需要反复测试一个变量的正常取值时。

 

数据断点:

  注意,这个技巧仅对C++程序调试有效(或者说native程序),而且你只能在中断模式下才能设置数据断点,另外你还只能在本机设置数据断点。

  上一节的例子里,我们提到了,有的时候一个全局变量被修改了以后,你可能都找不到它是什么时候被修改的,于是夜已深,人已寐,你还在辛苦地调试到底是哪个鬼地方把这个变量的值修改了。F11, F10,……,SHIFT + F11,……,F5,靠,调过了,重来,F11,F10,……

  这种情况下,数据断点就很有用了,Visual Studio允许你在变量被修改的时候,中断程序的执行,是不是很酷?

  默认情况下,你是找不到数据断点这个菜单的,需要执行下面的步骤把它拉出来:

  1 打开你要调试的项目。

  2 点击Visual Studio菜单栏里面的“工具(Tools)”—“自定义(Customize…)”。然后在“自定义(Customize…)”窗口中选择“命令(Commands)”页签里面的“种类(Categories)”列表框里的“调试(Debug)”,找到“新数据断点(New Data Breakpoint)”,将它拖到菜单栏里面相应的位置。

  然后打开或者创建一个C++项目,我们以下面的源代码为例子:

#include "stdafx.h"

 

int g_Variable = 0;

 

int _tmain(int argc, _TCHAR* argv[])

{

        printf("Before modifying data breakpoints"n");

        g_Variable = 1;

        printf("After modifying data breakpoints"n");

        return 0;

}

我们现在要Visual Studio在更改g_Variable的时候中断程序的执行。

  1 单击F11,这样程序就会在_tmain函数里面中断了,我们也就有机会设置数据断点了。

  2 点击菜单里面的“新数据断点(New Data Breakpoint)”。注意,数据断点是通过监视内存地址某一段区域更改来实现的,因此你必须提供一个内存地址(或者说就是指针吧),这里g_Variable是一个整形变量,因此你需要使用“&g_Variable”的形式来创建一个数据断点,因为整形的 大小是4个字节,因此数据断点监视的区域是4个字节。


                                                              图3 断点监视区域
 
  3 继续程序的执行,这时会弹出一个对话框,告诉你有一个内存地址的内容发生了变化(说明我们的数据断点生效了),这时代码行指向的是数据被修改的下一行代码。


                                            图4 运行提示
  为什么数据断点只能在C++/C程序中才能设置?是因为托管代码有垃圾回收。而数据断点的执行原理应该是Windows内存管理里面的Guard Pages概念和VirtualProtectEx函数的实现。这个概念可以自己去查MSDN的内存管理方面的文档。

 

条件断点:

 今天在调一个漏洞修复的crash的时候,进入了一个很大的循环,循环不停地检测是否有当前漏洞,断点打在循环体里面,已知出问题的漏洞的KB号,但是如果要在刚好扫描到这个KB号的时候断下来,还有点小麻烦,我又不想改代码用if断下来,其实VS2005做到这个非常简单,设置条件断点就行了,在断点的右边(#add 不能刚好在断点图标上) 右键单击会弹出断点条件设置菜单:

 

 

     

 

      然后再点击 Condition... 输入条件 KBID == 977150,确定即可:

 

      这个里面还有一个Has changed选项,可以跟踪某个变量变化的情况下断下来,牛叉。

      菜单上还有其他的一些功能:

      1、HitCount...可以设置命中几次后,或命中次数是某数的倍数,或者命中次数大于某数时断下来(命中就是只执行到断点处)

      2、Filter...顾名思义,就是过滤,可以设置只有某些外部条件满足时才触发断点

      3、When Hit...根据英文意思是当断下来的时候,干嘛干嘛,可以打印一串字符串啊,×××的,还可以运行宏,太牛B了,不过我还没有深究怎么弄。要运行宏的话,是用vbs写的,并事先导入到vs2005里面。

 


 


 

posted on 2011-04-15 20:20  maxweii  阅读(3273)  评论(0编辑  收藏  举报