【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)

news2024/7/6 1:20:38

在这里插入图片描述

阅读导航

  • 前言
  • 一、什么是调试器
  • 二、详解 GDB - 调试器
    • 1.使用前提
    • 2.经常使用的命令
    • 3.使用小技巧
  • 三、项目自动化构建工具 - make/Makefile
    • 1. make命令
      • ⭕语法
      • ⭕常用选项
      • ⭕常用操作
      • ⭕make命令的工作原理
      • ⭕make命令的优势:
    • 2.Makefile文件
      • ⭕Makefile的基本结构
      • ⭕Makefile文件中常用的指令和语法
      • ⭕Makefile的约定和惯例
      • ⭕Makefile的工作原理
  • 总结
  • 温馨提示

前言

前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,今天博主带大家了解一下 —— Linux系统下的调试器-gdb、项目自动化构建工具-make/Makefile, 下面话不多说坐稳扶好咱们要开车了!!!😍

一、什么是调试器

调试器是一种工具,用于帮助开发人员诊断和修复程序中的错误。它可以让你逐行执行代码,观察变量的值,并提供有关程序执行流程的详细信息。

✅一些常见的调试器包括:

  1. GDB(GNU调试器):适用于C和C++等编程语言,可在命令行界面下使用。
  2. LLDB(LLVM调试器):一款用于C、C++、Objective-C 和 Swift 的开源调试器,兼容多种平台。
  3. Visual Studio Debugger:适用于Windows平台的调试器,可与Microsoft Visual Studio集成使用。
  4. PyCharm Debugger:专为Python开发的调试器,可在PyCharm集成开发环境中使用。
  5. Xcode Debugger:适用于苹果开发者的调试器,可在Mac和iOS设备上调试应用程序。

⭕VS下的调试环境
在这里插入图片描述
⭕GDB命令行模式的调试
在这里插入图片描述

✅调试器的一般使用步骤如下:

  1. 启动调试器,并将程序加载到调试器中。
  2. 设置断点,这样程序会在断点处暂停执行。
  3. 逐行执行代码,观察变量的值和程序的行为。
  4. 使用调试器提供的命令和功能来检查程序状态、查找错误并进行修复。
  5. 在逐步执行代码时,可以观察程序的执行流程和控制流的变化。
  6. 跟踪程序执行流程,查找潜在的逻辑错误和异常。

二、详解 GDB - 调试器

1.使用前提

在使用GDB调试器之前,你需要满足以下前提条件:

  1. 安装GDB:首先,你需要在你的计算机上安装GDB调试器。GDB是一个开源工具,可以从GNU项目的官方网站上下载并安装,也可以运行以下命令来安装GDB调试器:

    sudo apt install gdb
    

    这将下载并安装GDB及其相关的依赖项。

  2. 编译可执行文件:GDB是用于调试可执行文件的工具,因此你需要先编译你的程序,并生成可执行文件。你可以使用适合你的编程语言的编译器来完成这个步骤。

  3. 了解编译选项:为了能够在GDB中正确地调试你的程序,你需要使用适当的编译选项来生成可调试的可执行文件。对于大多数编译器,你可以使用-g选项来生成调试信息。例如,对于GCC编译器,你可以使用以下命令来编译带有调试信息的可执行文件:

    $ gcc -g your_program.c -o your_program
    

    这将生成一个名为your_program的可执行文件,其中包含调试信息,可以在GDB中使用。

2.经常使用的命令

  1. run:运行程序。

  2. break:设置断点。例如,break main在程序的main函数处设置断点。

  3. next:执行下一行代码。

  4. step:进入函数调用并逐行执行函数内部的代码。

  5. continue:继续执行程序,直到下一个断点或程序结束。

  6. print:打印变量的值。例如,print x将打印变量x的值。

  7. backtrace:查看调用栈,即程序执行到当前位置的函数调用序列。

  8. set:修改变量的值。例如,set x = 10将把变量x的值设置为10。

  9. watch:监视表达式的值。当表达式的值发生变化时,程序会暂停执行并显示相关信息。

  10. info breakpoints:查看当前设置的断点信息。

  11. delete:删除断点。例如,delete 1将删除编号为1的断点。

  12. quit:退出GDB调试器。

  13. info locals:查看当前函数的局部变量。

  14. info registers:查看CPU寄存器的值。

  15. display:设置自动显示变量的值。例如,display x将在每次程序暂停时显示变量x的值。

  16. finish:执行当前函数的剩余部分,并返回到调用该函数的地方。

  17. up:在调用栈中向上移动一帧,查看调用当前函数的上一层函数。

  18. down:在调用栈中向下移动一帧,返回到当前函数调用的函数。

  19. info threads:查看程序中的线程信息。

  20. thread <thread-id>:切换到指定的线程。

  21. set pagination off:关闭分页功能,以便在显示大量输出时不会暂停。

  22. record:启用记录功能,可以回放程序的执行过程。

  23. info functions:列出程序中定义的所有函数。

  24. info sources:显示当前已加载的源文件列表。

  25. run <arguments>:运行程序并传递命令行参数。

  26. set args <arguments>:设置程序运行时的命令行参数。

  27. set environment <variable=value>:设置程序运行时的环境变量。

  28. display /f <format> <expression>:以指定的格式显示表达式的值。例如,display /x $eax以十六进制格式显示$eax寄存器的值。

  29. info break:显示所有断点的信息,包括编号、位置和条件。

  30. disable <breakpoint-number>:禁用指定编号的断点。

  31. enable <breakpoint-number>:启用指定编号的断点。

  32. catch <exception>:捕捉指定的异常,当发生该异常时程序会暂停。

  33. watch <expression>:在表达式的值发生变化时暂停程序。

  34. set logging on:打开日志记录功能,将GDB会话输出保存到日志文件中。

