Linux 调试工具:gdb

news2024/12/23 9:12:15

调试复习

调试可谓是 “贯穿” 了程序员的一生,调试的重要性,就不再赘述啦!如果你还不知道什么是调试,可以看看 Windows 系统的 Visual Studio 是如何调试的:➡️ visual stuudio 使用调试技巧

下载调试软件 gdb

yum install gdb -y

gdb 的使用

gdb 的使用非常简单:

gdb 可执行文件

这是一段简单的代码:

#include<stdio.h>

int main()
{
    printf("hello gdb\n");
    return 0;
}

这是 makefile 文件:

test:test.c
	gcc -o $@ $^ -std=c99
.PHONY:clean
clean:
	rm -f test

make 生成可执行文件之后,我们来看看是否能够启动 gdb 调试:
在这里插入图片描述
我们看到出现了报错:可执行文件中没有调试信息。这是因为 linux 环境下 gcc 形成的可执行程序默认是以 release 的形式发布的,release 版本的可执行程序当然不包含调试信息啦!
于是,我们需要以 debug 的方式发布可执行程序,只需要加一个 -g 的选项就可以啦!

# 这是 makefile 文件
test:test.c
	gcc -o $@ $^ -g -std=c99
.PHONY:clean
clean:
	rm -f test

那么如何看到可执行程序中是否有调试信息呢?我们都知道 linux 环境下的可执行程序是一种 elf 格式的文件,我们只要打开这个 elf 格式的文件,就能看到啦!

readelf -S 可执行程序

我们可以看到 debug 方式发布的可执行程序确实多了调式信息。(文件比较长,下图中只截取了一部分)
在这里插入图片描述

调试前的准备

我们来写一个简单的程序,作为调试之前的准备工作吧!
test.c

#include<stdio.h>
#include "function.h"

int multiple(int x, int y)
{
	int ret = x * y;
    return ret;
}
int main()
{
    int a = 2, b = 3;
    int sum = 0;
    sum = Add(a, b);
    printf("a + b: %d\n", sum);
    
    int times = multiple(a, b);
    for(int i = 0; i < times; i++)
    {
    	printf("hello gdb %d\n", i);
    }
    return 0;
}

function.h

#pragma once

int Add(int x, int y);

function.c

#include "function.h"

int Add(int x, int y)
{
    return x + y;
}

调试命令一览

gdb 可执行程序   #开始调试
quit/q          #退出调试
l 数字          #显示代码,默认是 10 行
r               #运行程序
b 行号          #在main函数所在文件的指定行打断点
b 文件名:行号    #在指定文件的指定行号打断点
b 函数名         #在指定函数的第一行代码处打断点
info b          #查看所有断点信息
d 断点编号       #删除断点

# r 开始调试之后

n               #逐过程运行
s               #逐语句执行
p 变量           #查看变量的值
display 变量     #变量值常显示,类似于 visual studio 的监视窗口
undisplay 变量   #取消变量的长显示
untill 行号      #在函数内跳转到指定行
finish          #执行完当前行所在的函数
c               #运行到下一个断点处
disable 断点编号 #禁用指定断点
enable 断点编号  #恢复禁用的断点
set var 变量=#类比 visual studio 中的条件断点
bt              #查看调用堆栈
info locals     #查看本地变量(局部变量)

下面我会选择几个比较不好理解的讲讲

l 数字

l 默认显示 10 行,gdb 会记住上一条命令,回车就可以继续执行上一条命令。
在这里插入图片描述

b 文件名:行号

这个命令在多文件的调试中可能会用到:
在这里插入图片描述

d 断点编号


断点编号是什么呢?查看断点编号需要使用 info b 命令:
在这里插入图片描述
其中这个 Num 就是断点编号啦!


在这里插入图片描述
可以看到删除断点之后就查看不到断点的信息啦!


删除刚刚的断点之后我们再打一个断点,发现断点编号并不是 1,说明断点编号是递增的!
在这里插入图片描述

display 变量

可以动态显示一个变量的内容,类似于监视窗口。
我们使用 r 运行程序,开始调试。display num 看到:sum = 0 没问题,然后 n 逐过程运行。发现 sum 变成了 5。这就相当于监视窗口不是嘛!
在这里插入图片描述

