Linux中gdb调试器的使用

news2024/9/20 14:33:01

Linux调试器:gdb

    • gdb简介
    • 基本使用和常见的指令
      • 断点相关
      • 运行相关命令

gdb简介

我们都知道一个程序一般有两个版本分别是debug,和release版本,后者就是发布给用户的版本,而前者就是我们程序员用来调试用的版本。
他们有什么区别呢:因为最终面向的是用户这一个群体,而他们并不需要了解这些调试信息,他们需要更加快速的下载和安装,所以二者最大区别就是大小的不同,debug比release要更加大并且给程序员添加了调试信息。

下面我们来讲解它的使用方法和一些基本指令操作

基本使用和常见的指令

第一步:yum -y install gdb安装gdb
在使用它调式之前,我们需要知道的是使用gcc编译一个源文件的时候默认的release编译,那我们怎么切换到debug模式呢gcc -o -g XXX 只需要在编译的时候加上-g命令就可以了

而二个我们需要了解的点是:调试究竟在干什么?
其实就两方面:
1、找到问题(其中包括:查找,范围查找以及局部逐行查找)
2、解决问题(联系上下代码)

那在Windows中我们使用的VS有以下的调试方式:

显示代码
运行
打断点
局部调试
显示局部变量的值和地址
显示调用栈
逐行执行
逐语句执行

现在我们在Linux中相当于用gdb来平替VS的调试功能

下面我们来看
首先gdb XXXX(文件名)来运行起来

在这里插入图片描述
然后我们需要显示我们的代码才能方便调试:l +行号(显示指定行号后面的代码)
在这里插入图片描述
这里补充一点,gdb中默认会自动记录最近的一条指令,但是我们使用l +行号的命令一般不会将代码显示完全,所以我们可以直接enter回车,直到显示完我们代码为止。

也可以使用l +函数的命令显示指定函数的代码:
在这里插入图片描述
并且如果有多文件的话,也支持l+文件名+行号显示对应的文件的行号代码内容:在这里插入图片描述

断点相关

增加断点b(breakpoints)+对应行号,并且用info b命令查看增加的断点信息
在这里插入图片描述
这里展示的信息Num表示是第几个断点,Enb表示这个断点是否有效,比如我设置了这个断点但是我不想让它生效,这时我们就可以用disable +断点序号来使它无效化在这里插入图片描述
这里可以看到Enb这一列变为了n也就是‘no’,这里需要的注意到是gdb中关于断点的操作,删除,无效化都必须是使用它的序号而不是使用断点对应的行号,这和VS中的就不相同,这也是感觉使用起来很不好的一点。
无效化相反的有效化就是enable +断点序号
比如删除d +断点对应序号在这里插入图片描述

运行相关命令

首先最开始的肯定是让程序先跑起来再谈调试什么的:r(run)
逐过程:首先理解什么是逐过程,就是把每一行代码都当作一个过程逐行执行,并不会进入函数内部
命令:n(next)
对应的逐语句:s(step)
在这里插入图片描述
这里可以看到进入到了handle这个函数的内部
那么我们如果想结束这个函数怎么办呢?:finish
在这里插入图片描述
可以看到finish后直接执行完这个函数

下面我们在while这一行增加一个断点,进入到这个循环,并且我们想知道循环几次后i的值是多少,这时候就可以用p +变量名显示
在这里插入图片描述
那如果我们需要这个变量一直显示呢?可以用display +变量名
在这里插入图片描述
可以看到此后运行代码,i变量一直都是常显示的,并且还可以取其地址
相反用undisplay +变量名来取消
另外如何从一个断点跳转到另一个断点呢?
命令:c(continue)
在这里插入图片描述
可以看到从14行跳到了19行
如果我们还想指定运行到指定行号呢?:until +行号
在这里插入图片描述
下面补充两个命令:
查看堆栈:bt
在这里插入图片描述
可以看到调用的main函数和handle函数
以及设定变量的值set var 变量名=value
比如这样一个场景我们定义的tmp变量等于1的时候执行一个逻辑,等于0是另一个逻辑,为了调试不同分支的代码,我们就可以用这个命令