3.使用小技巧

⭕你可以只输入命令的首字母来执行GDB调试器命令。GDB支持命令的缩写,只要输入命令的唯一识别首字母即可。例如,你可以输入b代替breakn代替nexts代替step等。这样可以更快地输入命令并提高你的工作效率。然而,如果有多个命令以相同的首字母开头,GDB可能无法确定你要执行的是哪个命令,此时你需要输入更多的字符以区分命令

⭕当你在GDB调试器中按下回车键时,它会执行上一条命令。这对于重复执行相同的命令非常方便,特别是当你需要多次执行相同的调试操作时。只需按下回车键即可重复执行上一条命令,无需重新输入。这可以提高你的工作效率并简化调试过程

三、项目自动化构建工具 - make/Makefile

1. make命令

make是一个常用的构建工具,它在Linux系统中广泛使用。它的主要功能是根据指定的规则和依赖关系自动化构建和编译工程项目。

⭕语法

make命令的基本语法:

make [选项] [目标]

⭕常用选项

  • -f <文件>--file=<文件>:指定使用的makefile文件,默认为Makefile
  • -C <目录>--directory=<目录>:切换到指定的目录后执行make命令。
  • -n--just-print:仅打印出要执行的命令而不实际执行。
  • -B--always-make:无条件重新构建所有目标。
  • -j <并行数>--jobs=<并行数>:指定并行执行的任务数。

⭕常用操作

  • make:使用默认的makefile文件执行构建,默认构建第一个目标。
  • make <目标>:指定构建的目标。
  • make clean:清理构建产生的中间文件和目标文件。
  • make install:安装构建生成的文件到系统目录。
  • make distclean:执行完全清理,将构建的文件和中间文件都删除。

⭕make命令的工作原理

  1. make命令会检查makefile文件,找到要构建的目标及其依赖关系。
  2. 如果目标不存在或比其依赖项的修改时间要旧,则需要重新构建该目标。
  3. 根据makefile文件中定义的规则和命令,执行构建操作。

⭕make命令的优势:

  • 自动化构建:根据规则和依赖关系,只编译需要更新的文件,提高构建效率。
  • 并行构建:使用-j选项可以指定并行执行的任务数,加快构建速度。
  • 依赖关系管理:通过定义依赖关系,确保被修改的文件及其相关文件被正确地重新构建。

2.Makefile文件

Makefile是一种用于构建和管理项目的配置文件,在Linux系统中广泛使用。它定义了项目中的目标、依赖关系以及构建命令等信息。

⭕Makefile的基本结构

一个典型的Makefile文件包含了一系列规则和命令,每个规则由以下几个部分组成:

<目标>: <依赖关系>
    <命令1>
    <命令2>
    ...
  • <目标>:表示需要构建的文件或目标。它可以是一个可执行文件、库文件、中间文件等。Makefile中可以定义多个目标,每个目标对应一个规则。
  • <依赖关系>:表示目标所依赖的文件或其他目标。当依赖关系中的文件被修改时,相关的目标需要被重新构建。
  • <命令>:构建目标所执行的命令。可以是编译源代码、链接、复制文件等操作。

⭕Makefile文件中常用的指令和语法

  • $(变量名):使用变量。可以定义和使用变量来简化Makefile中的重复代码。
  • =或:=:变量赋值。使用=表示简单赋值,使用:=表示延迟赋值(变量的值在首次使用时确定,之后不再改变)。
  • #:注释符号,用于注释说明。
  • @:静默模式。在命令前添加@符号,表示执行命令时不打印命令本身。
  • if...endif:条件判断语句。根据条件判断是否执行命令。
  • for...endfor:循环语句。可以遍历列表中的元素执行命令。