finish

执行完当前行所在的函数,这是什么意思呢?我们在第六 6 行打一个断点,看看效果就知道了!
在这里插入图片描述
效果就是直接完成了当前行所在函数的运行

disable 断点编号

这个命令可以禁用断点,visual studio 也是可以的!
在这里插入图片描述
禁用 1 号断点之后,我们查看断点信息,发现 Enb 属性变成了 n。这就表示这个断点被禁用了!

set var 变量=值

我们在 19 行打一个断点,然后运行程序,开始调试,再然后 set var i=3 运行之后,我们发现打印的就是 hello gdb 3 这是不是和 visual studio 中的条件断点一个味儿!
在这里插入图片描述

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

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

相关文章

常用的系统播放器——MediaPlayer生命周期

常用的系统播放器——MediaPlayer 状态图以及生命周期 Idle状态、End状态、Error状态 MediaPlayer创建实例或者调用reset&#xff08;&#xff09;后就处于Idle状态&#xff0c;即就绪。 任意时刻调用release&#xff08;&#xff09;就会进入End 当运行过程中出错&#xf…

【力扣】189. 轮转数组

【力扣】189. 轮转数组 文章目录 【力扣】189. 轮转数组1. 题目介绍2. 解法2.1 方法一&#xff1a;不太正规&#xff0c;但是简单2.2 方法二&#xff1a;使用额外的数组2.3 方法三&#xff1a;环状替换2.4 方法四&#xff1a;数组翻转 3. Danger参考 1. 题目介绍 给定一个整数…

根据端口查找进程

关闭kibana kibana自带命令 kibana没有提供关闭命令&#xff0c;通过命令 ps -ef|grep kibana查找不到kibana相关的信息。 可以通过进程暴露的端口来查找 netstat -anltp|grep 5601获取到进程号&#xff0c;然后kill掉进程 kill -9 进程号Docker管理Kibana 但是如果使用D…

【开题报告】基于卷积神经网络的图像脑部MRI图像分割

论文题目 基于卷积神经网络的图像脑部MRI图像分割 一、选题意义 1.课题研究的目的和意义 1.1选题目的 脑部疾病是高致残致死率的疾病之一&#xff0c;对人们的生活质量和生命安全都有着十分重大的影响&#xff0c;所以各个国家都开始对脑部疾病的研究重视起来。帕金森、脑胶质…

SpringBoot+网易邮箱登录注册

文章目录 SpringBoot网易邮箱登录注册pom.xmlapplication.ymlsqlUserEmail.javaUserEmailMapper.javaUserEmailMapper.xmlEmailService.javaUserEmailService.javaUserEmailServiceImpl.javaUserEmailController.javaregister1.html 编写前参考 SpringBoot网易邮箱登录注册 po…

webpack如何设置兼容浏览器的范围​browserslist

Browserslist 是前端工程化不可或缺的工具&#xff0c;无论是处理 js 的 babel 还是处理 css 的 postcss&#xff0c;他们背后都有Browserslist 的身影。 一、如何查看查看所有浏览器和它的市场占有率 我们如何知道现在的浏览器那些被废弃、那些市场占有率高&#xff0c;可以…

第13关 解决K8s中Ingress Nginx控制器无法获取真实客户端IP的问题

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 这节课带大家探索并分享最全面的解决在使用Kubernetes&#xff08;K8s&#xff09;和Ingress-Nginx-Controller中无法获取客户端真实IP问题的视频教程&#xff0c;帮助你快速理解并解决这一问…

SpringBoot项目整合Redis,Rabbitmq发送、消费、存储邮件

&#x1f4d1;前言 本文主要是【Rabbitmq】——SpringBoot项目整合Redis&#xff0c;Rabbitmq发送、消费、存储邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页…

一起学docker系列之十四Dockerfile微服务实践

目录 1 前言2 创建微服务模块2.1 **创建项目模块**2.2 **编写业务代码** 3 编写 Dockerfile4 构建 Docker 镜像5 运行 Docker 容器6 测试微服务7 总结8 参考地址 1 前言 微服务架构已经成为现代软件开发中的一种重要方式。而 Docker 提供了一种轻量级、便携式的容器化解决方案…

