断点的操作以及跟踪点的设置
我们在一些调试的情景下,我们可能会出现这种情况:我们在程序中设置了断点 A、B、C、D,然后我们在一次调试中不想让断点 B、C 生效,但是在下一次调试中我们可能又需要使用断点 B、C,这回我们应该怎么办呢?
有同学会说了:我们不需要断点 B、C 的时候把断点 B、C 删除掉,需要的时候再设置一下就行了。这确实是个不错的想法,但是如果我们的工程很大呢?断点又分布在不同的地方,那我们该怎么办呢?
因为 Visual Studio 本身就是为大工程而生的,所以我们完全不用担心工程大的问题,其实在很多调试器中都包含了类似断点禁用的功能,Visual Studio 的 Remote Debugger 也不例外,我们可以通过暂时禁用断点来达到上述目的。
我们接下来通过下面这段代码来显示我们工作收入的正确打开方式,首先我们在第7行设置一个断点,然后按 F5 启动调试器。等待断点第一次被触发。
断点第一次被触发的时候,我们注意这个地方,我们使用鼠标右键单击它,并在弹出的菜单中选择禁用断点(D),这时断点行的图标也变成了,这就说明我们的断点被成功地禁用了。
接下来我们按 F5 继续被调试程序的运行,开启疯狂收入模式,资产增加的速度会越来越快哦。为了预防财富所带来的危险(土豪略过),我们需要将程序暂停,这时我们使用鼠标右键单击我们的断点图标,在弹出的菜单中选择 启用断点(L),这时我们的断点图标又变成了,这就说明我们的断点被成功地启用了。我们按 Shift + F5 终止调试。同样的,在编辑代码模式下我们也可以启用或禁用断点。断点的启用和禁用极大程度的方便了我们的调试操作。
在一些调试情境下,我们可能会碰到这样的情况,我们想让程序在运行到某个地方的时候输出一定的调试信息,比如当前正在执行的函数什么的。这时我们可以设置断点,查看堆栈,再按 F5 继续运行。但是这样是很麻烦的,我们需要不停地按 F5 ,不过不用担心,这里我们有更好的解决方案——使用跟踪点。
下面我们来了解一下跟踪点,什么是跟踪点呢?顾名思义,他是用来跟踪程序的。跟踪点和断点差不多,也是靠触发起作用的,唯一不同的是,它可以选择是否像调试窗口输出跟踪消息,并且可以选择是否暂停程序。所以我们可以把跟踪点当成是一类特殊断点。
我们来试试在 Visual Studio 编辑器中插入跟踪点,与插入断点一样,我们把插入光标移到想要插入跟踪点的位置,然后点击鼠标右键,在弹出的菜单中点击 断点(B) -> 插入跟踪点(T) ,我们可以看到这么个对话框:
我们看到,上面有很多提示信息,我们只要根据提示信息操作即可。比如在循环中我们常用到的打印消息:
这里是不是输出了跟踪信息呢,没错,跟踪点的使用就是这么简单,大家可以尝试使用跟踪点显示我们的 tempValue 变量的变化情况,体验跟踪点使用的酸爽!
有同学会说了:我们不需要断点 B、C 的时候把断点 B、C 删除掉,需要的时候再设置一下就行了。这确实是个不错的想法,但是如果我们的工程很大呢?断点又分布在不同的地方,那我们该怎么办呢?
因为 Visual Studio 本身就是为大工程而生的,所以我们完全不用担心工程大的问题,其实在很多调试器中都包含了类似断点禁用的功能,Visual Studio 的 Remote Debugger 也不例外,我们可以通过暂时禁用断点来达到上述目的。
我们接下来通过下面这段代码来显示我们工作收入的正确打开方式,首先我们在第7行设置一个断点,然后按 F5 启动调试器。等待断点第一次被触发。
#include <stdio.h> #include <stdlib.h> int main(){ for ( int i=1; i <= 500; i++ ) { printf("现在我有%d万元资产\n", 6666 * i); //TODO:在这里插入断点 _sleep(500 - i); } }
断点第一次被触发的时候,我们注意这个地方,我们使用鼠标右键单击它,并在弹出的菜单中选择禁用断点(D),这时断点行的图标也变成了,这就说明我们的断点被成功地禁用了。
接下来我们按 F5 继续被调试程序的运行,开启疯狂收入模式,资产增加的速度会越来越快哦。为了预防财富所带来的危险(土豪略过),我们需要将程序暂停,这时我们使用鼠标右键单击我们的断点图标,在弹出的菜单中选择 启用断点(L),这时我们的断点图标又变成了,这就说明我们的断点被成功地启用了。我们按 Shift + F5 终止调试。同样的,在编辑代码模式下我们也可以启用或禁用断点。断点的启用和禁用极大程度的方便了我们的调试操作。
在一些调试情境下,我们可能会碰到这样的情况,我们想让程序在运行到某个地方的时候输出一定的调试信息,比如当前正在执行的函数什么的。这时我们可以设置断点,查看堆栈,再按 F5 继续运行。但是这样是很麻烦的,我们需要不停地按 F5 ,不过不用担心,这里我们有更好的解决方案——使用跟踪点。
下面我们来了解一下跟踪点,什么是跟踪点呢?顾名思义,他是用来跟踪程序的。跟踪点和断点差不多,也是靠触发起作用的,唯一不同的是,它可以选择是否像调试窗口输出跟踪消息,并且可以选择是否暂停程序。所以我们可以把跟踪点当成是一类特殊断点。
我们来试试在 Visual Studio 编辑器中插入跟踪点,与插入断点一样,我们把插入光标移到想要插入跟踪点的位置,然后点击鼠标右键,在弹出的菜单中点击 断点(B) -> 插入跟踪点(T) ,我们可以看到这么个对话框:
我们看到,上面有很多提示信息,我们只要根据提示信息操作即可。比如在循环中我们常用到的打印消息:
函数:$FUNCTION , 变量值 i 的值为 {i}
接下来我们使用跟踪点来跟踪冒泡排序算法的数据交换过程。我们在 Visual Studio 中新建一个工程,输入如下代码:#include <stdio.h> void genBubbleSort(int prevArray[] , int arrayLength){ int p , n , tempValue; for (n = 0 ; n < arrayLength - 1 ; n++){ for (p = 0; p < arrayLength - 1 - n; p++){ if (prevArray[p] > prevArray[p + 1]) { //数据交换 tempValue = prevArray[p]; prevArray[p] = prevArray[p + 1]; prevArray[p + 1] = tempValue; //TODO:插入断点 } } } } int main(){ int myArray[10] = { 127 , 325 , 1235 , 7768 , 844 , 651 , 5424 , 102 , 318 , 907 }; int arraySize = 10; printf("!原始数组:\n"); for (int i = 0 ; i < arraySize ; i++){ printf(" -> 第%d项 : %d " , i + 1 , myArray[i]); printf("\n"); } genBubbleSort(myArray , arraySize); printf("!冒泡排序后的数组:\n"); for (int i = 0 ; i < arraySize ; i++){ printf(" -> 第%d项 : %d ", i + 1 , myArray[i]); printf("\n"); } getchar(); }上面这就是一个典型的冒泡排序算法的实现了。现在我们在第8行插入跟踪点,我们打印如下信息(花括号里的是我们想要查看的变量的值)。
函数:$FUNCTION 数组第{p}项:{prevArray[p]}> 数组第{p+1}项{prevArray[p+1]} 进行交换
我们通过调试器调试这个程序可以看到冒泡排序的过程,现在我们按 F5 启动调试器开始运行,这时我们查看输出窗口:这里是不是输出了跟踪信息呢,没错,跟踪点的使用就是这么简单,大家可以尝试使用跟踪点显示我们的 tempValue 变量的变化情况,体验跟踪点使用的酸爽!