makefileGDB使用

一、makefile

1、make && makefile

makefile带来的好处就是——自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率

下面我们通过如下示例来进一步体会它们的作用:

①编写makefile文件

touch makefile
vim makefile

使用vim编辑器编辑makefile文件:

image-20230407150615108

#makefile文件中的内容
hello.exe:hello.c  gcc hello.c -o hello.exe
.PHONY:clean
clean:rm -f hello.exe

此时我们只需一个make命令即可完成自动编译:

make

image-20230407151005413

make命令的作用,即是执行makefile中的命令,此处执行的命令是:

gcc hello.c -o hello.exe

当我们输入:

make clean

image-20230407145636879

此处就执行了:

rm -f hello.exe

2、make执行步骤

当我们在Linux中输入并执行make命令时,make会干些什么呢?

step 1:make会在当前目录下寻找Makefile文件,找到了就会用这个文件作为后续操作的依据;如果没找到Makefile,就会寻找名为makefile的文件;两个都没找到就报错;

step 2:找到Makefile或者makefile之后,默认文件中第一行作为第一个目标;make命令会分析第一个目标的依赖关系,并且执行该目标的依赖方法**;

2.1 依赖关系

hello.exe:hello.c                #依赖关系

makefile文件中hello.exe就是目标(期望生成的内容);我们编译文件hello.c期望生成它对应的可执行文件hello.exe,而你要编译生成这个目标文件,需要依赖hello.c这个文件,这就是依赖关系

2.2 依赖方法

有了依赖关系,我们就知道了生成目标可执行文件hello.exe需要依赖hello.c这个文件,那么我们该怎么利用hello.c文件生成hello.exe文件呢?我们是不是还缺少一个方法,而这个使用目标的依赖关系文件生成期望的目标文件的方法就是依赖方法

gcc hello.c -o hello.exe         #依赖方法

image-20230407151439095

需要注意的是,依赖文件列表可以为空

3、项目清理

# makefile文件中的清理部分
.PHONY:clean
clean:rm -f code

image-20230407151637813

上述makefile文件中,该部分即为项目清理部分;在上述介绍中,我们知道需要显式输入make clean才能实现清除编译好的文件hello.exe以便重新编译:

image-20230407151932323

其中.PHONY的使用,是将它设置为伪目标,伪目标的特性是:总是被执行的

4、伪目标 .PHONY

👉 怎样理解总是被执行的?我们试着多次输入make指令,发现结果如下:

image-20230407152245884

结果:当第一次使用make命令时,目标被执行生成了一个可执行文件,而当我们再使用make命令时发现make虽然不会报错但是会告诉我们生成的文件的已经是最新的了,目标并没有被执行


那么多次输入make clean指令呢?结果如下:

image-20230407152336502

可以一直执行rm -f hello.exe这条指令!(即使已经重复执行了)


我们将生成可执行文件过程更改为伪目标(使用vim编辑器):

# 修改makefile文件
.PHONY:hello.exe
hello.exe:hello.cgcc hello.c -o hello.exe

image-20230407152918399

再测试一下:

image-20230407153021133

二、GDB

GDB是命令行模式的调试工具,能够让用户在程序运行时观察程序的内部结构和内存的使用情况。

1、准备工作

gdb_test.c:

#include<time.h>void Print(int sum)
{long long timestamp=time(NULL);printf("result=%d,timestamp:%lld\n",sum,timestamp);
}int AddtoVal(int from,int to)
{int sum=0;for (int i = from; i <= to; i++){sum+=i;}return sum;
}int main()
{int sum=AddtoVal(0,100);Print(sum);return 0;
}

生成可执行文件:

1、debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
 2、release版本:不会添加任何调试信息,是不可调试的。

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项

gdb_test_g.exe:gdb_test.cgcc gdb_test.c -o gdb_test_g.exe -g
.PHONY:clean
clean:rm -rf gdb_test_g.exe

可使用工具读取可执行程序符号表debug部分:

[Kevin@VM-8-13-centos code1]$ readelf -S gdb_test_g.exe | grep debug[26] .debug_aranges    PROGBITS         0000000000000000  00001095[27] .debug_info       PROGBITS         0000000000000000  000010c5[28] .debug_abbrev     PROGBITS         0000000000000000  00001536[29] .debug_line       PROGBITS         0000000000000000  000016af[30] .debug_str        PROGBITS         0000000000000000  000017d5

总结:要用gdb调试,首先要进行给编译器添加-g

2、正式调试

调试命令:

进入gdb:gdb 文件名

显示代码:l n 显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示。

打一个断点:b n在第n行设置断点。

查看已打断点:info b

去掉打的断点:d 断点编号 删除指定编号(不是行号)的断点。

开始调试运行:r(run)

逐过程:n(next)

逐语句:s(step)会进入函数体中

运行到下一个断点处:c(continue)

查看函数调用堆栈:bt

直接运行完当前函数:finish 个性化跑完自定义的一个个函数,方便定位代码错误的位置

打印变量的值/地址:p(print)变量/&变量

将变量的值/地址加入常显示:display 变量/&变量

取消指定编号变量的常显示:undisplay 编号

跳出循环/跳转至指定行:until 行号

修改变量值:set var 变量=x 将变量的值修改为x

退出gdb:quit/ql
continue)

查看函数调用堆栈:bt

直接运行完当前函数:finish 个性化跑完自定义的一个个函数,方便定位代码错误的位置

打印变量的值/地址:p(print)变量/&变量

