GCC编译调试C语言基础

article/2025/11/1 18:24:48
#include<stdio.h>
int main()
{printf("Hello World!");return 0;
}
cloudray@ubuntu:~/test/testc$ gcc -o test hello.c
cloudray@ubuntu:~/test/testc$ ls
hello.c  test
cloudray@ubuntu:~/test/testc$ ./test
Hello World!

GCC简介

 GCC,全名GNU编译器套件(GNU Compiler Collection)。由GNU开发的编程语言编译器,包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)。
 支持在各种处理器架构上使用。
(ps:关于GNU可以继续深入了解)
 The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,…). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user’s freedom.
GCC, the GNU Compiler Collection - GNU Project

编译器组件

 分析器:将程序语言变为汇编程序
 汇编器:将汇编语言转换为CPU可执行字节码(二进制)
 链接器:将汇编器生成的单独目标文件组合成可执行的应用程序。链接器需要知道这种目标格式一边工作。
 标准C库:主要与常用的C程序库,通过链接器与源代码连接。

支持后缀

文件后缀描述
.cC语言源文件
.C/.cc/.cxx/.cppC++ 源文件
.h C/C++头文件
.i/.ii经过预处理的 C/C++ 文件
.s/.S汇编语言源文件
.o/.obj静态库
.so/.dll动态库
.a/.so编译后的库文件

GCC基本参数

命令作用
-c只进行编译过程,而不链接成可执行文件,编译器只是将输入的源代码(.c/c++、java、python等)生成.o为后缀的目标文件(objective file),通常用于编译不包含主程序的子程序。
-o确定输出文件名,注意输出文件名不能和源文件同名;如果不给出该调用参数,gcc就给出默认的可执行文件a.out。
-g生成符号调试工具(GNU的gdb)所需要的符号信息,想要对源代码进行调试,必须加入这个选项。
-E仅执行预处理操作,而不进行编译、汇编和链接操作。
-S仅执行编译操作,而不进行汇编、链接操作
-O对程序进行优化编译、链接操作,提高可执行文件的执行效率,但编译链接也会慢一点。
-O2更高级别优化,也会更慢。
-w禁止显示任何警告信息
-Wall显示全部警告信息

编译流程

在这里插入图片描述

 1. 预处理(Pre-Processing)
 2. 编译(Compiling)
 3. 汇编(Assembling)
 4. 链接(Linking)
在这里插入图片描述

逐步生成可执行文件

cloudray@ubuntu:~/test/testc$ gcc -E hello.c -o hello.i #包含头文件
cloudray@ubuntu:~/test/testc$ gcc -S hello.c -o hello.s #汇编代码
cloudray@ubuntu:~/test/testc$ gcc -c hello.s -o hello.o #二进制文件
cloudray@ubuntu:~/test/testc$ gcc hello.o -o hello #可执行文件
cloudray@ubuntu:~/test/testc$ ./hello
Hello World!

常见错误

  1. C语法错误
  2. 头文件错误
  3. 档案库错误
  4. 未定义错误

GDB调试基础

 Unix下的调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:
 1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
 2. 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
 3. 当程序被停住时,可以检查此时你的程序中所发生的事。
 4. 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

基础命令。

命令(简写)作用
gdb -t .c生成可调试的可执行文件
gdb 可执行文件进入该文件的调试界面
list(l)显示接下来的十行代码
start开始调试,在主函数第一行处停止(即自动设置断点)
run®运行(遇到断点才停止)
next(n)逐步执行
break(b)设置一般断点,可在特点行数或者函数处设置
info break(b)查看所有断点信息
s进入下一个将要运行的函数
p查看特定变量值
quit(q)退出gdb调试
回车重复上一条命令

示例

#include <stdio.h>
int sum(int a, int b);
int fun(int a, int b);
int main()
{int a,b;scanf("%d %d",&a,&b);printf("开始\n");printf("a+b=%d\n", sum(a, b));fun(a,b);return 0;
}
int sum(int a,int b)
{return (a + b);
}int fun2(int a, int b);
int fun(int a,int b)
{printf("axb=%d\n",a*b);fun2(a,b);return 0;
}
int fun2(int a,int b)
{printf("a/b=%d\n",a/b);return 0;
}

