【Linux下代码调试工具】gdb 的基本使用

news2024/12/22 18:44:26

gdb的基本使用

  • 前言
  • 准备gdb工具
  • 调试须知
  • gdb的基本指令
    • 进入调试
    • 退出调试
  • 显示代码及函数内容
    • 运行程序
    • 给程序打断点
    • 查看断点位置
    • 断点使能
    • 取消断点
    • 逐过程调试
    • 逐语句调试
    • 运行到下一个断点
    • 查看变量的值
    • 变量值常显示
    • 取消变量值常显示

前言

在主页前面的几篇文章已经介绍了Vim编辑器及Makefile编译工具的使用。但在实际编程中往往事与愿违,所写代码中有一些小bug需要修改一下。请添加图片描述
用过Vs的应该知道,我们调试需要知道程序执行的某一个细节,包括变量的值、函数的调用过程等从而发现隐藏的错误代码。
但是Linux没有图形化界面,所以需要借助工具来进行代码调试,当然这个工具对于初学者可能会不太适应。请添加图片描述

准备gdb工具

首先检查一下自己Linux是否安装有gdb工具
命令:gdb -v
作用:查看gdb的版本号
在这里插入图片描述
如果显示出gdb的版本,则说明已经安装。

如果没有安装则根据以下操作
命令:yum -y install gdb
作用:安装gdb

调试须知

可执行程序有两种编译版本,一个是Debug版本另一个是Release版本

Debug 通常称为调试版本,它包含调试信息,并且不作程序优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,但其不包含调试信息

为什么要先对这两个版本进行解释呢?因为Linux下gcc/g++默认编译出的版本为Release版本;是不带调试信息的无法使用 gdb 工具对其进行调试。
如下图请添加图片描述
实际上使用gcc/g++进行编译,如果我们需要Debug版本需要在编译指令上加 -g 命令
如:gcc -o testDebug test.c -g
在这里插入图片描述
总结:
1:程序的编译有两种一个是Debug版本另一个是Release版本
2:Linux下gcc/g++的默认编译方式是编译出Release版本
3:要用gdb调试工具就必须在编译时加上 -g 选项,使其可执行程序为Debug版本

gdb的基本指令

首先咱看一下本文所用的被调试文件test.c中的代码如下
在这里插入图片描述
下面是我总结的命令,后面我会示范一些常用的给大家

gdb 文件名 :进入调试
q :退出gdb
l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
l 函数名:列出某个函数的源代码。
r :运行程序
b 行号:在某一行设置断点
b 函数名:在某个函数开头设置断点
info b :查看所有信息。
d break:删除所有断点
d 断点编号 :删除序号为n的断点
disable breakpoints 断点编号:禁用断点
enable breakpoints 断点编号:启用断点
n :单条执行。
s :逐语句调试/进入函数调用
finish:执行到当前函数返回,然后挺下来等待命令
p 变量:打印变量值。
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
info(或i) breakpoints:参看当前设置了哪些断点
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值

进入调试

命令:gdb 文件名
作用:启动调试
注意:只是启动调试,程序并没有运行
如下图:
在这里插入图片描述

退出调试

命令:q
作用:退出调试请添加图片描述

显示代码及函数内容

命令:l
作用:显示当前执行代码及周围10行,l 的特点是每次只显示10行
在这里插入图片描述
命令:l 行号
作用:显示指定行号内容
在这里插入图片描述
命令:l 行号,行号
作用:显示指定行号内的内容,如下图 l 7,11 命令表示显示7到11行的内容。这种命令方式因为是指定式的所以可显示10行以上的内容。
在这里插入图片描述
命令:l 函数名
作用:显示函数代码
在这里插入图片描述

运行程序

命令r
作用:运行程序
注意:此命令和Vs中的F5功能一致,运行过程中遇到断点才会停下,如果没遇到断点程序会直接运行致结束
在这里插入图片描述

给程序打断点

命令:b 行号
作用:给指定行号打断点方便调试
在这里插入图片描述

查看断点位置

命令:info b
作用:查看程序中各断点位置
在这里插入图片描述
解释:
Num : Num下方是断点编号(取消断点时需要用到断点编号)
Type : 表示该标记是断点
Enb : 代表使能,y代表打开, n代表关闭
what : 表示改断点在那个函数和文件中及在第几行

断点使能

命令:disable breakpoint 断点编号
功能:该断点使能关闭(该断点功能不生效)
在这里插入图片描述
命令:enable breakpoint 断点编号
功能:该断点使能打开(该断点功能生效)
在这里插入图片描述

取消断点

命令: d 断点编号
作用:取消该断点
注意:取消断点用的是断点编号(用info b 查看),不是用行号;
在这里插入图片描述
命令:d break
作用:取消所有断点
在这里插入图片描述

逐过程调试

命令: n
功能:逐过程调试(和vs调试时的F10一致)
在这里插入图片描述

逐语句调试

命令:s
功能:逐语句调试
在这里插入图片描述

运行到下一个断点

命令:c
作用:运行到下一个断点
在这里插入图片描述

查看变量的值

