【Linux】Linux调试器--gdb的使用

news2024/10/6 20:38:07

有时候,我们并不需要被教导,而是应该被不断的提醒。
在这里插入图片描述

文章目录

  • 一、gdb的介绍
  • 二、debug和realease版本的区别
  • 三、gdb的使用
    • 1.显示代码: l+行号(list)指令
    • 2.设置断点: b+行号(breakpoint)
    • 3.查看断点: info b
    • 4.取消断点: d + 断点编号
    • 5.调试运行:r(run)
    • 6.逐过程:n(next)
    • 7.逐语句:s(step)
    • 8.运行至下一个断点处:c(continue)
    • 9.查看函数调用堆栈:bt
    • 10.直接运行完当前函数,然后返回到调用地方:finish
    • 11.临时查看变量或地址的值:p + 变量或地址
    • 12.监视跟踪查看/取消监视跟踪查看:display/undisplay
    • 13.跳转到指定行:until+行号
    • 14.修改变量的值:set var
    • 15.查看当前栈帧局部变量的值:info locals
    • 16.禁用/启用断点:disable/enable 断点编号



一、gdb的介绍

1.
gdb是linux上面的调试器,是非图形化界面纯命令行调试的,用起来非常的麻烦!

2.
安装gdb工具的命令

sudo yum install -y gdb

3.
默认情况下,gdb无法进行对gcc现在发布的程序进行调试,因为gcc默认生成的软件是realease版本的,没有调试信息,无法被调试器gdb调试,并且gcc是默认动态链接的,如果想静态链接还需要加static选项,所有gcc是有两种默认行为的。

4.
gcc编译时添加-g选项可以使得gcc发布的程序软件为debug版本,这样就可以通过gdb对程序进行调试

mytest_g:mytest.c
	gcc mytest.c -g -o mytest_g
	
.PHONY:clean
clean:
	rm -f mytest_g

二、debug和realease版本的区别

1.
debug是给程序员用的版本,添加了调试信息,用于解决软件或程序中出现的问题,realease是发行给客户使用的版本,并未添加调试信息,只需要给客户提供优越的产品使用环境即可,至于是否能够debug调试,这是程序员才应该关心的主要问题。

2.
可以看到debug版本的字节大小是要大于realease版本的,这是因为其中添加了调试信息。

在这里插入图片描述
3.
通过指令可以读取可执行程序的二进制构成,显示出具体的二进制软件的内部所形成的特定格式。
值得注意的是:每一个二进制程序不仅仅只是一堆二进制代码,他们内部都是有特定格式的,Linux中形成的可执行程序是elf格式。

想要了解elf格式的可以去看看 深入了解计算机系统这本书

[wyn@VM-8-2-centos test_dir]$ readelf -S mytest_g | grep debug

下面就是debug中所添加的调试信息,而realease版本是没有这些调试信息的
在这里插入图片描述

三、gdb的使用

1.显示代码: l+行号(list)指令

gdb会默认记住历史上曾经输入的指令,l+0输入后gdb会从第零行开始显示部分的代码,我们继续回车便可以显示后半部分的代码,直到显示完停止
在这里插入图片描述

2.设置断点: b+行号(breakpoint)

在这里插入图片描述

3.查看断点: info b

在这里插入图片描述
在这里插入图片描述

4.取消断点: d + 断点编号

在这里插入图片描述

5.调试运行:r(run)

vs2022环境:
1.运行调试:fn+f5如果有断点,就停下来,如果没有断点就直接运行起来,如果想要跳到下一个断点,可以继续按fn+f5
2.取消调试:fn+shitf+f5
3.直接运行:fn+crtl+f5直接运行,有断点也不会调试

linux环境
1.直接运行:./+二进制可执行程序
2.调试运行:run

在这里插入图片描述

6.逐过程:n(next)

在这里插入图片描述

7.逐语句:s(step)

在这里插入图片描述

8.运行至下一个断点处:c(continue)

在这里插入图片描述

9.查看函数调用堆栈:bt

在这里插入图片描述

10.直接运行完当前函数,然后返回到调用地方:finish

在这里插入图片描述

11.临时查看变量或地址的值:p + 变量或地址

在这里插入图片描述

12.监视跟踪查看/取消监视跟踪查看:display/undisplay

在这里插入图片描述

13.跳转到指定行:until+行号

可以利用until来跳出循环
在这里插入图片描述

14.修改变量的值:set var

在这里插入图片描述

15.查看当前栈帧局部变量的值:info locals

在这里插入图片描述
在这里插入图片描述

16.禁用/启用断点:disable/enable 断点编号

在这里插入图片描述

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

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

相关文章

HTML5 定位

文章目录HTML5 定位geolocation简介getCurrentPosition()watchPosition() 和 clearWatch()百度地图HTML5 定位 geolocation 简介 在HTML5中,可以使用geolocation对象来获取用户的地理位置信息。 语法 window.navigator.geolocation //简写为 navigator.geoloca…

uni-app HBuilderX项目转为cli项目及踩坑记录

uni-app有两种创建创建项目的方式,通过HBuilderX可视化界面进行创建和通过vue-cli命令行,两者的区别可以参考uni-app官网-可视化方式的区别 其中cli项目是可以直接运行在hx中的,相比hx项目,cli的好处还有可以自定义环境变量和自定…

借助“云上”SPSS降低未来数据分析的不确定性

生活工作中我们常常会遇到这样或那样的困难,比如不得不临时居家办工,却发现家中电脑没有安装工作中的必备软件,比如毕业论文写到一半,同学告诉你,新版的软件升级加强了某个模型,能让你更好的完成论文。软件…