Makefile文件中常用的内置变量:

  • CC:C 编译器的名称。默认为 cc
  • CFLAGS:C 编译器的选项。如 -Wall 表示打开所有警告。
  • LDFLAGS:链接器的选项。如 -lm 表示链接数学库。
  • CPPFLAGS:预处理器的选项。如 -I 添加头文件搜索路径。

⭕Makefile的约定和惯例

  • clean:一般会定义一个clean目标,用于清理生成的目标文件和中间文件。
  • all:一般会定义一个all目标,用于构建项目的所有目标。
  • .PHONY:声明一些伪目标,表示目标不对应任何实际的文件。常用于定义用于执行命令而非产生具体文件的目标。

⭕Makefile的工作原理

  • 当执行make命令时,它会读取当前目录下的Makefile文件。
  • Makefile文件中定义的依赖关系和构建规则会被解析,并根据修改时间和依赖关系确定需要重新构建的目标。
  • 根据规则执行构建命令,生成目标文件。

✅这里给出一个简单的例子来说明Makefile的使用。假设我们有一个 C 语言项目,包含两个源文件:main.chelper.c,它们需要分别编译成目标文件,并链接为可执行文件。

在这里插入图片描述
在这个例子中,我们首先定义了变量 CCCFLAGS,分别表示使用的 C 编译器和编译器选项。

然后,我们定义了默认的构建目标 all,它依赖于目标文件 myapp

myapp 目标表示生成可执行文件myapp,它依赖于对象文件 main.ohelper.o。该规则包含了链接命令,将这两个目标文件链接为可执行文件。

main.ohelper.o 目标分别表示编译 main.chelper.c,它们都依赖于对应的源文件。这些规则包含了编译命令,将源文件编译为目标文件。

最后,我们定义了一个 clean 目标,用于清理生成的可执行文件和目标文件。

使用 make 命令执行这个 Makefile 文件时,它会自动根据依赖关系进行构建。例如,如果修改了 main.c,那么只会重新编译 main.omyapp,而不需要重新编译 helper.o

通过这样的 Makefile 文件,我们可以方便地构建和管理项目,简化了编译和链接操作。

总结

本文介绍了调试器和自动化构建工具的基本概念和使用方法。调试器是一种帮助程序员诊断和修复程序错误的工具,常用的调试器是GDB,它提供了设置断点、单步执行、查看变量值等功能。自动化构建工具是一种用于管理项目构建的工具,常用的工具是make,它通过makefile文件定义构建规则和依赖关系,可以自动化执行编译、链接等操作。通过使用调试器和自动化构建工具,程序员可以更高效地调试和构建项目,提高开发效率和代码质量。

温馨提示

感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

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

相关文章

jvm-运行时数据区概述及线程

1.运行时数据区内部结构 不同的jvm对于内存的划分方式和管理机制存在着部分差异 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机的启动而创建&#xff0c;随着虚拟机的退出而销毁&#xff0c;另外一些则是与线程一一对应的&…

过来,我告诉你个秘密:送给程序员男友最好的礼物,快教你对象学习磁盘分区啦!小点声哈,别让其他人学会了!

