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

目录

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.rhkb.cn/news/394274.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类,我们可以类中定义成员变量和成员函数,实现模块化封装,从而构建更加抽象和复杂的工程。 &…

基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MSER 4.2 HOG特征提取 4.3 SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2017b 3.部分核心程序 (完整版代码包含中…

CMU15445 (Fall 2023) Project 1 - Buffer Pool 思路分享

文章目录 写在前面Task 1 - LRU-K Replacement PolicyTask 2 - Disk SchedulerTask 3 - Buffer Pool ManagerNewPageFetchPageUnpinPageDeletePageFlushPage 写在最后 写在前面 操作系统为应用程序提供了默认的缓存机制,DBMS作为应用程序,为什么不使用默…

LSLM论文

解决的问题 现在的语音模型(SLM)增强了语音对话的能力,但都局限于回合制对话,在实时对话的情境下与用户交互的能力有所欠缺,例如:当生成的对话不满意时被打断。所以,这篇论文在实时的的语音语言…

ShardingSphere自定义分布式主键生成策略、自定义分片规则

文章目录 主键生成策略源码KeyGenerateAlgorithm源码入口实现扩展 自定义分布式主键生成策略 分片算法ShardingAlgorithm实现扩展 自定义分片算法踩的坑 主键生成策略源码 开发者手册 KeyGenerateAlgorithm 全限定类名org.apache.shardingsphere.sharding.spi.KeyGenerateAl…

QT界面设计开发(Visual Studio 2019)—学习记录一

一、控件升级 简要介绍: 简单来说,控件提升就是将一个基础控件(Base Widget)转换为一个更特定、更复杂的自定义控件(Custom Widget)。这样做的目的是为了在设计界面时能够使用更多高级功能,而不…

环境搭建:全面详尽的 MongoDB Shell MongoDB Server介绍、安装、验证与配置指南(以 Windows 系统为主)

环境搭建:全面详尽的 MongoDB Shell & MongoDB Server介绍、安装、验证与配置指南(以 Windows 系统为主) MongoDB 是一个基于文档的 NoSQL 数据库,以其高性能、灵活性和可扩展性而受到广泛欢迎。本文将带您完成 MongoDB 的安装…

bpmn简单使用(制作流程图)

1、先下载依赖,下面是我下载的版本 "bpmn-io/properties-panel": "^3.23.0", "bpmn-js": "^17.9.1", "bpmn-js-properties-panel": "^5.6.1", "camunda-bpmn-moddle": "^7.0.1",…

CTFHUB-web-RCE-eval执行

开启题目 查看源码发现直接用蚁剑连接就可以,连接之后发现成功了

计算机网络408考研 2020

2020 湖科大教书匠的个人空间-湖科大教书匠个人主页-哔哩哔哩视频 计算机网络408考研 历年真题解析(有字幕无背景音乐版)_哔哩哔哩_bilibili 计算机网络408考研2020年真题解析_哔哩哔哩_bilibili 1 2 3 41 11 1

乡村振兴农村煤改气建设规划设计方案

1. 方案目标与背景 《乡村振兴农村煤改气建设规划设计方案》旨在响应国家乡村振兴战略,通过建设规划推动农村能源结构转型,减少燃煤造成的环境污染,促进农村可持续发展。 2. 农村能源消耗现状 根据2006至2007年的全国性调研,农…

从一个服务预热不生效问题谈微服务无损上线

作者:凡问、启淮 前言 本文基于阿里云技术服务团队和产研团队,在解决易易互联使用 MSE(微服务引擎)产品无损上线功能所遇到问题的过程总结而成。本文将从问题和解决方法谈起,再介绍相关原理,后进一步拓展…

4.11.seq2seq 序列到序列学习

序列到序列学习(seq2seq) ​ 使用两个循环神经网络的编码器和解码器&#xff0c;应用于序列到薛烈类的学习任务。 ​ ​ 在图中&#xff0c;特定的"<eos>"表示序列结束词元。一旦输出序列生成此词元&#xff0c;模型就会停止预测。在循环神经网络解码器的初…

JS+CSS案例:可适应上下布局和左右布局的菜单(含二级菜单)

今天,我给大家分享一个原创的CSS菜单,整个菜单全由CSS写成,仅在切换布局时使用JS。合不合意,先看看效果图。 本例图片 接下来,我来详细给大家分享它的制作方法。 文件夹结构 因为涉及到了样式表切换,所以,你需要借鉴一下我的文件夹结构。 CSS文件夹: reset.css 用于…

维吉尼亚密码加解密实现(python)

维吉尼亚密码 原理 维吉尼亚密码&#xff08;Vigenere&#xff09;是使用一系列凯撒密码组成密码字母表的加密算法&#xff0c;属于多表密码的一种简单形式。 下面给出一个例子 明文&#xff1a;come greatwall 密钥&#xff1a;crypto首先&#xff0c;对密钥进行填充使其长…

【算法】普里姆算法解决修路问题

应用场景——修路问题 1.某地有 7 个村庄&#xff08;A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E&#xff0c;F&#xff0c;G&#xff09;&#xff0c;现在需要修路把 7 个村庄连通 2.各个村庄的距离用边线表示&#xff08;权&#xff09;&#xff0c;比如 A - …

ORM工具之SQLAlchemy

SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言&#xff0c;为高效和高性能的数据库访问设计&#xff0c;实现了完整的企业级持久模型”。SQL…

从 Pandas 到 Polars 四十四:Polars 和 数据可视化库Seaborn

在我对Matplotlib感到沮丧并发表帖子时&#xff0c;我的朋友让我试试Seaborn库。近年来我一直在使用Altair&#xff0c;因此并没有过多考虑Seaborn。然而&#xff0c;Seaborn的新界面给我留下了深刻印象&#xff0c;并且我很高兴地发现&#xff0c;Seaborn将直接接受Polars的Da…

【web安全】权限漏洞之未授权访问

一.Jenkins未授权访问漏洞 步骤一&#xff1a;使用以下fofa语法进行搜索 port"8080" && app"JENKINS" && title"Dashboard [Jenkins]" 步骤二&#xff1a;进入执行页面http://xxx.xxx.xxx.xxx:xxxx/manage/script/index.php 执…