C/C++程序的断点调试 - Visual Studio Code

news2024/11/30 6:47:38

本文以Visual Studio Code为例,简述C/C++程序断点调试的基本方法和过程。其它的IDE环境,大同小异。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

1. 简介

在程序有BUG/缺陷,需要修复时,断点调试是发现缺陷的重要方法。对于初学者而言,断点调试还有另外一个用途:帮助理解程序背后的逻辑。

本文以Visual Studio Code为例,简述C/C++程序断点调试的基本方法和过程。其它的IDE环境,大同小异。

在进行后续调试试验前,需要先对Visual Studio Code的C/C++编译开发环境进行配置。详细过程请参见下述链接:http://codelearn.club/2022/09/vsccpp/

2. 程序代码

在Visual Studio Code中创建一个纯C语言的代码文件DebugExample.c,然后录入如下代码:

//Project - DebugExample
#include <stdio.h>
#include <stdbool.h>

bool isPrime(int n) {     //函数的定义
    if (n<=1)
        return false;
    for (int i=2;i<n;i++)
        if (n % i == 0)
            return false;

    return true;
}

int main(){
    printf("Try to find all prime number(<=10):\n");

    int iFound = 0;       //发现的质数个数
    for (int i=2;
         i<=10;
         i++)
    {
        if (!isPrime(i))
            continue;
        iFound++;
        printf("%d, ",i);
    }

    printf("\n%d prime numbers been found.",iFound);
    return 0;
}

在作者的机器上,该文件被存放在D:\TEMP目录下。

上述程序的用途在于找出2 ~ 10之间的全部质数并打印出来。请读者注意第19 ~ 21行,for循环的初始化语句,测试表达式,更新表达式故意分作了三行,以便于观察。

3. 断点

在这里插入图片描述

在第18行代码的行号左边单击鼠标,便会出现如图所示的断点(break point),在相同位置再次单击,断点便会消失。可以给同一段程序添加多个断点。

4.调试

在这里插入图片描述
在打好断点后,选择菜单Run-Start Debugging(F5)开始调试。在这里插入图片描述
此处依提示选择了C++(GDB/LLDB)。
在这里插入图片描述
此处选择了第一项:C/C++: gcc.exe生成和调试活动文件。
在这里插入图片描述
与正常的程序运行不动,程序并没有“一口气”从头执行到尾,而是暂停在了第18行的断点处。图中的黄色箭头表明程序的当前执行点,准确地说,箭头所指的行是接下来准备执行的代码行。

在窗口的左上角,VARIABLES(变量)项上列出了程序当前执行阶段的局部变量的名称及当前值。可以看到,此时有iFound变量存在,其值为0。

注意:此时iFound的0值是不确定的,事实上,0到iFound的赋值尚未执行。
在这里插入图片描述
此外,主界面上还会出现一个工具条,其名称依次是Continue, Step Over, Step Into, Step Out, Restart 以及Stop。这些按钮均有快捷键与之对应,详情请查看Run菜单。
在这里插入图片描述
点击Step Into(单步进入),可以看到第18行被执行,黄色箭头指向第19行。此时,for循环内的局部变量i出现在左侧列表中。请读者注意此时i的当前值为0,而不是2,因为for循环的初始化语句尚未执行。

注意:在变量没有被初始化前,其值是不确定的,所以读者真实调试时,得到的值很可能不是0。
在这里插入图片描述
再次点击Step Into,第19行被执行,可见左侧列表中的i值变成了2。黄色箭头来到了第20行,这是for循环的条件判断表达式。
在这里插入图片描述
继续按下Step Into,for循环在进行了条件判断后,准备执行循环体,黄色箭头来到第23行。

第23行涉及一次函数调用,如果操作者希望观察isPrime( )函数内部的执行过程,应按Step Into。如果操作者不关心isPrime( )内部的执行过程,只关心23行的总体执行结果,则按Step Over。本次,我们按Step Into。
在这里插入图片描述
按下Step Into后,我们进入到了isPrime( )函数内部,黄色箭头指向第6行。对于isPrime( )函数而言,当前其局部变量仅有1个,即函数的形式参数n。该参数的值应由调用者传递进来。在右方的列表中,我们看到该值为2。
在这里插入图片描述
一直按Step Into,直到isPrime( )函数返回,由于2是质数,所以第23行的不是质数的条件不成立,第24行不会被执行,黄色箭头略过了第24行,指向了第25行。
在这里插入图片描述
再次按Step Into后,第25行被执行,iFound由0变1,黄色箭头指向第26行。
在这里插入图片描述
一直按Step Over进行循环,直到i = 4且黄色箭头指向第23行。
在这里插入图片描述
本次我们选择不进入isPrime()函数,再次按下Step Over。由于i=4不是质数,因此第23行的条件成立,黄色箭头跳转到第24行的continue语句。

