1.4 C 程序的编译过程与 CLion 调试技巧

news2024/11/15 9:40:48

目录

1 程序的编译过程

1.1 编写源代码

1.2 预处理(Preprocessing)

1.3 编译(Compilation)

1.4 汇编(Assembly)

1.5 链接(Linking)

1.6 执行

2 编译过程的输入输出文件概览

3 断点及调试窗口设置

4 什么是调试


程序的编译过程

        程序的编译过程是一个从人类可读的源代码转换为计算机可直接执行的机器代码的过程。这个过程大致可以分为以下几个步骤,以 C 语言程序(如 main.c )为例来说明:

1.1 编写源代码

        程序员使用文本编辑器(如 Notepad++、Vim、Sublime Text 或专门的 IDE 如 CLion、Visual Studio、Visual Studio Code、Xcode、Eclipse 等)编写源代码,这些源代码文件通常具有特定的扩展名,如 .c 对于 C 语言。

1.2 预处理(Preprocessing)

        编译器在编译之前,首先会进行预处理。这一步会处理源代码中的预处理指令,如包含头文件(#include)、宏定义(#define)、条件编译(#ifdef、#ifndef、#endif)等。预处理后,生成一个包含了所有必要信息的新文件,但通常这个步骤的输出文件对程序员不可见

1.3 编译(Compilation)

        经过预处理后的代码会被编译器进一步处理,即编译过程。编译器将源代码转换成汇编语言代码(Assembler code),这一步是源代码到机器码的中间步骤。汇编语言是一种低级语言,比机器码稍高级,但仍然是针对特定 CPU 架构的。

1.4 汇编(Assembly)

        汇编器将汇编语言代码转换成机器码(Machine Code),即 0 和 1 的序列,这是 CPU 能直接执行的指令集。这一步生成的机器码是特定于目标平台(如 x86、ARM 等)的。

1.5 链接(Linking)

        如果程序中使用了外部库或定义了多个源文件( .c 文件),则需要进行链接。链接器将多个目标文件(Object Files,即 .o 或 .obj文件,它们是编译和汇编过程的结果)以及所需的库合并成一个可执行文件(在 Windows 下通常是 .exe,在 Unix/Linux/Mac 下通常是没有扩展名的)。链接过程中还会解决程序中的函数调用、变量引用等依赖关系。

1.6 执行

        生成的可执行文件可以被加载到内存中,由 CPU 执行。在操作系统中,这通常通过双击文件图标、在命令行中输入文件名并回车或使用操作系统的其他机制来完成。


编译过程的输入输出文件概览

步骤输入文件(含后缀名)输出文件(含后缀名)
1. 预处理(Preprocessing)hello.c(C语言源代码文件)hello.i(预处理后的源代码文件,有时直接跳过此步骤的显式输出,但内部处理是存在的)
注意:在某些编译环境中,预处理后的文件可能不会被显式地保存为 .i 文件,而是直接在内存中处理。但为了说明过程,这里假设它存在。
2. 编译(Compilation)hello.i(预处理后的源代码文件,或直接从 hello.c 进入此步骤)hello.s(汇编语言源代码文件)
3. 汇编(Assembly)hello.s(汇编语言源代码文件)hello.o(目标代码文件,二进制形式)
4. 链接(Linking)hello.o(目标代码文件) + 其他目标代码文件/库文件hello(或 hello.exe,在 Windows 系统下)可执行文件(二进制形式)

注意

  1. 在某些编译环境中,特别是当使用集成开发环境(IDE)时,预处理后的文件(.i)和汇编语言源代码文件(.s)可能不会被显式地生成和保存。这些步骤通常在内部完成,并且用户只能看到最终的输出(即可执行文件)。

  2. 在 Windows 系统下,最终的可执行文件通常具有 .exe 扩展名,而在 Unix/Linux 系统下,则可能没有特定的扩展名,或者使用如 .out 的扩展名(这取决于具体的编译器和链接器设置)。

  3. 链接阶段还可能涉及生成其他类型的文件,如符号表、重定位信息等,但这些文件通常不是最终用户直接关心的内容。

  4. 上述过程是一个简化的描述,实际的编译过程可能更加复杂,包括优化、调试信息生成等多个子步骤。然而,从文件输入输出的角度来看,上述归纳已经涵盖了主要的内容。

        在 Linux 终端中使用 gcc 编译 C 语言程序的不同方法:


        1.偷懒法
        gcc hello .c
        默认生成 a.out
        起不到见名知意的作用  不建议!
    
        2.分步法
        预处理:gcc -E hello.c -o hello.i
        编译:   gcc -S hello.i -o hello.s
        汇编:   gcc -C hello.s -o hello.o
        链接:   gcc hello.o -o hello
        比较细致,但实际使用不建议,比较麻烦!
 
        3.一步到位法
        gcc hello.c -o hello
        编译并生成对应的可执行程序,见名知意,建议使用!!!

        

        通过这些命令也可以看出 C 语言程序的编译过程。


3 断点及调试窗口设置

        程序在我们点击绿色三角形按钮时,一下子就运行到最后一步了,速度非常快,如果最终输出的结果和我们预期的不一样,我们如何查找代码的哪一步出了问题呢?

        秘诀就是让它运行慢下来(类似于魔术慢放),一次只让程序运行一步,如何让程序运行慢下来,那就是断点调试

        如下图所示,在位置 1 处添加断点(断点位置代表从哪一步我们开始慢下来),点击位置 2 启动调试。

        当点击虫子按钮后,调试就启动了,出现蓝色长条代表调试启动,如下图所示:

        注意:蓝条所在行,表示此语句还未得到执行。 

        点击了上图的单步运行按钮(上图 2 指向的折弯箭头),得到如下图:


4 什么是调试

        调试(Debugging)是软件开发过程中一个至关重要的环节,它涉及到查找、识别并修正程序中的错误(或称为“bug”)。这些错误可能导致程序无法正确执行其预期的功能,或者产生非预期的结果

        在调试过程中,程序员会仔细分析程序的运行过程,特别是那些可能导致问题的部分。由于程序在执行时会进行各种计算,这些计算会改变程序中变量的值,因此,监视这些变量的变化是调试过程中的一个重要手段。

        变量监视窗口(或称为“调试窗口”、“观察窗口”等)是许多集成开发环境(IDE)和调试工具提供的一个功能,它允许程序员在程序运行时实时查看变量的值。当程序执行到某个特定点时,程序员可以暂停程序的执行(这通常通过设置断点来实现),然后查看此时程序中各个变量的值。如果发现某个变量的值不符合预期,那么很可能就是这里出了问题,也就是找到了一个 bug。

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

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

相关文章

7-1 深度学习硬件:CPU和GPU

L 3 L3 L3、 L 2 L2 L2、 L 1 L1 L1为cache,数据只有进入寄存器的时候,才能开始运算。 (此图错误,一个矩阵应该是按行存储的!) GPU的核要远远多于CPU,从而TFLOPS,GPU每秒能做的…

Vue3.0与Echarts5

1.课程介绍与目标 有句话说的好“一图胜千言”,在我们开发的领域就是说,在对于复杂难懂且体量庞大的数据展示上面而言,图表的信息量要大得多,这也是我们为什么要谈数据可视化。https://notes.xiyankt.com/#/echarts/echarts​ stu…

深入理解 Apollo Client 的缓存策略

前言 上一篇文章:Nextjs 使用 graphql,并且接入多个节点 介绍了如何接入 graphql,并且使用 Apollo client 来请求和操作数据。后面深入了解了一下其缓存策略,想着有必要整理出来,作为后续学习。有任何问题还请批评指正…

八股之Java基础

注:本文部分内容源自Java 面试指南 | JavaGuide 一、基础概念与常识 1.JVM、JDK、JRE JVM:Java Virtual Machine,虚拟机,运行Java字节码,实现Java的平台无关性 JDK:Java Development Kit,Ja…

PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解

Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码,我们试试暴力破解 image-20240807122743025 开始爆破了,全部失败,哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…

无法访问jakarta.servlet.http.HttpServletRequest

1、问题 无法访问jakarta.servlet.http.HttpServletRequest2、原因 JDK1.8升级到高版本后&#xff0c;需要手动引入jakarta.servlet-api 3、解决 增加依赖 <dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</ar…

6.2.面向对象技术-UML图

UML UML事物关系依赖关联聚合组合 泛化实现 类图对象图用例图序列图通信图状态图活动图构件图部署图练习题 UML 上午选择题3-4分&#xff0c;下午案例分析必考 UML是统一建模语言&#xff0c;和程序设计语言并无关系。 UML三个要素&#xff1a;UML的基本构造块、支配这些构造…

代码随想录算法训练营第二十一天 | 77. 组合, 216.组合总和III , 17.电话号码的字母组合

目录 77. 组合 思路 回溯法三部曲 方法一&#xff1a; 回溯未剪枝 方法二&#xff1a;回溯剪枝 心得收获 216.组合总和III 思路 方法一&#xff1a;回溯-没有使用sum来统计path里元素的总和 方法二&#xff1a;回溯&#xff0c;使用sum来保存当前路径上的总和 心得…

如何应用OceanBase 的实时SQL诊断,解决AP场景下的痛点

随着数据量的快速增长与用户需求的变化&#xff0c;数据库的管理与优化工作日益凸显其重要性。作为DBA及开发者&#xff0c;您是否曾面临以下挑战&#xff1a; ○ 分析场景下&#xff0c;在处理大规模数据的且耗时较长的查询是&#xff0c;常涉及海量数据的处理及复杂的计算&…

Python 设计模式之工厂函数模式

文章目录 案例基本案例逐渐复杂的案例 问题回顾什么是工厂模式&#xff1f;为什么会用到工厂函数模式&#xff1f;工厂函数模式和抽象工厂模式有什么关系&#xff1f; 工厂函数模式是一种创建型设计模式&#xff0c;抛出问题&#xff1a; 什么是工厂函数模式&#xff1f;为什么…

Vue3学习笔记第一天

MVVM Vue是一种用于构建用户界面的JavaScript框架。MVVM 是Vue采用的一种软件架构模式&#xff0c;用于构建交互式的用户界面。它的全称是 Model-View-ViewModel&#xff0c;这三个部分分别代表了应用程序的不同层次和角色&#xff1a; Model&#xff08;模型&#xff09;&…

【ARM】v8架构programmer guide(3)_ARMv8的寄存器

目录 4.ARMv8 registers 4.1 AArch64 特殊寄存器 4.1.1 Zero register 4.1.2 Stack pointer &#xff08;SP) 4.1.3 Program Counter &#xff08;PC) 4.1.4 Exception Link Register(ELR) 4.1.5 Saved Process Status Register &#xff08;SPSR&#xff09; 4.2 Proc…

性能测试基础概念

前言&#x1f440;~ 上一章我们介绍了单元测试Junit的使用&#xff0c;今天我们来讲解一下性能测试的一些基础概念为后面我们进行性能测试做铺垫 什么是性能测试&#xff1f; 性能测试和功能测试有什么区别&#xff1f; 影响一个软件性能因素有哪些&#xff1f; 为什么要进…

循环神经网络和自然语言处理一

目录 一.分词 1.分词工具 2.分词的方法 3.N-gram表示方法 二.向量化 1.one-hot编码 2.word embedding 3.word embedding API 4.数据形状改变 既然是自然语言&#xff0c;那么就有字&#xff0c;词&#xff0c;句了 一.分词 1.分词工具 tokenization&#xff0c;jie…

Outlook Pst文件大小最大多大?如何分开缩减?

簡介 預設情況下&#xff0c;personal Folders (.pst) 和離線 Outlook Data File (.ost) 檔案在 Microsoft Outlook 2010 和 Outlook 2013 中為 Unicode 格式。 .pst 和 .ost 檔案的整體大小有 50 GB 的預先設定限制。 此限制大於 2007 和 Outlook 2003 Outlook Unicode .pst …

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构知识 - 成本分析篇

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

数据结构 - 相邻节点迭代器

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、相邻节…

nuxt3实战:完整的 nuxt3 + vue3 项目创建与useFetch请求封装

一. 安装 pnpm dlx nuxilatest init <project-name>// ornpx nuxilatest init <project-name>如遇到报错 手动安装&#xff1a; 浏览器访问报错https请求地址&#xff1a; 点击tar(项目初始文件的下载地址)对应地址,下载starter-3.tar.gz 包到本地 本地创建项…

【Android】使用网络技术——WebView的用法、http协议、OKHttp、解析XML、JSON格式数据笔记整理

WebView的用法 新建一个WebView项目 修改activity_main中的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/main"and…

STM32F1之SysTick系统定时器详细解析

目录 1. 简介 2. SysTick功能框图 3. SysTick寄存器 3.1 SysTick控制及状态寄存器 3.2 SysTick重装载数值寄存器 3.3 SysTick当前数值寄存器 3.4 SysTick校准数值寄存器 4. SysTick定时时间计算 5. SysTick寄存器结构体 6. 写一个us级延时函数 7. 写一个…