在这里插入图片描述
最后想说的就是我们调试代码可以用二分的一个思想,如果代码有问题先把后一半注释掉,执行,如果没问题,再注释掉一半,继续下去,如果出问题可以在把它分为不同模块来调试,另外如果一个循环太多,不用逐语句执行,可以先用n命令执行完看这个函数有没有问题,因为不管是n命令还是until它们都不止是简单的跳转到某一行而是执行完了对应区域的代码。

以上就是Linux中gdb调试器的一些常见的命令以及使用,如有问题,欢迎指正,谢谢大家!

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

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

相关文章

Docker搭建Mysql主从复制,最新,最详细

Docker搭建Mysql主从复制,最新,最详细 这次搭建Mysql主从复制的时候,遇到不少问题,所以本次重新记录一下,使用Docker搭建一主三从的Mysql 一、Docker-Compose创建4个Mysql容器 1.1 创建对应的映射文件夹和对应的配置…

GitLab的安装步骤与代码拉取上传操作

一、GitLab的安装 详情见如下博客链接:gitlab安装 二、GitLab配置ssh key (1)打开Git Bash终端生成SSH和添加步骤 1、全局配置git用户名 git config --global user.name "xxx"注意:xxx为你自己gitlab的名字 2、全局…

JavaScript递归菜单栏

HTML就一个div大框架 <div class"treemenu"></div> 重中之重的JavaScript部分他来啦&#xff01; 注释也很清楚哟家人们&#xff01; let data; let arr []; let cons;let xhr new XMLHttpRequest(); // 设置请求方式和请求地址 xhr.open(get, ./js…

Linux上如何分析进程内存分配,优化进程内存占用大小

云计算场景下,服务器上内存宝贵,只有尽可能让服务器上服务进程占用更少的内存,方才可以提供更多的内存给虚拟机,卖给云客户。 虚拟化三大件:libvirt、qemu、kvm内存开销不小,可以优化占用更少的内存。如何找到进程内存开销的地方直观重要,以qemu为例说明。 一、查看进…

别让不专业的HR逼走你的人才!人力资源管理应该遵循哪些原则?

优秀的HR能够带领整个人力资源部门为企业招揽人才、培养人才和留住人才&#xff0c;促使人才为企业的业务增长提供支持。而不专业的HR&#xff0c;不仅无法做到这些&#xff0c;还会把企业原有的人才逼走&#xff0c;因为不合适的人力管理也是导致人才离职的原因。所以&#xf…

【C++】前缀和算法专题

目录 介绍 【模版】一维前缀和 算法思路&#xff1a; 代码实现 【模版】二维前缀和 算法思路 代码实现 寻找数组中心的下标 算法思路 代码实现 总结 除自身以外数组的乘积 算法思路 代码实现 和为K的子数组 算法思路 代码实现 和可被整除的K的子数组 算法思…

C++ 操作Git仓库

代码 #include "common.h" #include "args.c" #include "common.c"enum index_mode {INDEX_NONE,INDEX_ADD };struct index_options {int dry_run;int verbose;git_repository* repo;enum index_mode mode;int add_update; };/* Forward declar…

Python零基础详细入门教程

Python零基础详细入门教程可以从以下几个方面展开&#xff0c;帮助初学者系统地学习Python编程&#xff1a; 一、Python基础入门 1. Python简介 Python的由来与发展&#xff1a;Python是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和强大的功能而受到开发者的喜爱…

2024第二十届中国国际粮油产品及设备技术展示交易会

2024第二十届中国国际粮油产品及设备技术展示交易会 时间&#xff1a;2024年11月15-17日 地点&#xff1a; 南昌绿地国际博览中心 展会介绍&#xff1a; 随着国家逐年加大对农业的投入&#xff0c;调整农业产业结构&#xff0c;提高农产品附加值&#xff0c;促进农民增收。…

CRMEB-众邦科技 使用笔记

1.启动项目报错 Unable to load authentication plugin ‘caching_sha2_password’. 参考&#xff1a;http://t.csdnimg.cn/5EqaE 解决办法&#xff1a;升级mysql驱动 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</ar…