根据continue的语义,其将略过本轮循环的剩余语句(第25 ~ 26行),直接尝试下一轮循环。
在这里插入图片描述
按下Step Into,可以看到,continue直接略过了第25 ~ 26行的剩余循环代码,直接跳到了for循环的更新表达式,如图中红色箭头所示。
在这里插入图片描述
按下Step Into, 可以看到更新表达式被执行,i值由4变成了5,黄色箭头指向了第20行,该行将进行循环测试(i <= 10),如果测试通过,则将执行循环体,否则循环结束。

5.观察输出

在这里插入图片描述
在程序调试过程中,随时可在下面工具栏中切换至TERMINAL(终端)页,该页面中展示了程序当前执行阶段的全部输出。如果程序在执行过程中需要读取输入,也应在该页录入。

可以看到,2,3两个质数已被找出,4是合数被略过,正准备考察整数5。

6. 去除断点

如果调试的目的已达成,准备放弃调试,可以再次单击红色断点将其取消,如下图:
在这里插入图片描述
在这里插入图片描述
此时,可以选择Continue (继续执行,F5),在没有断点的情况下将程序执行完;也可以选Stop Debugging,强行中止程序的执行。

7. 继续执行

取消断点后,我们选择了继续执行。程序执行完成后,IDE中与调试相关的箭头,局部变量列表等均消失不见,恢复至常规编辑界面。
在这里插入图片描述
在Terminal页,我们看到程序的全部执行结果。

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
Python编程基础及应用
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频特效如何制作?快把这些方法收好

小伙伴们平时刷短视频的时候&#xff0c;有没有发现一些短视频的效果很惊艳。这些惊艳的效果&#xff0c;大部分都是在视频中添加的一些动画特效。那你们知道手机视频怎么添加特效吗&#xff1f;为了帮助大家解决这个问题&#xff0c;接下来我就将为大家分享几种添加特效的方法…

架构高可用之限流-抽刀断水水更流

上图中是一个水坝泄洪的图&#xff0c;那么&#xff0c;对于软件系统&#xff0c;如何使用最方便的可编程的方式增加服务限流能力呢&#xff1f; 下面我结合一个常规的springCloud项目实践了一把&#xff0c;希望他山之石可以攻玉。 背景 简单使用jmeter&#xff0c;压20个并…

FL Studio21.0.0完整版最高版本升级功能有哪些?

支持苹果 Silicon 芯片 – 对苹果 Silicon 芯片&#xff08;M1 芯片以及相关 CPU&#xff09;的原生 ARM 代码支持&#xff0c;但请注意&#xff1a; NewTime、NewTone 和一些 DirectWave 采样格式的导入功能尚未完全重构可能会有问题。 FL Studio-win21中文更新下载如下: htt…

新通药物被暂缓审议:科创属性遭质疑,招股书“数据打架”

12月12日&#xff0c;上海证券交易所披露的信息显示&#xff0c;西安新通药物研究股份有限公司&#xff08;下称“新通药物”&#xff09;的首发申请被暂缓审议。据贝多财经了解&#xff0c;新通药物于2021年12月6日在科创板递交招股书&#xff0c;计划募资12.79亿元。 科创板上…

识破贷后资金归集——关联网络

近几年&#xff0c;金融机构为了扩大信贷规模&#xff0c;抢占市场份额&#xff0c;通过贷款将贷款发放给无法直接通过金融机构获得贷款的个人或者企业&#xff0c;但这也给金融机构带来了多重风险。 首先&#xff0c;我们来看下资金归集是什么。所谓资金归集&#xff0c;是银…

GCSE英语语言考试-语言和结构

Language语言 Example of a simile from The Hunger Games, Suzanne Collins 《饥饿游戏》中的比喻例子&#xff0c;苏珊娜-柯林斯的作品 When talking about language in prose fiction, there are a number of things you could look for: 在谈论散文小说的语言时&#xff0c…

如何在XMLMap端口修改字段映射?

在使用知行EDI系统的过程中&#xff0c;我们经常会用到XMLMap端口进行数据转化&#xff0c;XMLMap端口可以通过拖拽方式进行字段取值映射&#xff0c;同时也可以写代码添加字段对应的取值及判断条件。有时在完成映射后&#xff0c;发现源文件/目标文件待映射的字段和段落需要添…

