vs调试技巧

在我们写代码的时候常常会出现一些错误(逻辑上的错误),当你不知道这些错误怎么修改的时候就可以尝试进行调试

目录

1.调试的基本步骤

2.Debug和Release的介绍

3.快捷按键与功能详解

3.1 - F10逐语句执行

3.2 - F11逐过程执行

3.3 F5 - 调试 F9 - 设置/取消断点

4.调试过程中查看相关信息

4.1自动窗口

4.2临时变量

4.3监视

4.4内存

4.5反汇编

4.6寄存器

4.7调用堆栈


1.调试的基本步骤

  • 发现程序错误的存在

  • 以隔离,消除等方式对错误进行定位

  • 确定错误产生的原因

  • 提出纠正错误的解决办法

  • 对程序错误予以改正,重新测试

2.Debug和Release的介绍

Debug为调试版本,包含调试信息,并且不作优化,便于程序员调试程序

Release为发布版本,进行了各种优化,便于用户使用

如何确定是Debug版本还是Release版本

我们调试是要将环境改成Debug,Release环境下是没办法调试的

3.快捷按键与功能详解

  1. F5 - 开始调试
  2. ctrl+f5 开始执行(不调试)
  3. F9 设置断点/取消断点
  4. F10 逐过程 - 不会进入函数
  5. F11 逐语句 - 遇到函数会进入函数
  6. (F5是和F9配合使用的)

3.1 - F10逐语句执行


int main()
{
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ", i);
    }

    return 0;
}

这段代码是怎么执行的呢,我们来按F10,逐过程看看代码怎么运行

按了一次F10后可以看到开始运行了,现在光标的位置在红圈所在地方,说明代码运行到了这里

再按一次F10,就运行到了下一句,此时我们打开局部变量看看

打开之后我们可以看到,运行到这一步之后,就会创建一个变量i,类型是int

我们再按一次F10

运行到下一步的时候,就把i的值赋为0了,接下来是一个循环,我们来看看循环是怎么运行的

满足循环条件i < 10,进入循环,并执行语句printf("%d",i),此时会打印出0

再次按F10的时候,就会回到for语句,继续判断是否满足for循环的条件,满足则进入循环,不满足离开循环.

当i已经打印了1-9之后,i会变成10,在判断不满足for循环条件之后,就会离开循环,执行下一句

执行到return 0 之后,就结束程序了

以上代码我们测试了F10的功能是逐过程执行代码,我们可以一条一条的查看代码,当你的程序出现错误的时候,你就可以逐语句,看看程序运行的过程和你想象的过程是否一样,如果不一样,那到底是哪一部分的代码出现了问题

3.2 - F11逐过程执行

当我们遇到函数之后,如下面这段代码


void test()
{
    printf("hehe\n");
}

int g_val = 100;

int main()
{
    int i = 0;
    test();

    return 0;
}

当你想看看test函数是怎么运行的时候,F10逐过程就无法满足我们的需求了

当我们运行到此时位置的时候,我们再按一次F10

可以看到此时直接跳到了下一句,并在屏幕上打印了一个hehe,并没有进入test函数的过程,此时我们就可以使用F11来观察在test函数内部运行的情况

我们在刚刚那个位置按下一次F11之后,可以看到,光标出现在了test函数内部,此时再按F11

可以看到此时打印出来了一个hehe,光标停留在了void函数的右大括号处,我们再按一次F11

此时光标来到了return 0处,可以说明test()到return 0 之间还有很多步骤,按F10都没有执行,F11每一条都执行了.F11和F10的区别就在于,F11是逐语句执行,从程序开始到结束的代码每一条都会执行,会进入函数内部,F10是逐过程,不会进入函数内部

3.3 F5 - 调试 F9 - 设置/取消断点

当你想测试某一行的代码,但是按F10或者F11要很多次的时候,你可以添加一个断点

我们在34行的位置按F9添加一个断点,此时在34行左边出现了一个红色的小圆圈,这个就是断点

此时我们按F5开始调试,发现屏幕上打印出了hehe还有1-9,我们发现这其实是34行之前的代码打印出来的东西,此时光标停在了35行,还没有打印出10行hehe,也就是当我们设置断点之后,按F5运行,就会移动到下一个断点处,并运行前面所有的代码