第一步:生成调试文件

gcc -g test.c -o test

第二步:进入该文件的调试界面

gdb 可执行文件

显示代码:list(l)
一次显示10行,回车表示重复上次命令。
在这里插入图片描述
开始运行:run®
直到所设断点。
在这里插入图片描述
设置一般断点,并查看所有断点情况。
break(b)
info break(b)
在这里插入图片描述
逐步执行:next(n)
先自动运行到断点处,再逐步执行,回车重复,且不进入内部函数。
在这里插入图片描述
开始调试:start
停留在主函数第一行。
在这里插入图片描述
进入函数:s
逐步调试,但会进入每一个内部函数,包括printf。
在这里插入图片描述
退出函数:finish
在这里插入图片描述
查看与打印变量或地址:print§
在这里插入图片描述
在这里插入图片描述
退出调试: quit(q)
在这里插入图片描述


http://chatgpt.dhexx.cn/article/xBZ9ixf6.shtml

相关文章

2022CTF培训(十三)虚拟化QEMU架构分析QEMU CVE示例分析

附件下载链接 虚拟化技术基本概念 硬件虚拟化 全虚拟化 提供可以完全模拟基础硬件的VME 可以在VM中运行任何能够在物理硬件上执行的软件&#xff0c;并且可以在每个单独的VM中运行基础硬件支持的任何OS为每个VM提供物理系统的所有服务&#xff0c;包括虚拟BIOS&#xff0c;…

阿里云部署(Springboot+vue2.0)前后端分离项目

阿里云部署&#xff08;Springbootvue2.0&#xff09;前后端分离项目 项目架构和部署工具项目工具部署工具 后端项目准备及部署购买云端服务器&#xff08;以下是阿里云&#xff0c;[腾讯请点击我](https://blog.csdn.net/it_vegetable/article/details/118465663)&#xff09;…

记一次简单的crackme

好久没有更新博客了&#xff0c;发个之前做的一个crackme crackme过程 观察观察程序 打开程序 随便输入点看看 猜测输入name&#xff0c;根据程序中的加密算法得到serial。找到name对应的serial即可成功破解 丢exeinfo,无壳&#xff0c;32位 调试&#xff08;VB文件的一…

open62541 (R 1.1.2)中文文档 (译文)第一篇 (1 - 5)

open62541&#xff08;R 1.1.2&#xff09; 文档 注&#xff1a;原文PDF文档 是从官网下载的 Linux64bit的发布版本中自带的文档&#xff0c;原PDF中的源代码用PDF浏览器查看&#xff0c;有残缺。需要结合源文件中的示例代码进行相应的修改。或参考其它版本的文档。原文代码中…

深度学习实践——模型部署优化实践

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 源码&#xff1a; 1. 对应的github地址 https://github.com/Asionm/streamlit_demo 2. 对应的gitee地…

基于python+pyqt+halcon实现视觉定位(halcon12.0)【附部分源码】

文章目录 前言演示视频一、项目文件目录讲解二、Qt Designer设置ui界面0.qrc资源文件的设置1.CtuImageMatching.ui的设置2.CameraSetting.ui的设置3.Calibration.ui的设置4.Helper.ui的设置 三、使用命令把qt文件转成py文件四、py文件解析1.CtuImageMatching.py重要函数解析2.C…

2019-10-28-dotnet-代码调试方法

titleauthordateCreateTimecategories dotnet 代码调试方法 lindexi 2019-10-28 08:50:11 0800 2019-6-5 9:4:44 0800 dotnet 本文将会从简单到高级&#xff0c;告诉大家如何调试 dotnet 的代码&#xff0c;特别是桌面端。本文将会使用到 VisualStudio 大量的功能&#xff0c;通…

2019-11-29-dotnet-代码调试方法

titleauthordateCreateTimecategories dotnet 代码调试方法 lindexi 2019-11-29 8:50:0 0800 2019-6-5 9:4:44 0800 dotnet 本文将会从简单到高级&#xff0c;告诉大家如何调试 dotnet 的代码&#xff0c;特别是桌面端。本文将会使用到 VisualStudio 大量的功能&#xff0c;通过…