[原文连接:来自给点知识](过来&#xff0c;我告诉你个秘密&#xff1a;送给程序员男友最好的礼物&#xff0c;快教你对象学习磁盘分区啦&#xff01;小点声哈&#xff0c;别让其他人学会了&#xff01;) 再唱不出那样的歌曲 听到都会红着脸躲避 虽然会经常忘了我依然爱着你 …

linux学习(文件描述符)[13]

所以fork的时候函数执行完毕&#xff0c;但是数据还在缓冲区中未刷新。 所以会有父子两份数据 在fork&#xff08;&#xff09;之前ffush&#xff08;&#xff09;&#xff08;c语言的接口&#xff0c;刷新缓冲区&#xff09;fflush(stdout)&#xff0c;就不会有重复 缓冲区的…

公网远程连接Redis数据库详解

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 前言 洁洁的个人主页 我就问你有没有发挥&#xff0…

动态loading中转页

动态loading中转页 template <div class"loading"><div class"wavy"><!-- --i是自定义属性&#xff0c;可通过var函数调用 --><span style"--i: 1">登</span><span style"--i: 2">录</span>…

银行数据分析师面试题

回答&#xff1a; 1.自我介绍&#xff1a; "大家好&#xff0c;我是XXX&#xff0c;一名数据分析师。我有着对数据的热爱和深入的了解&#xff0c; 希望能够利用我的技能和知识为企业解决问题、做出有效的决策。 在过去的X年里&#xff0c;我一直从事数据分析相关的工作…

【福建事业单位-公基-法】02国家基本制度、公民的基本权利和义务 国家机构

【福建事业单位-公基-法】02国家基本制度 一、国家基本制度1.1 自然资源归属1.2 选举制度1.3 民族区域自治制度总结 二、公民的基本权利和义务1.1 权力1.2 义务总结 三、国家机构3.1 全国人民代表大会3.2全国人民代表大会常务委员会3.3 国家主席3.4国务院3.5监察委3.6 人民法院…

终于找到了这款最好的文献下载网站

在我们文献资源匮乏时&#xff0c;查找下载文献是件非常困难的事。在网上搜索了许多文献下载网站&#xff0c;不是文献资源太少&#xff0c;就是性价比太低&#xff0c;经过筛检比对终于找到了这款文献资源既丰富&#xff0c;又经济适用的文献下载网站。 这款文献下载网站就是…

6.Web后端开发【SpringBoot入门】

文章目录 1 SpringBoot快速入门1.1 Web分析 2. HTTP协议2.1 HTTP-概述2.1.1 介绍2.2.2 特点 2.2 HTTP-请求协议2.3 HTTP-响应协议2.3.1 格式介绍2.3.2 响应状态码 常见的相应状态码 3 WEB服务器3.1 服务器概述 1 SpringBoot快速入门 Spring的官网Spring Boot 可以帮助我们非常…

根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容 1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除…

使用VS2015打开.pro文件后,编译报错

编译报错内容&#xff1a; MSB8036 找不到 Windows SDK 版本10.0.18362.0。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SD 方法&#xff1a; 1.右键点击 Solution上&#xff0c;在弹出的框中点击“Retarget…

高速PCB设计初学者容易犯的一些错误

高速PCB设计初学者容易犯的一些错误 硬件开发人员设计PCB时&#xff0c;应力求所设计PCB满足以下条件&#xff1a; PCB应首先满足规定的电气性能指标&#xff0c;原则上时电流越大&#xff0c;走线越宽&#xff1b;电压越大&#xff0c;线与线之间的距离越大&#xff1b;PCB应…

c#的委托事件

声明一个委托 //声明一个委托&#xff0c;指定该委托的每个实例都包含一个方法的引用&#xff0c;方法必须带有一个Int参数&#xff0c;并返回Void delegate void Add(int x); //定义委托基本上是定义一个新类&#xff0c;所以可以再定义类的任何相同地方定义委托&#xff0c;…

【Leetcode】103.二叉树的锯齿形层序遍历

一、题目 1、题目描述 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]]示例2: 输入:root = [1] 输…

response-headers,reqqust-headers 请求头大部分字段介绍以及总结

http标头的一些字段的介绍以及使用 公司大下周&#xff0c;趁着摸鱼的时间总结一下大部分标头的大概意思和用法。不是很全&#xff0c;但是大部分应该都在平时需要知道的一些标头的用意 1.Access-Control-Allow-Origin 通过设置这个属性表示可以被哪些网站进行跨域资源共享 …

MyBatis的入门级环境搭建及增删改查,详细易懂

目录 一.mybatis的简介 二.MyBatis的环境搭建 2.1 导入pom依赖 2.2 数据库文件导入连接 2.3 修改web.xml文件 2.4 安装插件 2.5 配置文件 2.5.1 mybatis.cfg.xml文件 2.5.2 generatorConfig.xml文件 2.6 最后测试生成代码 三.MyBatis的增删改查 3.1 写service类&#xff…

Linux服务器性能、网络监控

参考 1.Linux监控指令 2.Linux服务器上监控网络带宽的18个常用命令和linux带宽流量监控查看工具 3.Linux top指令 文章目录 Linux 命令行工具总体性能监控网络监控网络监控iftop磁盘IO使用情况和性能分析 iostat Linux 命令行工具 总体性能监控 $ top直接输入 top&#xff0c;…

msvcp120.dll丢失的解决方法,常见的解决dll问题方法

最近在使用一款常用的图像处理软件时&#xff0c;遇到了一个问题。每次我尝试打开软件时&#xff0c;都会弹出一个错误提示窗口&#xff0c;告诉我缺少msvcp120.dll文件。 系统提示无法启动此程序&#xff0c;因为计算机中丢失msvcp120.dll&#xff0c;尝试重新安装该程序以解…

C++头文件

C头文件 一般头文件特殊头文件windows.hbits/stdc.h 一般头文件 C头文件是一种包含预定义函数、类和变量声明的文件。它们通常用于在源代码文件中引入外部库或模块的功能。 头文件的作用是提供程序所需的声明信息&#xff0c;以便在源代码文件中使用这些声明。当你在源代码文…

【数据结构OJ题】设计循环队列

原题链接&#xff1a;https://leetcode.cn/problems/design-circular-queue/ 1. 题目描述 2. 循环队列的概念和结构 为充分利用向量空间&#xff0c;克服"假溢出"现象的方法是&#xff1a;将向量空间想象为一个首尾相接的圆环&#xff0c;并称这种向量为循环向量。…