【Linux】gdb调试与make/makefile工具

目录

导读

1. make/Makefile

1.1 引入

1.2 概念

1.3 语法规则

1.4 示例

2. Linux调试器-gdb

2.1 引入

2.2 概念

2.3 使用


导读

我们在上次讲了Linux编辑器gcc\g++的使用,今天我们就来进一步的学习如何调试,以及makefile这个强大的工具。

1. make/Makefile

1.1 引入

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作

1.2 概念

在Linux中,make是一个常用的构建工具,用于自动化构建和管理程序的编译过程。

make工具通过读取一个叫做Makefile的文件来执行编译和链接等操作。

Makefile中包含了一系列的规则和指令,用于描述如何将源代码转换为可执行程序。

  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

1.3 语法规则

Makefile语法规则包括目标、依赖关系和命令。

1. 目标(Target):指定要构建的文件或操作的名称。目标是make工具的主要执行对象。

target: dependenciescommand

2. 依赖(Dependencies):规定目标所依赖的文件或操作。依赖关系用于确定何时需要重新构建目标。可以有多个依赖项,用空格分隔。

target: dependency1 dependency2command

3. 命令(Commands):描述了如何生成目标的命令。命令必须以制表符开始,并且在同一行上。可以有多个命令,每个命令占一行。

target: dependenciescommand1command2

4.  变量(Variables):可以在Makefile中定义变量,用于存储常用的参数和选项。变量可以通过$(variable_name)来引用。

variable_name = value

 5. 注释(Comments):使用#符号来添加注释。注释可以出现在任意位置,并且会被忽略。

# This is a comment

6. 伪目标(Phony Targets):有些目标不是实际的文件,而是用于执行特定操作的伪目标。可以使用.PHONY声明伪目标。

.PHONY: target

7. 默认目标(Default Target):Makefile可以指定一个默认的目标,当没有明确指定目标时,会执行默认目标。使用.DEFAULT_GOAL指定默认目标。

.DEFAULT_GOAL := target

1.4 示例

编写一个简单程序:

[zhy@centos7 ~]$ vim test.c
[zhy@centos7 ~]$ cat test.c
#include <stdio.h>int main()
{printf("hello world\n");return 0;
}

编写makefile文件:

其中 test 是的目标文件,也是我们的最终生成的可执行文件。

依赖文件就是 test.c源文件,然后使用我们的gcc命令,重建目标文件。

[zhy@centos7 ~]$ vim makefile
[zhy@centos7 ~]$ cat makefile
test: test.cgcc -o test test.c

执行make命令:

执行make命令后,makefile文件里的 gcc -o test test.c 命令被执行,生成一个test可执行文件。

[zhy@centos7 ~]$ ls
111  a.out  install.sh  makefile  test.c
[zhy@centos7 ~]$ make
gcc -o test test.c
[zhy@centos7 ~]$ ls
111  a.out  install.sh  makefile  test  test.c
[zhy@centos7 ~]$ ./test
hello world

继续编辑makefile文件:

  • clean是一个伪目标,用于清理生成的目标文件和可执行文件。它的命令是删除test文件。
  • 使用.PHONY声明了clean是一个伪目标,防止与同名文件冲突。
[zhy@centos7 ~]$ vim makefile
[zhy@centos7 ~]$ cat makefile
test: test.cgcc -o test test.c# 定义伪目标和命令
clean:rm -f test.PHONY: clean

 

再次执行make命令:

 要清理生成的文件,可以执行make clean命令

[zhy@centos7 ~]$ ls
111  a.out  install.sh  makefile  test  test.c
[zhy@centos7 ~]$ make clean
rm -f test
[zhy@centos7 ~]$ ls
111  a.out  install.sh  makefile  test.c

定义变量:

使用CC定义了编译器和编译选项的变量。

[zhy@centos7 ~]$ vim makefile
[zhy@centos7 ~]$ cat makefile
# 定义变量
CC = gcc
CFLAGS = -Wall -gtest: test.c$(CC) -o test test.c# 定义伪目标和命令
clean:rm -f test.PHONY: clean

2. Linux调试器-gdb

2.1 引入

我们在写编写C语言代码时难免会遇到一些解决不了的bug,这时我们会选择去进行调试,看看到底是哪一部分出现了错误,从而进一步的解决问题。

相对的,我们在Linux中编写程序时也可以进行调试。

2.2 概念

GDB是一种强大的命令行调试器,可用于调试C、C++和其他编程语言的程序。