超级弱口令检查工具

一、背景 弱口令问题主要源于用户和管理员的安全意识不足&#xff0c;以及为了方便记忆而采用简单易记的密码。这些密码往往仅包含简单的数字和字母&#xff0c;缺乏复杂性和多样性&#xff0c;因此极易被破解。弱口令的存在严重威胁到系统和用户的数据安全&#xff0c;使得攻击…

在局域网中的另一台主机如何访问windows10WSL中的服务

文章目录 1&#xff0c;开启win10 路由功能2&#xff0c;配置转发规则 1&#xff0c;开启win10 路由功能 2&#xff0c;配置转发规则 netsh advfirewall firewall add rule name"Allowing LAN connections" dirin actionallow protocolTCP localport80 netsh interf…

计算机体系结构:缓存一致性ESI

集中式缓存处理器结构&#xff08;SMP&#xff09; 不同核访问存储器时间相同。 分布式缓存处理器结构&#xff08;NUMA&#xff09; 共享存储器按模块分散在各处理器附近&#xff0c;处理器访问本地存储器和远程存储器的延迟不同&#xff0c;共享数据可进入处理器私有高速缓存…

程序员自曝接单:三年时间接了25个单子,收入12万

程序员接单在程序员的副业中并不少见。程序员接单作为一个起步快、门槛低、类型多样的副业选择&#xff0c;一直深受程序员的青睐。就算你没有接触过接单&#xff0c;也一定对接单有过了解。 程序员接单是指程序员通过接取开发者发布的项目或任务来获取收入的一种工作方式。程序…

“八股文”的江湖:助力、阻力还是空谈?深度解析程序员面试的敲门砖

一、引言&#xff1a;八股文的江湖——助力、阻力还是空谈&#xff1f; 1.1 八股文的定义与背景 八股文&#xff0c;原指我国明清时期科举考试的一种应试文体&#xff0c;因其固定模式和空洞内容而备受诟病。在当今的程序员面试中&#xff0c;程序员的“八股文”通常指的是在技…

告别手动操作:这个微信自动化工具你一定要试试!

随着科技的发展&#xff0c;越来越多的自动化工具应运而生&#xff0c;帮助我们轻松管理微信号。 今天&#xff0c;就给大家揭开这个能让微信自动化的工具的神秘面纱&#xff0c;看看它们能为我们的工作带来哪些便利。 1、批量自动加好友 通过个微管理系统&#xff0c;你可以…

【Unity】 HTFramework框架(五十四)Deployment 轻量级资源部署管线

更新日期&#xff1a;2024年7月31日。 Github源码&#xff1a;[点我获取源码] 索引 Deployment 轻量级资源部署管线使用 Deployment一、创建部署配置二、编辑部署配置三、正式开始资源部署步骤一&#xff1a;资源打包步骤二&#xff1a;资源版本构建步骤三&#xff1a;资源版本…

Redis 初步认识

目录 1. 概述 2. 数据结构 3. 使用方式 4. 优势 1. 概述 Redis &#xff08;remote directory server&#xff09;是一个开源的基于内存的数据存储系统&#xff1b; 可以用作数据库缓存和消息队列等各种场景&#xff0c;也是目前最热门的 NoSQL 数据库之一&#xff1b; 早…

java算法递归算法练习-数组之和

简单找个题目练习一下递归算法&#xff0c;输入一组数组&#xff0c;使用递归的方法计算数组之和。其实这个题目&#xff0c;用循环的方式也很简单就能解决&#xff0c;直接循环遍历一下相加就行了&#xff0c;但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…

Stable Diffusion AI 绘画 之 ControlNet 插件及其对应模型的下载安装

一、介绍 ControlNet: ControlNet是一种通过添加附加条件来控制扩散模型&#xff08;例如Stable Diffusion&#xff09;的神经网络结构。一般的使用方法是结合Stable Diffusion来做到精准控图。 通过上面的方式&#xff0c;ControlNet 可以重用SD编码器作为一个深度&#xff0…