前端开发 跨平台的构架GSOAP

前言&#xff1a;此文叙述了跨平台GSOAP&#xff0c;并对多线程在服务器上的实现做举例做了介绍 gSOAP是一个夸平台的&#xff0c;用于开发Web Service服务端和客户端的工具&#xff0c;在Windows、Linux、MAC OS和UNIX下使用C和C语言编码&#xff0c;集合了SSL功能。SOAP/XML…

【逆向】逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析系统dll文件的指令kernel32.dll、user32.dll、ntdll.dll文件TEB、PEB crakeme练习 crackme1 学到的知识点&#xff1a; main函数查找方法&#xff1a;运行…

JavaScript-js数组去重

1&#xff0c;利用Set()方法 let list [1,2,1,2,4,4,5] let Newlist Array.from(new Set(list)) console.log(Newlist)//输出[ 1, 2, 4, 5 ]2&#xff0c;新建一个数组&#xff0c;逐一保存原数组中的值&#xff0c;判断新数组中是否已有该数值&#xff0c;无则保存&#xff…

常用的JS数组去重方法大全

写在前面&#xff1a; 我们要想使用数组去重&#xff0c;那就必须对数组有一定的了解&#xff0c;关于JS数组的一些方法以及使用&#xff0c;可参考&#xff1a; ①JavaScript 内置对象之-Array ②ES5新增数组方法 ③浅谈JavaScript中ES6新增的Set和Map结构以及Array.from方法 …

js去重都有哪些方法?

1、去重方法一 arr.splice 2、去重方法二 借助新数组&#xff0c;判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中(原数组长度不变但被按字符串顺序排序) 3、创建一个新数组&#xff0c;判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中 4、借助i…

JS中数组去重的五种方法

数组去重的几种方法(JavaScript版&#xff09; 前言&#xff1a;你需要知道JavaScript中的 splice函数 的用法 splice函数介绍&#xff1a; splice函数用法&#xff1a;splice函数介绍看不懂没关系&#xff0c;怎么用一看例子一目了然 第一种&#xff1a;双重for循环去重 原…

js数组中对象去重的方法

一个数组中含有对象&#xff0c;并且去除数组中重复的对象 id相同的&#xff0c;保留第一个&#xff0c;其它的删除 let arr [{ id: 0, name: "张三" },{ id: 1, name: "李四" },{ id: 2, name: "王五" },{ id: 3, name: "赵六" },{…

js实现数组去重的方式(7种)

目录 JS数组去重的方式1.利用Set()Array.from()2.利用两层循环数组的splice方法3.利用数组的indexOf方法4.利用数组的includes方法5.利用数组的filter()indexOf()6.利用Map()7.利用对象 JS数组去重的方式 例&#xff1a;将下面数组去除重复元素&#xff08;以多种数据类型为例…

js数组去重(9种方法),你都会了吗?

以下共有九种数组去重的方式和详解&#xff08;包含对象数组去重&#xff09;&#xff1a; 1.利用Array.from(new Set)去重&#xff1a; // 1.利用set去重 // Set是es6新增的数据结构&#xff0c;似于数组&#xff0c;但它的一大特性就是所有元素都是唯一的&#xff0c;没有…

解决Linux没有ens33

#临时关闭 systemctl stop NetworkManager # 永久关闭网络管理命令 systemctl disable NetworkManager #开启网络服务 systemctl start network.service

【ubuntu虚拟机】ens33未出现在ifconfig问题

事情发生与2023年4月12日&#xff0c;windows上安装了docker-desktop&#xff0c;奈何wsl不好用&#xff0c;便卸载了&#xff0c;之后我的虚拟机ubuntu无法联网&#xff0c;于是开始解决之旅 事故原因 ifconfig查了一下&#xff0c;没有ens33网卡&#xff0c;于是用ip addres…

Centos开机后ens33网卡失效连不上网

今天使用xshell连接虚拟机一直失败 打开虚拟机ip addr 发现如下问题 解决方案 1.尝试重启网关 ifup ens33 &#xff08;无法解决&#xff09; # ifup ens332.停止网卡&#xff0c;设置disable后重新启动 &#xff08;依旧失败&#xff09; # systemctl stop NetworkManager…