将变量的值/地址加入常显示:display 变量/&变量

取消指定编号变量的常显示:undisplay 编号

跳出循环/跳转至指定行:until 行号

修改变量值:set var 变量=x 将变量的值修改为x

退出gdb:quit/ql

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

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

相关文章

【rust】11、所有权

文章目录 一、背景二、Stack 和 Heap2.1 Stack2.2 Heap2.3 性能区别2.4 所有权和堆栈 三、所有权原则3.1 变量作用域3.2 String 类型示例 四、变量绑定背后的数据交互4.1 所有权转移4.1.1 基本类型: 拷贝, 不转移所有权4.1.2 分配在 Heap 的类型: 转移所有权 4.2 Clone(深拷贝)…

[ffmpeg] x264 配置参数解析

背景 创建 x264 编码器后&#xff0c;其有一组默认的编码器配置参数&#xff0c;也可以根据需要修改参数&#xff0c;来满足编码要求。 具体参数 可修改的参数&#xff0c;比较多&#xff0c;这边只列举一些常用的。 获取可以配置的参数 方式1 查看 ffmpeg源码 libx264.c…

apidoc接口文档的自动更新与发布

文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五&#xff0c;配置定时运行六&#xff0c;docker运行七&#xff0c;优化方向 一、概述 最近忙于某开源项目的接口文档整理&#xff0c;采用了apidoc来整理生成接口文档。 apidoc是一个…

Java8 - LocalDateTime时间日期类使用详解

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

HarmonyOS—编译构建概述

编译构建是将应用/服务的源代码、资源、第三方库等&#xff0c;通过编译工具转换为可直接在硬件设备上运行的二进制机器码&#xff0c;然后再将二进制机器码封装为HAP/APP软件包&#xff0c;并为HAP/APP包进行签名的过程。其中&#xff0c;HAP是可以直接运行在模拟器或真机设备…

THINKPHP 跨域报错解决方案

报错&#xff1a;has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 环境&#xff1a;thinkphp6 nginx 今天和VUE配合调用接口的时候发现跨…

utniy urp shinyssrr插件使用

文章目录 前言步骤1首先在URP的配置文件里添加SSR后处理2 修改RenderingPath为延迟渲染3 启用深度纹理4 为物体添加脚本 插件下载 前言 用来实现屏幕空间反射效果 unity 版本为2021.3.8LTS&#xff0c;低版本的untiy URP的参数设置位置z可能会不同 步骤 1首先在URP的配置文件…

【C语言】三子棋

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

Java-常用集合

Jva常用集合 一、Java 集合框架体系二、Collection接口和方法1. List接口List 接口主要实现类&#xff1a;ArrayListList 的实现类之二&#xff1a;LinkedListList 的实现类之三&#xff1a;Vector 2. Set接口Set 主要实现类&#xff1a;HashSetSet 实现类之二&#xff1a;Link…

抽象类与抽象方法

文章目录 抽象类抽象类的特点 抽象方法抽象方法的特点 模板设计模式模板设计模式能解决的问题示例 #抽象类与抽象方法 抽象类 用abstract关键字来修饰一个类时&#xff0c;这个类就叫抽象类。 public abstract 类名{... }抽象类的特点 1&#xff09;抽象类不能被实例化。 2&…

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…

[HackMyVM]靶场 Adria

kali:192.168.56.104 主机发现 arp-scan -l 靶机:192.168.56.108 端口扫描 nmap -p- 192.168.56.108 开启了 22 80 139 445端口 进入web 编辑 /etc/hosts&#xff0c;把192.168.56.108 adria.hmv添加进去重新访问 里面没什么有用的东西&#xff0c;注册需要邮箱&#xff0c;…

字典树基础,朴素字符串查找

字典树基础&#xff0c;朴素字符串查找 空间&#xff08;o(n*m)&#xff09; #include<bits/stdc.h> using namespace std; ​ const int N 2e6 9; int nex[N][26]; int cnt[N]; int idx 2; void insert(char s[]){int x 1;for (int i 0; s[i]; i){//判断x是否存在是…

Docsify部署IIS

什么是Docsify&#xff1f; 一个神奇的文档网站生成器。docsify 可以快速帮你生成文档网站。不同于 GitBook、Hexo 的地方是它不会生成静态的 .html 文件&#xff0c;所有转换工作都是在运行时。如果你想要开始使用它&#xff0c;只需要创建一个 index.html 就可以开始编写文档…

2024年腾讯云服务器优惠活动,3月份价格曝光可领代金券

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

cpp基础学习笔记03:类型转换

static_cast 静态转换 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的&#xff1b;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。用于基本数据类型之间的转换&#xff…

java-ssm-jsp房屋中介服务平台的设计与实现

java-ssm-jsp房屋中介服务平台的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

基于springboot+html实现的衣物捐赠平台

一、系统架构 前端&#xff1a;html | layui | jquery | css 后端&#xff1a;springboot | thymeleaf | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 注册 03. web页-首页 04. web页-捐赠衣服 05. web页-论坛交流…

C++:String类的使用

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 在C语言中&#xff0c;我们想要存储字符串的话必须要用字符数组 char str[]"hello world"这其实是将在常量区的常量字符串拷贝到数组中&#xff0c;我们会在数组的结尾多开一个空间存储\0&#xff0c;这样我…

数据结构从入门到精通——算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度 前言一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例2.4等差数列计算公式2.5等比数列计算方法 三、空间复杂度四、 常见复杂度对比五、 复杂度的oj练习…