当我们进入循环,如果循环有100次,你想找到第50次,断点应该怎么设置

第一步:先设置一个断点

第二步:在断点处右击鼠标,点击条件

第三步:选择条件表达式,并在后面输入i==50(不要写成i=50),意思就是断点设置的条件是满足i==50

当我们设置好之后来看看效果,按F5开始调试

我们发现,当i=50的时候果然停下来了

还有一种方法

我们将断点设置在if语句里面,当i=50的时候才会进入if语句内部,所以我们将断点设置在if语句内部,这样也能很好的找到第50个

4.调试过程中查看相关信息

要开始调试才能看到窗口里的相关信息

可以看到当我们打开窗口是可以看到很多东西,比如我们刚刚说过的局部变量,我们来看看几个比较重要的

4.1自动窗口

当我们的代码运行到第一个for循环的位置时,可以看到自动窗口中存在很多变量,你可能会觉得这个和局部变量很像,但是自动窗口会把上下文中的信息自动加入窗口,不好的地方是会自动删除,不够灵活

可以看到,当我们运行到第二个for循环语句时,自动窗口内的东西只剩下i了,如果我们想观察ch和arr的值时就不太方便

4.2临时变量

可以看到当前范围内创建的变量

当我们进入test函数中,就无法看到main函数中创建的变量了

4.3监视

监视需要手动输入你要监视的值,但是监视的范围比较大,你可以监视变量的地址,观察变量存储在哪个位置,可以观察数组每一个元素的值

4.4内存

当我们想查看一个数的存储位置时,可以打开内存

比如我们想查看arr数组的位置(arr是数组名,本身就是地址,如果是普通变量要加&)

然后按下回车键

可以看到此时内存arr的地址

此时内存窗口被分成三个部分,左边一栏显示的是内存单元的地址,中间存放的是内存中的信息,内存中本来放的是二进制的数据,为了方便显示,显示的时候用16进制,右边一栏是把内存中的信息解读一下,参考价值不高

4.5反汇编

查看c语言翻译对应的汇编代码

4.6寄存器

可以看到寄存器,以及运行时候的变化

4.7调用堆栈

栈:和子弹上膛一样,如果没满,可以直接往里面放,如果满了之后,要把后加进去的拿出来才能放进去(先进后出)

队列:和排队一样,出去一个,进来一个,队头走,队尾进来,这种对数据的增加和删除方式叫做队列(先进先出)

当我们运行main函数时会调用test,test会调用test1,test1会调用test2,使用调用堆栈窗口时,可以观察到函数调用逻辑是怎样的,当程序比较复杂时,通过调用堆栈可以清晰的观察到调用逻辑

  • 11
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Visual Studio是一款常用的集成开发环境,它提供了许多调试技巧和方法来帮助开发人员快速定位和解决问题。以下是一些常用的Visual Studio调试技巧: 1. 悬停鼠标查看表达式值:在调试过程中,你可以将鼠标悬停在代码中的表达式上,Visual Studio会显示该表达式的当前值,这对于快速检查变量的值非常有用。[1] 2. 使用Watch窗口:Watch窗口可以让你监视和跟踪变量的值。你可以在Watch窗口中添加你感兴趣的变量,并在调试过程中实时查看它们的值。[2] 3. 使用条件断点:条件断点允许你在满足特定条件时中断程序的执行。你可以在断点设置对话框中设置条件,当条件满足时,程序会在该断点处停止执行。这对于调试特定情况下的代码非常有用。 4. 使用调试输出:你可以在代码中插入调试输出语句,以便在调试过程中输出特定的信息。你可以使用`Debug.WriteLine`或`Trace.WriteLine`方法来输出信息,并在输出窗口中查看它们。 5. 使用调试工具:Visual Studio提供了许多强大的调试工具,如调试器窗口、内存窗口、线程窗口等。这些工具可以帮助你深入了解程序的执行过程,并找到潜在的问题。 6. 使用命令窗口:Visual Studio的命令窗口可以让你通过输入命令来自动化调试过程。你可以使用命令窗口执行一些简单的操作,如测试变量的值或执行特定的调试命令。[3] 这些是一些常用的Visual Studio调试技巧,它们可以帮助你更高效地进行调试工作,并节省大量的时间。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值