调试基础知识:断点

更新:2007 年 11 月

本主题适用于:

版本

Visual Basic

C#

C++

Web Developer

速成版

主题适用 主题适用 主题适用 主题适用

标准版

主题适用 主题适用 主题适用 主题适用

专业团队版

主题适用

主题适用

主题适用 主题适用

表格图例:

主题适用

适用

主题不适用

不适用

主题适用,但命令默认情况下隐藏

默认情况下隐藏的一条或多条命令。

断点是一个信号,它通知调试器,在某个特定点上暂时将程序执行挂起。当执行在某个断点处挂起时,我们称程序处于中断模式。进入中断模式并不会终止或结束程序的执行。执行可以在任何时候继续。

断点模式可以看作一种超时。所有元素(例如,函数、变量和对象)都保留在内存中,但它们的移动和活动被挂起了。在中断模式下,您可以检查它们的位置和状态,以查看是否存在冲突或 bug。您可以在中断模式下对程序进行调整。例如,可以更改变量的值。可以移动执行点,这会改变执行恢复后将要执行的下一条语句。在 C++、C# 和 Visual Basic 中,甚至可以在中断模式下对代码本身进行更改(使用一种称为“编辑并继续”的强大功能)。

断点提供了一种强大的工具,使您能够在需要的时间和位置挂起执行。与逐句或逐条指令地检查代码不同的是,可以让程序一直执行,直到遇到断点,然后开始调试。这大大地加快了调试过程。没有这个功能,调试大的程序几乎是不可能的。

许多编程语言都有用于挂起执行并使程序进入中断模式的语句或构造。例如,Visual Basic 有 Stop 语句。断点不同于这些语句,因为它不是必须添加到程序中的实际源代码。您不必在源代码窗口中键入断点语句。只需通过调试器界面请求断点,由调试器加入断点。要插入行断点,请在要设置断点的行旁边的灰色空白中单击。利用全功能的“断点”窗口,可以处理更复杂的断点。

相对于调试构造(如 Visual Basic 的 Stop 语句),断点具有很多优点。不必改动程序源代码就可以删除或更改断点。由于断点不是语句,当生成程序的发行版时,它们不会产生额外的代码。如果在程序中使用 Stop 语句,则需要在生成发行版本之前手动删除 Stop 语句,或者使用如下所示的条件句式:

#If DEBUG Then
    Stop
#End If

如果想暂时禁用 Stop 语句,需要在源代码中找到该语句并对它进行注释:

 ' Stop

如果只有一条 Stop 语句,这样做当然没问题。但是,如果调试的是具有许多 Stop 语句的大型程序,搜索所有这些语句并对其中每一个进行注释可能相当耗时。利用断点,就可以在“断点”窗口中选择并禁用或启用任何或全部断点。

最后,相对于 Stop 语句而言,断点在灵活性方面具有很大的优势。Stop 语句使得执行在源代码行中该语句所在的位置中断。而在源程序中设置断点同样可以做到这一点。您也可以选择在函数或内存地址处设置断点,而这是使用 Stop 语句无法做到的。除这些位置断点外,Visual Studio 调试器还提供仅限于本机使用的数据断点。数据断点是设置在某个全局变量或局部变量上的断点,而不是在代码中的某一位置上。设置数据断点会使程序在该变量值发生更改时中断执行。

为提供更大的灵活性,Visual Studio 调试器使您能够设置属性以修改断点的行为:

  • Hit Count 使您能够确定在调试器中断执行之前命中断点的次数。在默认情况下,每次命中断点,调试器就中断执行。通过设置命中次数,您可以让调试器每命中两次断点中断执行一次,也可以每 10 次、每 512 次或任意选择的次数中断一次。程序中的某些 bug 不会在第一次执行循环、调用函数或访问变量时显现出来,这时候命中次数设置就很有用了。有些时候,bug 直到重复 100 次或 1000 次时才显现出来。此时可以设置命中次数为 100 或 1000 以解决问题。

  • Condition 是一个表达式,它确定断点是命中还是跳过。当调试器到达该断点时,它会计算条件的值。只有当条件满足时,断点才会命中。可以在某个位置断点处设置条件,只有当条件为真时,才会中断执行。例如调试一个银行程序,其中的帐户余额不允许小于零。可以在代码中的某些位置设置断点并附加以下条件:balance < 0。运行程序时,当余额小于零时,执行就会在这些位置中断。然后,就可以在第一个断点处检查变量和程序状态,再继续执行到第二个断点位置,如此继续。

  • Action 指定在命中断点时应执行的操作。默认情况下,调试器中断执行,但是您可以选择打印一条消息或者运行一个 Visual Studio 宏。如果选择打印消息而不是中断,则断点的效果与 Trace 语句非常类似。这种使用断点的方法称为跟踪点。

  • Filter 提供了一种为断点指定进程或线程的方法。

    说明:

    一个特别有用的技巧是在“调用堆栈”窗口中设置断点。使用“调用堆栈”窗口,您可以在特定的函数调用处设置断点。在调试递归函数(调用自身的函数)时,这个功能尤其有用。如果在一定次数的调用后中断执行,可以使用“调用堆栈”窗口在先前发出而尚未返回的调用中设置断点。调试器会在退出当前的调用过程中遇到该断点并中断执行。

请参见

任务

如何:使用“断点”窗口

概念

断点与跟踪点

断点与跟踪点

其他资源

调试器指南