安卓玩机搞机技巧综合资源-----闲置手机当摄像头 当监控 上网课必备 多软件评测【十四】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

为什么不能使用bigdecimal的equals比较大小

BigDecimal&#xff0c;相信对于很多人来说都不陌生&#xff0c;很多人都知道他的用法&#xff0c;这是一种 java.math 包中提供的一种可以用来进行精确运算的类型。 很多人都知道&#xff0c;在进行金额表示、金额计算等场景&#xff0c;不能使用 double、float 等类型&#…

一键登陆了解一下

我们先来看一下目前的一些登录方式&#xff1a; 账号、密码登陆 使用账号加密码是最传统的登录方式&#xff0c;可以说是简单粗暴的&#xff0c;一般也不会出现什么问题。 缺点 但这种方式要求用户要记住自己的账号和密码&#xff0c;也就是有一个记忆成本。用户为了降低记忆…

【Tryhackme】KoTH Food CTF(前端验证绕过,图片隐写,SUID提权:vim.basic)

免责声明 本文渗透的主机经过合法授权。本文使用的工具和方法仅限学习交流使用&#xff0c;请不要将文中使用的工具和渗透思路用于任何非法用途&#xff0c;对此产生的一切后果&#xff0c;本人不承担任何责任&#xff0c;也不对造成的任何误用或损害负责。 服务发现 ┌──(r…

学习管理系统五大好处

正如我们先前提到过的&#xff0c;对于公司来说&#xff0c;建立“学习型文化”可以带来许许多多的好处。然而&#xff0c;企业规模会越来越大&#xff0c;员工的培训学习需求并不会减少&#xff0c;这也会为企业的员工培训带来压力。学习管理系统&#xff08;LMS&#xff09;可…

GCSE英语语言考试-对虚构小说的问题作答

How to analyse a fiction extract 如何分析虚构小说节选 In an analytical response, you should show how language and structure create meaning. You could also explore the effect on the reader. An analytical response uses evidence from the text to make clear po…

教育培训机构教学课程内容视频加密是如何做的?

阿酷TONY / 2022-12-13 / 长沙 / 原创组图 / 内容含实测链接可测效果 教育培训机构教学课程内容视频加密是如何做的&#xff1f;教育机构的web课程视频加密是如何实现的&#xff1f;主要通过以下的一些方式来实现&#xff1a; 目录&#xff1a; 1、VRM加密 2、播放器加密…

年终总结才是职场人的天花板,学会这4个技巧,让绩效轻松翻倍

作为2022年的最后一个月&#xff0c;不少人正在或即将的年终总结怎么写愁掉了头发。今天老李就给大家分享几个如何做出领导爱看&#xff0c;绩效翻倍的年终总结的方法或套路。 方法一&#xff1a;列完大纲再填充 很多人一上来就罗列工作内容&#xff0c;写到最后看着字数不少…

在小程序中如何使用svg图标

1.首先找到一个能够下载svg图标的网站&#xff0c;例如iconfont或iconpark。 Tip:图标网址iconpark&#xff1a;ByteDance IconPark 2.选择好点击批量下载&#xff0c;下载一个压缩包。将下载后的压缩包解压之后就是我们选择下载的svg文件。如下图 3.打开将svg文件转成base64的…

RabbitMQ的发布确认

文章目录前言&#xff1a;为什么要用发布确认一、发布确认原理二、发布确认的策略2.1 开启发布确认的方法2.2 单个确认发布2.3 批量确认发布2.4 异步确认发布如何处理异步未确认消息以上 3 种发布确认速度对比前言&#xff1a;为什么要用发布确认 答&#xff1a;持久化章节中&…

在word文档表中插入图片不变形

在word文档表中插入图片不变形 目录 在word文档表中插入图片不变形 1、点击左上角【全选图标 】选中表格&#xff0c;鼠标右键点击【表格属性】 2、点击【选项】点击 取消勾选【自动重调尺寸以适应内容】&#xff0c;最后点击【确定】 ​3、依次点击【插入】【图片】点击图片…

【TSP问题】基于蜜蜂算法求解旅行商问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

安全数据资产统一管理

安全数据资产 统一管理DataOps&#xff0c;即 Data 和 Operations 的集成&#xff0c;于 2014 年首次提出。Gartner 将 DataOps 定义为“一种协作性的数据管理 实践&#xff0c;专注于改进组织内数据管道的通信、集成和自动化”[7]。DataOps 是一种面向流程的自动化方法&#x…