贵州乾辰谷材 以科技创新引领绝缘材料领域的新发展

贵州乾辰谷材科技有限公司&#xff0c;这家于2018年10月18日成立的贵州本地企业&#xff0c;已经在绝缘材料领域崭露头角。乾辰谷材不仅在成立短短几年内实现了快速成长&#xff0c;更以其科技创新能力和卓越产品性能赢得了业界和用户的广泛赞誉。 乾辰谷材的创始人王金斗先生&…

RFID资产管理系统全功能详解!高效管理从这里开始!

在现代商业环境中&#xff0c;RFID资产管理系统正成为企业管理不可或缺的先进工具。现代企业管理正处于数字化的浪潮中&#xff0c;而RFID资产管理系统正是这场浪潮中的一颗璀璨明珠。在这篇文章中&#xff0c;我们将全方位解析RFID资产管理系统的功能&#xff0c;助您深入了解…

Vue框架学习笔记——绑定class样式和绑定style样式

文章目录 前文提要class样式的三种绑定方法&#xff08;图片来自参考链接&#xff09;style样式&#xff08;内联形式&#xff09;总结 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从…

redis运维(二十二)redis 的扩展应用 lua(四)

一 最佳实践 ① 铺垫 最佳实践&#xff1a;1、把redis操作所需的key通过KEYS进行参数传递2、其它的lua脚本所需的参数通过ARGV进行传递. redis lua脚本原理 Redis Lua脚本的执行原理 ② 删除指定的脚本缓存 ③ redis集群模式下使用lua脚本注意事项 1、常见报错现象 C…

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日&#xff0c;冷喷涂技术及其在增材制造中的应用专题会在襄阳召开&#xff0c;来自国内外200多名科技工作者齐聚一堂&#xff0c;共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办&#xff0c;湖北超卓航空科技股份有限公司…

LeetCode.24两两交换链表中的节点

LeetCode.24两两交换链表中的节点 1.问题描述2.解题思路3.代码 1.问题描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示…

Hive数据库与表操作

文章目录 一、准备工作二、Hive数据库操作&#xff08;一&#xff09;Hive数据存储&#xff08;二&#xff09;创建数据库&#xff08;三&#xff09;查看数据库&#xff08;四&#xff09;修改数据库信息 一、准备工作 二、Hive数据库操作 &#xff08;一&#xff09;Hive数据…

Ultipa参加国际科学会议KGSWC2023

近日&#xff0c;领先的国际科学会议 KGSWC 2023&#xff0c;在西班牙萨拉戈萨大学召开&#xff0c;Ultipa Graph参加。 KGSWC2023是第五届伊比利亚-美洲会议和第四届印度-美洲知识图谱与语义网大会的联合论坛。自2019年成立以来&#xff0c;KGSWC一直是一个重要的学术活动&am…

通过流量监控分析某个部门或客户端网络性能

在当今数字化时代&#xff0c;网络已经成为组织和企业不可或缺的基础设施之一。作为信息传输和数据交互的关键载体&#xff0c;网络的性能对于保障业务的稳定运行和提升工作效率至关重要。因此&#xff0c;对某个部门或客户端网络的性能进行分析和评估&#xff0c;有助于了解当…

PyTorch入门教学——加载数据(Dataset)

1、简介 PyTorch中如何读取数据主要涉及到两个类&#xff0c;分别为Dataset和Dataloader。 Dataset&#xff1a;创建可被Pytorch使用的数据集Dataloader&#xff1a;向模型传递数据本文主要讲解Dataset的使用方法。 2、Dataset 2.1、查看使用方法 打开Anaconda Prompt&…

在表格中显示字典的内容(根据后端返回的数据)vue3

进入页面&#xff0c;调接口&#xff0c;后端返回数据&#xff0c;indexType为0或者1&#xff0c;要用这个数据显示字典的内容 用插槽拿到数据 写一个函数&#xff0c;在模板中使用 const { proxy } getCurrentInstance(); // 字典-指标类型 const { index_type } proxy.u…