命令:p 变量
功能:查看变量的值
在这里插入图片描述
命令:p &变量
功能:查看变量的地址
在这里插入图片描述

变量值常显示

上一个命令 p ,只能显示一次变量的值。如果我们想一直看着变量的变化就得用其他命令。
命令:display 变量名(或取地址)
功能:跟踪显示某个变量的值,每次停下都显示他的值
请添加图片描述

取消变量值常显示

命令:undisplay 编号
功能:取消变量值常显示
在这里插入图片描述

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

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

相关文章

C语言(内联函数(C99)和_Noreturn)

1.内联函数 通常,函数调用都有一定的开销,因为函数的调用过程包含建立调用,传递参数,跳转到函数代码并返回。而使用宏是代码内联,可以避开这样的开销。 内联函数:使用内联diamagnetic代替函数调用。把函数…

【MySQL】 事务

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…

opencv窗口的创建/显示/销毁

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

Docker-harbor私有仓库

一、Harbor概述 1、Harbor的概念 • Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker Registry服务 • Harbor以 Docker 公司开源的Registry 为基础,提供了图形管理UI、基于角色的访问控制(Role Base…

力扣SQL刷题9

目录1107. 每日新用户统计-勉强579. 查询员工的累计薪水 - 各种绕易错点:range与rows区别615. 平均工资:部门与公司比较with建临时表注意点1107. 每日新用户统计-勉强 题型:每个日期中首次登录人数 解答:从原表中用按用户分组后m…

嵌入式开发----示波器入门

示波器入门前言一、示波器介绍关键指标工作原理二、功能按钮介绍三、一键入门四、 典型应用场景校准捕捉测试总线通讯总结前言 对于嵌入式工程师来说,示波器的使用极为重要,他就像是“电子工程师的眼睛”,把被测信号的实际波形显示在屏幕上&…

Java特性之设计模式【桥接模式】

一、桥接模式 概述 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦 这种模式涉及到一个作为桥接的接口…

67. 二进制求和

文章目录题目描述竖式模拟转换为十进制计算题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” …

“白学”了十几年?这两年才感悟出的高效学习方法

作者:元青 微信公众号 「技乐书香」 引言 虽然从小学开始算起,一直到我现在硕士快毕业,已经学习了接近十九年了,但是只有最近两年算得上真正的在"学习",之前的十七年都没有明白也没有认可学习的意义&#…

网络安全实验室7.综合关

7.综合关 1.渗透测试第一期 url:http://lab1.xseclab.com/base14_2d7aae2ae829d1d5f45c59e8046bbc54/ 进入忘记密码页面,右键查看源码,发现一个手机号 解题思路:通过给admin用户绑定13388758688手机号码,然后再进行…

【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 1、自我介绍 您好&a…

leaflet 上传WKT文件,在地图上显示图形(示例代码055)

第055个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载WKT文件,将图形显示在地图上。WKT(Well-known text)是一种文本标记语言,可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。可以通过几何集合的方式来表示不同维度的几何对象。 …

centos学习记录

遇到的问题及其解决办法 centos7安装图形化界面 yum groupinstall ‘X Window System’ yum groupinstall -y ‘GNOME Desktop’ 安装完成后输入init 5进入图形化界面 centos7安装vmware-tools 第一步卸载open-vm-tools 输入命令 yum remove open-vm-tools 输入命令 reboot 在…

你必须知道的 clientWidth, offsetWidth, scrollWidth.

前言: 在公司移动端项目中,我需要十分频繁的和 DOM 元素的各种 width、height 打交道。但是这里有这么多关于 width 的属性,它们之间的区别到底体现在哪里?这是我刚刚接触移动端项目十分头疼的一个问题。经过几天的查阅&#xff0…

Django的基础使用

安装Django pip3 install django2.2.5检查是否安装Djangopip3 freeze|grep -i Django创建工程django-admin startproject 名称如:django-admin startproject bookmanager进入bookmanager目录运行django运行python:python manage.py runserver查看django进…

C++基础(5) - 复合类型(上)

文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串(字符数组)1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…

代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串

一、参考资料组合总和题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ 组合总和II题目链接/文章讲解:https://programmercarl.com/004…

STL——stack

一、stack介绍和使用 1.stack文档介绍 (1)stack是一种容器适配器,专门用于具有后进先出操作的上下文环境中,其只能从容器的一端进行元素的插入与删除,以及提取操作。 (2)stack是作为容器适配…

Python如何安装模块,python模块安装失败的原因以及解决办法

前言 今天来给刚开始学习python的朋友讲解一下 如何安装python模块, python模块安装失败的原因以及解决办法 很多朋友拿到代码之后,就开始复制粘贴 --> 然后右键进行运行 结果就是报错说 没有这个模块 得安装啥的 Python模块安装 一. 打开命令提示符 win …

分布式项目-品牌管理(5、6)

【今日成果】: //使用阿里云OSS服务: //使用v-if如果地址没有就不显示 , 如果地址错误图片就显示不出来; 【快速回顾】: 任何数据的删除都不要使用物理上的删除,应当使用逻辑上的删除!&…