DB具有许多功能,包括设置断点、单步执行、查看变量值、查看内存内容、追踪函数调用等。它还支持多线程和多进程调试,可以与各种编译器和调试器一起使用。

程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

2.3 使用

基本命令:

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

list/l 函数名:列出某个函数的源代码。

continue(或c):从当前位置开始连续而非单步执行程序。

run(或r):从开始连续而非单步执行程序。

n 或 next:单条执行。

s或step:进入函数调用。

break(b) 行号:在某一行设置断点。

break 函数名:在某个函数开头设置断点。

info break :查看断点信息。

finish:执行到当前函数返回,然后挺下来等待命令。

print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。

p 变量:打印变量值。

set var:修改变量的值。

delete breakpoints:删除所有断点。

delete breakpoints n:删除序号为n的断点。

disable breakpoints:禁用断点。

enable breakpoints:启用断点。

info(或i) breakpoints:参看当前设置了哪些断点。

display 变量名:跟踪查看一个变量,每次停下来都显示它的值。

undisplay:取消对先前设置的那些变量的跟踪。

until X行号:跳至X行。

breaktrace(或bt):查看各级函数调用及参数。

info(i) locals:查看当前栈帧局部变量的值。

quit:退出gdb。

示例:

编写一段代码:

[zhy@centos7 ~]$ vim project.c
[zhy@centos7 ~]$ cat project.c
#include <stdio.h>int main() {int num1 = 5;int num2 = 0;int result;result = num1 / num2;printf("The result is: %d\n", result);return 0;
}

将程序编译为可调试的可执行文件:

gcc -g project.c -o project

启动gdb调试器:

这将启动gdb,并显示(gdb)提示符。

 gdb project

显示源代码:

list

设置断点:

这将在main函数的开头设置一个断点。

break main

 

 运行程序:

程序将开始执行,并在达到断点处停止。

run

 

 单步执行:

这将单步执行程序,进入main函数。

step

 

 检查变量的值:

print num1

 

 继续执行程序:

continue

 

检查错误:

continue命令之后会继续执行,程序会在除以0的地方崩溃。在运行到该语句时,gdb会停止并显示相关信息。

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

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

相关文章

OpenCV-32 膨胀操作

膨胀是与腐蚀相反的操作&#xff0c;基本原理是只要保证卷积核的锚点是非0值&#xff0c;周边无论是0还是非0值&#xff0c;都变为0。 使用API---dilate&#xff08;img&#xff0c; kernel&#xff0c; iterationms 1&#xff09; 示例代码如下&#xff1a; import cv2 imp…

【图论】基环树

基环树其实并不是树&#xff0c;是指有n个点n条边的图&#xff0c;我们知道n个点n-1条边的连通图是树&#xff0c;再加一条边就会形成一个环&#xff0c;所以基环树中一定有一个环&#xff0c;长下面这样&#xff1a; 由基环树可以引申出基环内向树和基环外向树 基环内向树如…

学习VR全景拍摄,如何选择适合的VR全景设备?

随着VR全景技术的不断成熟和发展&#xff0c;VR全景已经成为摄影爱好者、地产行业、中介经纪人、广告、企业宣传等行业从业者们乐于尝试的新领域、新手段。 如何选择合适的VR全景设备成为了一个重要的问题。今天&#xff0c;和大家聊一聊&#xff0c;不同行业、人群和用途更适合…

【Qt】Android上运行keeps stopping, Desktop上正常

文章目录 问题 & 背景背景问题 解决方案One More ThingTake Away 问题 & 背景 背景 在文章【Qt】最详细教程&#xff0c;如何从零配置Qt Android安卓环境中&#xff0c;我们在Qt中配置了安卓开发环境&#xff0c;并且能够正常运行。 但笔者在成功配置并完成上述文章…

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏

蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…

ChatGPT辅助编程,一次有益的尝试

如果大家想学习PCIe&#xff0c;搜索网上的信息&#xff0c;大概率会看到chinaaet上Felix的PCIe扫盲系列的博文 Felix-PCIe扫盲 每次看这个系列博文的时候&#xff0c;我都在想有没有什么方法可以把这个系列的博文都保存到一个pdf文件中&#xff0c;这样方便阅读。于是有了下…

tkinter绘制组件(41)——菜单按钮

tkinter绘制组件&#xff08;41&#xff09;——菜单按钮 引言布局函数结构按钮部分菜单显示完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 TinUI5的新控件&#xff0c;菜单按钮&#xff0c;menubutton。 这是一个与TinUI菜单&#xff08;menubar&#xff0…

