【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.mzph.cn/news/673797.shtml

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

相关文章

nginx:配置内网转发阿里云oss图片加水印

图片水印文档 https://help.aliyun.com/zh/oss/user-guide/add-watermarks nginx配置如下 location ^~ /oss/ {if ( $request_uri ~* \.(png|jpg|jpeg) ){set $args "x-oss-processstyle/watermark";}proxy_pass http://<bucket>.oss-cn-beijing-internal.al…

人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况

、 大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分24-人工智能的数学基础&#xff0c;汇集了人工智能数学知识最全面的概况&#xff0c;深度学习是一种利用多层神经网络对数据进行特征学习和表示学习的机器学习方法。要全面了解深度学习的数学基…

FlinkSql通用调优策略

历史文章迁移&#xff0c;稍后整理 使用DataGenerator 提前进行压测&#xff0c;了解数据的处理瓶颈、性能测试和消费能力 开启minibatch&#xff1a;"table.exec.mini-batch.enabled", "true" 开启LocalGlobal 两阶段聚合&#xff1a;"table.exec.m…

netstat: 未找到命令

当您在Linux系统中遇到“netstat: 未找到命令”的提示时&#xff0c;这通常意味着您的系统上没有安装netstat工具。Netstat是一个用于显示网络连接、路由表、接口统计等网络相关信息的命令行工具。 要解决这个问题&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 打开…

java springBoot项目实现数据脱敏的策略

在实际的软件开发中&#xff0c;保护用户隐私数据是非常重要的。在Java Spring Boot项目中&#xff0c;通常需要对敏感数据进行脱敏处理&#xff0c;以确保数据安全性。本文将介绍几种常见的数据脱敏策略&#xff0c;并提供相应的实现方式和示例代码。 1、使用Hutool工具类进行…

Leetcode 2641. 二叉树的堂兄弟节点 II

本题为修改给定二叉树中结点的值&#xff0c;修改的规则为&#xff1a;将原来的值替换为该结点所有堂兄弟结点值的和。 其实我们可以延申一下题意&#xff0c;怎样去计算该结点所有堂兄弟结点值的和&#xff1f;其实只需要先计算每一层所有结点的和&#xff0c;再减掉其本身的…

如何做零售企业满意度调查

零售业满意度调研是一项至关重要的市场研究工作&#xff0c;它能够帮助企业深入了解消费者对零售店的整体印象、商品质量、服务质量等方面的评价。这种评价可以帮助企业了解自身的优势和不足&#xff0c;提高企业的市场竞争力。民安智库&#xff08;第三方市场调研公司&#xf…

《学成在线》微服务实战项目实操笔记系列(P1~P62)【上】

《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。同时也欢迎大家提问与讨论&#xff0c;我会尽力帮大家解…

nginx登录用户验证配置

我们的nginx端口一般都是对外开放的&#xff0c;所以有一定程度上有被别人扫描的风险&#xff0c;所以为了减少被扫描的风险&#xff0c;我们可以配置一个nginx的用户登录验证&#xff1b; 用户验证登录需要nginx的一个模块&#xff1a;ngx_http_auth_basic_module 我们使用…

进程间通信(4):消息队列

先进先出&#xff0c;保证信息的有序性。 函数&#xff1a;msgget(搭配ftok)、msgsnd、msgrcv、msgctl 实现流程&#xff1a; 1、创建消息队列IPC对象 msgget 2、通信(内置函数&#xff1a;msgsnd、msgrcv) 3、删除消息队列IPC对象 msgctl write.c /* * 文件名称&…

PyTorch 2.2 中文官方教程(八)

训练一个玛丽奥玩游戏的 RL 代理 原文&#xff1a;pytorch.org/tutorials/intermediate/mario_rl_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者&#xff1a; 冯元松, Suraj Subramanian, 王浩, 郭宇章。 这个…

谈谈安全对抗的本质

前言 红队和蓝队的兄弟们都辛苦了&#xff0c;趁夜深人静的时候写了一点东西&#xff0c;算是一点心得与体会&#xff0c;谈谈安全对抗的本质&#xff0c;仅供大家参考。 今年的活动&#xff0c;笔者和去年一样&#xff0c;镇守公司&#xff0c;运筹帷幄之中&#xff0c;决胜千…

2/7 算法每日N题(二分+双指针)

第一题&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;int num nums[mid];if (num target) {return mid;} else if (num >…

有道论文翻译接口,python版和lua版

论文翻译接口python版 import requests import hashlib from urllib.parse import quotedef get_md5(s,is_hexTrue):md5hashlib.md5()md5.update(s.encode())if is_hex:return md5.hexdigest()return md5.digest()def translate(source_url,from_en,tozh-CHS):params {from: f…

Google DeepMind最新研究,将视觉语言大模型作为强化学习的全新奖励来源

论文题目&#xff1a;Vision-Language Models as a Source of Rewards 论文链接&#xff1a;https://arxiv.org/abs/2312.09187 在大型语言模型&#xff08;LLM&#xff09;不断发展的进程中&#xff0c;强化学习扮演了重要的角色&#xff0c;ChatGPT就是在GPT-3.5的基础上经过…

python将word文件转换成pdf文件

要将word文件转换成pdf文件&#xff0c;可以使用Python的pywin32库结合Microsoft Office软件来实现。 方法一&#xff1a; import win32com.client as win32def word_to_pdf(input_file, output_file):word win32.gencache.EnsureDispatch(Word.Application)doc word.Docume…

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

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

c#cad 创建-点(六)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 创建一个点的命令方法。代码的主要功能是在当前活动文档中创建一个点&#xff0c;并将其添加到模型空间块表记录中。 代码的主要步骤如下&#xff1a; 获取当前活动文档、数据库和编辑器对象。使用事务开始创建点的过程…

Java排序方法

在Java中&#xff0c;有多种排序方法可用&#xff0c;其中包括快速排序、归并排序、插入排序等等。Java标准库提供了对数组和集合进行排序的方法。下面是一些常用的Java排序方法的示例&#xff1a; 1. 使用Arrays类中的sort方法对数组进行排序&#xff08;快速排序&#xff09…

【Git版本控制 05】多人协作

目录 一、邀请开发用户 二、新建远程分支 三、拉取远程分支 四、推送远程分支 五、合并远程分支 六、多分支协作 一、邀请开发用户 在windows环境下&#xff0c;再clone同⼀个项⽬仓库&#xff0c;来模拟⼀起协作开发的另⼀名⼩伙伴。 际开发中&#xff0c;每个⽤⼾都有…