浅析从DWARF到BTF @龙蜥社区eBPF SIG

一、背景 一个程序会经历编码、编译、运行的过程,但所有的开发几乎都不可能是一帆风顺的,总会有些意想不到的错误,这时便需要调试。那么调试器使用的调试信息是从哪里来的呢?答案就是从编译后的文件中来的(依赖编译的时候使用特定…

Kubernetes使用Ingress Nginx流量代理

理论了解 1、ingress简介 kubernetes官方文档 Ingress 是 kubernetes API 中的标准资源类型之一,ingress 实现的功能是在应用层对客户端请求的 host 名称或请求的 URL 路径把请求转发到指定的 service 资源的规则,即用于将 kubernetes 集群外部的请求…

数字孪生水电站:发电流程三维可视化优化

从大禹治水到三峡大坝的建造,人类为控制和调配自然界的地表水和地下水,修建了许多的水利工程。对水资源进行了广泛的开发利用,诸如农业灌溉、工业和生活用水、水力发电、航运、港口运输、淡水养殖、旅游等。 将图扑软件与 GIS、粒子仿真、虚拟…

动作捕捉系统用于微创手术

微创手术是医生通过病人体表的微小切口,将细长的手术工具探入病人体内进行手术操作。与传统的开口手术相比,这种方式可减少手术对病人造成的创伤,缩短恢复时间。但是,微创手术也给医生的操作带来了一系列困难:比如受小…

Autoform R10中文版安装说明教程

1、安装R8的服务RLM_v12.0BL2 2、拷贝文件到相关目录(1、许可证,C:\Program Files安装许可的位置。。。直接停止服务后替换R10 BIN文件 然后改环境变量(这里可以直接改,也可以删掉然后重新输入,建议删掉后输入&#x…

上海亚商投顾:创业板缩量跌近1% 血氧仪概念逆市大涨

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪沪指早间低开高走,盘中一度拉升翻红,午后又再度下挫,深成指、创业板指均跌近1%。…

5G网络的关键技术及特点,面临的挑战!

01 5G关键技术 超密集组网:5G需要满足热点高容量场景(高流量密度、高速率) 超密集组网:大量增加小基站,以空间换性能 基站一般包括:宏基站和小基站 宏基站:即“铁塔站”,一般覆盖范围数千米…

Linux课程笔记

Linux基础命令 Linux的目录结构 /,根目录是最顶级的目录了Linux只有一个顶级目录:/路径描述的层次关系同样适用/来表示/home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txt ls命令 功能:列出…

【北邮】计算机组成原理实验:实验一 运算器组成实验

实验一 运算器组成实验 实验目的 ⑴熟悉逻辑测试笔的使用方法。 ⑵熟悉 TEC-8 模型计算机的节拍脉冲 T1、T2、T3; ⑶熟悉双端口通用寄存器组的读写操作; ⑷熟悉运算器的数据传送通路; ⑸验证 74LS181 的加、减、与、或功能&#xff1…

Python数据容器(五)

python学习之旅(五) 👍基础语法部分笔记(一) 👍条件判断部分笔记(二) 👍循环语句部分笔记(三) 👍函数使用部分笔记(四) 👍数据容器部分笔记(五) 一.数据容器 一种可以容纳多份数据的数据类型&am…

kail - 扫描与爆破

数据来源 扫描技术 背景 在渗透测试过程中,为了节省人力和时间,通常采用手工和工具相结合的方式。使用工具,就是将一些机械性的操作自动化实现,用来提高渗透测试的效率。例如,寻找内网网段[10.10.10,20/24]所有在线主…

MySQL窗口函数 和 阿里云日志15日留存率仪表盘统计脚本实现

窗口函数的官方描述:窗口函数对一组查询行执行类似聚合的操作。但是,虽然聚合操作将查询行分组为单个结果行,但窗口函数会为每个查询行生成一个结果,发生函数评估的行称为当前行,与发生函数评估的当前行相关的查询行构…

Kubernetes证书热更新期限至100年【HA高可用集群】

一、问题与环境 1.为什么更新证书?局域网如何保障服务稳定性?   众所周知k8s(Kubernetes)有一个默认证书期限为一年不成文的规定,官方的解释是“最佳的做法是经常升级集群以确保安全。(升级后集群证书自…

MySQL表的增删查改

目录 1、表的插入 <1> 全列插入 <2> 指定列插入 <3> 插入否则更新 <4> 替换 2、表的查找 <1>全列查询 <2>指定列查询 <3> where条件 <4> 筛选分页结果 3、表的修改 4、表的数据删除 5、查看表结构 6、插入查询结…

SpringCloud微服务项目实战 - 2.App登录及网关

如果你追求一个局部的更好甚至完美,你有可能花费巨大的资源和时间&#xff1b; 从总体上看&#xff0c;这往往意味着总体的浪费和失败&#xff0c;这是传说中的“打赢了战役打输了战争”。 系列文章目录 项目搭建App登录及网关 文章目录系列文章目录一、App登录1. 需求分析2. …

2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest K. The Robot

翻译&#xff1a; 有一个机器人在一个没有尽头的方格场上。最初&#xff0c;机器人位于坐标为(0,0)的单元中。他将执行由一串大写拉丁字母“L”、“R”、“D”、“U”所描述的命令。当一个命令被执行时&#xff0c;机器人只是朝着相应的方向移动: “L”:向左一个单元格(当前单…

【聆思CSK6 视觉AI开发套件试用】AI控制直流电机转速接口打通

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;oxlm 背景 在访问极术社区时&#xff0c;偶然发现聆思科技的CSK6开发板的评估活动&#xff0c;看CSK6的硬件配置和技术规格&#xff0c;300M…