算法之双指针系列1

目录 一&#xff1a;双指针的介绍 1&#xff1a;快慢指针 2&#xff1a;对撞指针 二&#xff1a;对撞指针例题讲述 一&#xff1a;双指针的介绍 在做题中常用两种指针&#xff0c;分别为对撞指针与快慢指针。 1&#xff1a;快慢指针 简称为龟兔赛跑算法&#xff0c;它的基…

上海泗博HART转ModbusTCP网关HME-635应用案例之组态王和超声波液位计通信

如今工业现场的应用也逐渐把现场的不同应用协议转换成以太网&#xff0c;以此来提升现场的通信速度和质量。Modbus TCP是工业以太网协议的一种&#xff0c;也是现场应用中最常使用的。本应用案例是基于Modbus TCP的组态王和基于HART的超声波液位计之间数据通讯的具体应用。 应用…

STM32F407 CAN参数配置 500Kbps

本篇CAN参数适用 芯片型号&#xff1a;STM32F407xx系统时钟&#xff1a;168MHz&#xff0c;CAN挂载总线APB1为42M波 特 率 &#xff1a;500Kpbs引脚使用&#xff1a;TX_PB9&#xff0c;RX_PB8&#xff1b;修改为PA11PA12后&#xff0c;参数不变。 步骤一、打勾开启CAN&#xf…

vector类的模拟实现

实现基本的vector框架 参考的是STL的一些源码&#xff0c;实现的vector也是看起来像是一个简略版的&#xff0c;但是看完能对vector这个类一些接口函数更好的认识。 我们写写成员变量&#xff0c;先来看看STL的成元变量是那些 namespace tjl {template<class T>class …

无损音乐下载,最新音乐下载,mp3格式音乐下载,一键下载mp3格式音乐,我只用这个软件,歌曲资源丰富,全网音乐免费下载,稳定运行,告别收费

一、软件简介 现在很多支持一键下载mp3音乐/无损音质音乐的音乐播放器通常都是解析接口套了一个壳&#xff0c;一旦解析接口失效&#xff0c;软件就不能下载音乐了&#xff0c;因此一个稳定的解析接口是这类软件最大的保障。本次小编推荐的音乐下载软件接口非常稳定&#xff0…

C语言:函数

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、函数的概念 数学中我们见过函数的概念&#xff0c;例如ykxb&#xff0c;k和b都是常数&#xff0c;给任意一个x就可以得到y 而C语言也引入了函数&#xff08;function&#xff09;这个概念&#xff0c;C语…

利用LLM大模型生成sql的深入应用探究

Chat2DB 是一款有开源免费的多数据库客户端工具,和传统的数据库客户端软件Navicat、DBeaver 相比 Chat2DB 集成了 AIGC 的能力&#xff0c;能够将自然语言转换为 SQL&#xff0c;也可以将 SQL 转换为自然语言&#xff0c;可以给出研发人员 SQL 的优化建议&#xff0c;极大地提升…

初识C语言·预处理详解

目录 1 预定义符号 2 define定义常量 3 #define定义宏 4 带有副作用的宏 5 宏替换的规则 6 宏和函数的对比 7 # 和 ## i) #运算符 ii) ##运算符 8 命名约定 9 命令行定义 10 条件编译 条件编译1&#xff1a; 条件编译2&#xff1a; 条件编译3&#xff1a; 条件…

单片机学习笔记---LED点阵屏的工作原理

目录 LED点阵屏分类 LED点阵屏显示原理 74HC595的介绍 一片74HC595的工作原理 多片级联工作原理 总结 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之ScrollBar组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、ScrollBar组件 鸿蒙&#xff08;HarmonyOS&#xff09;滚动条组件ScrollBar&…

Logback - 日志框架

引言 在当今的企业级应用开发中&#xff0c;日志管理是一个不可或缺的部分。它不仅帮助我们进行错误跟踪&#xff0c;还能有效监控应用程序的运行状态&#xff0c;为性能优化提供数据支撑。Spring Boot作为一个简化Spring应用开发的框架&#xff0c;自带了强大的日志管理功能。…

如何用python进行数据分析?

前言 很多人可能会有这样的疑问&#xff0c;数据分析Excel挺强大的&#xff0c;会Excel就行&#xff0c;为什么还要去学python&#xff1f; 是的&#xff0c;Excel和python对于数据分析而言&#xff0c;这两者都只是不同的工具而已。 但&#xff0c;有一点我们要考虑&#x…

iOS 需求 多语言(国际化)App开发 源码

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…