Linux的gdb调试

文章目录

  • 一、编译有调试信息的目标文件
  • 二、启动gdb调试文件
    • 1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名
    • 2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b
    • 3、删除断点d:d Num(编号)
    • 4、使能断点disable/enable 断点编号:关闭/打开断点
    • 5、逐过程next/n(F10)与逐语句step/s(F11)
    • 6、跳过断点continue/c:运行至下一个断点处(运行中的F5)
    • 7、查看变量内容或地址print/p
    • 8、显示变量内容或地址:display(长时间显示)与关闭显示变量内容或地址:undisplay
    • 9、运行结束函数并返回:finish(返回之后停下来)
    • 10、跳转至指定行:until 行号
    • 11、显示当前局部的全部变量:info locals (i locals)
    • 12、改变一个变量原有的值:set car 变量=Num
    • 13、查看所在函数:bt(也显示进入函数前的函数)
    • 14、查看所在行与所在函数:f
  • 总结

一、编译有调试信息的目标文件

正常情况下gcc或g++编译链接之后都是不带调试信息的目标文件
这如同VS下的release编译,需要加入选项-g来加入调试信息

正常编译(release版本):
gcc -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -std=c99(使用c99标准)
g++ -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -std=c++11(使用c++11标准)加入调试信息(debug版本):
gcc -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -g -std=c99(使用c99标准)
g++ -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -g -std=c++11(使用c++11标准)
与正常的release编译就多了一个选项-g

这个使用标准可以不带,但如果发现代码没问题又编译不过就加上使用标准试试
在这里插入图片描述
可以从文件大小来对比:
在这里插入图片描述
可以从调试信息对比:

指令:readelf -S filename | grep -i debug
例如:readelf -S test.exe | grep -i debug

在这里插入图片描述
两个文件分别展示含debug的调试信息,可以看到release文件是没有信息展示的

二、启动gdb调试文件

指令:gdb filename
例如:gdb test.exe
如果出现报错信息:bash: gdb: command not found
看一下安装gdb能不能再次打开
root账号下:yum -y install gdb
如果普通账号能提权就:sudo yum -y install gdb

gdb下常用指令集合:

有些指令可以简写,以VS对比
1、quit/q:退出gdb
2、run/r:运行程序(类似F5,没断点直接跑完)
3、查看内容 list/l:l 文件名:行号/函数名,l 行号/函数名(.c、.txt的普通文件,不是可执行文件)
4、打断点 b:b文件名:行号/函数名,b 行号/函数名(类似F9)
5、查看断点 info/i:如info b
6、删除断点:d Num(编号)
7、使能断点:disable/enable 断点编号(关闭/打开断点)
8、逐过程:next/n(F10)
9、逐语句:step/s(F11)
10、跳过断点continue/c:运行至下一个断点处(运行中的F5)
11、查看变量内容或地址:print/p 变量名或取地址(一次性)
12、显示变量内容或地址:display 变量名或取地址(长时间显示)
13、关闭显示变量内容或地址:undisplay 显示编号
14、运行结束函数并返回:finish(运行结束所在函数,就停下来)
15、跳转至指定行:until 行号(中间的代码都是运行了的!)
16、显示当前局部的全部变量:info locals (i locals)
17、改变一个变量原有的值:set car 变量=Num
18、查看所在函数:bt(也显示进入函数前的函数)
19、查看所在行与所在函数:f

1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名

有两种使用方法:
1.查看其他文件的内容
2.查看正在调试的内容
list简写成l
指令是:l filename:line(其他文件) 或者 l line(正在调试的文件)
或者显示函数:line 函数名(l filename:函数名)例如:l test.c:0   或者 l 0
指令这里的line是说显示第几行,通常是把line的上下文打印,line放中间显示

以第0行为例:
l test.c:0(指定的文件,通常是源文件)
在这里插入图片描述
因为调试文件和.c文件一样,展示的也一样
显示main函数:
在这里插入图片描述
(main函数放中间,它的上下文打印显示,行号的时候也是)
显示的不是全部,只是一部分而已
gdb默认记录最近的指令,如果直接按回车则会打印显示接下来没显示的

2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b

打断点
指令:b filename:line(通常是编译前的源文件)
b line
函数名也是一样的:b 函数名(或其他源文件的函数名)查看断点
指令:info b(直接查看全部断点)

对函数和第几行打断点:
在这里插入图片描述
函数名本质也是地址,所以对函数打断点是打函数体内第一行打断点
而且也看到,对于文件或调试的打断点,打的断点也是源文件上的断点

3、删除断点d:d Num(编号)

指令:d Num(断点编号)
例如:d 1
删除断点操作只能用编号删除,删除后编号不重新整理

删除存在的断点:
在这里插入图片描述
删除之后使用info查看,删除之后编号不会整理

4、使能断点disable/enable 断点编号:关闭/打开断点

指令:
关闭断点(断点不起作用):disable Num(断点编号)
关闭断点(断点起作用):enable Num(断点编号)
如同VS右击断点开启或关闭断点

如图所示:
在这里插入图片描述
关闭的断点调试时不起作用

5、逐过程next/n(F10)与逐语句step/s(F11)

指令:
逐过程:next/n(如同VS调试的F10)
逐语句:step/s(如同VS调试的F11)

逐过程(F10):
在这里插入图片描述
逐语句(F11):
在这里插入图片描述

6、跳过断点continue/c:运行至下一个断点处(运行中的F5)

指令:
运行至下一个断点处:continue/c(跳过断点,同VS运行中的F5)

如图所示:
在这里插入图片描述
如果再重新运行run/r则会询问是否重新开始运行:
在这里插入图片描述

7、查看变量内容或地址print/p

指令:
查看变量内容或地址:print/p
例如:p a 或 p &a

如图:
在这里插入图片描述
这种显示方法是一次性的,需要显示的时候要重新输入指令

8、显示变量内容或地址:display(长时间显示)与关闭显示变量内容或地址:undisplay

指令:显示变量内容或地址:display 变量名或取地址
关闭显示变量内容或地址:undisplay 编号
例如:
display a(display &a)
undisplay Num

显示变量内容或地址:
在这里插入图片描述
显示的只能在本作用域显示,跳到别的函数则不会显示
关闭显示变量内容或地址:
在这里插入图片描述

9、运行结束函数并返回:finish(返回之后停下来)

指令:
运行结束函数并返回:finish

如图:
在这里插入图片描述
这个方法可以快速的跳出函数并查看返回了什么

10、跳转至指定行:until 行号

指令:
跳转至指定行:until 行号

如图:
在这里插入图片描述
通常来讲,无法从一个函数内跳到另外一个函数,但用来没打断点时跳过循环挺好的
在同一函数内像断点(F9)与F5的配合

11、显示当前局部的全部变量:info locals (i locals)

指令:
显示当前局部的全部变量:info locals (简写为:i locals)

在这里插入图片描述
可以看到,显示的全部局部变量,还没定义的也显示了,并且是需要时再使用指令显示
说明是一次性的显示指令,还会预先显示变量

12、改变一个变量原有的值:set car 变量=Num

指令:
改变一个变量原有的值:set car 变量=Num
例如:set var i=50

如图:
在这里插入图片描述
这种是本质上改变变量的值,让循环运算有种不确定的执行方法
这种设置方法可以面对特殊情况,比如怀疑变量到了哪个值出现的问题

13、查看所在函数:bt(也显示进入函数前的函数)

指令:
查看所在函数:bt

如图:
在这里插入图片描述
可以看到显示了当前所在的函数
当进入另外一个函数时,能看到当前函数,还能看到调用该函数时的函数

14、查看所在行与所在函数:f

指令:
查看所在行:f

如图:
在这里插入图片描述
这个指令可以查看所在第几行,搭配 list/l 来查看就能知道上下文
这指令是不注意按出来的,不知道不同版本会不会使用不同

总结

以当前指令窗口看,使用效率与使用便捷无法与图形化界面比较
图形化界面能看边调试边查看代表,指令窗口只能用指令来调试
图形化界面有快捷键,指令窗口只有简写指令
如果一个偏复杂的程序,图形化界面更好,指令窗口没啥优势
加油吧少年!
在这里插入图片描述

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

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

相关文章

nginx之重写功能 模块指令 防盗链

一 重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求, 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是 nginx服务器的重要功能之一,重写功…

2024年3月5-7日第12届生物发酵技术装备展-奥博仪表

参观企业介绍 潍坊奥博仪表科技发展有限公司成立于2002年3月,注册资金1000万元,已有20多年的发展历程,是一家专业从事流量仪表开发、生产与测控系统集成的高新技术企业和双软认证企业。 目前公司以仪表、通讯产品、自控系统、软件的研发、生…

npm run dev和npm run serve两个命令的区别

npm run dev和npm run serve两个命令的区别 前端开发过程中运行Vue项目的时候,有时候使用npm run serve命令可以启动项目,有时候却会报错;有时候使用npm run dev命令可以启动项目,有时候却也会报错。是什么原因造成这种情况呢&am…

关于python的数据可视化与可视化:数据读取

带着问题寻找答案可以使自己不再迷茫或者不知所措! 了解什么python的数据可视化? 数据的读取(一般伴随着课程文件中会进行提供和利用) 数据可视化是将Python应用于大气海洋科学中数据处理及分析过程的重要环节,它可以…

Vue3之属性传值的四种情况

文章目录 Vue3之属性传值的四种情况一、引言二、父组件向子组件传值三、子组件向父组件传值四、祖先组件向后代组件传值五、兄弟组件之间传值 Vue3之属性传值的四种情况 一、引言 在vue3中,组件与组件之间是可以传递属性的,包括三种类型: …

pyorbbecsdk奥比中光python版本SDK在Windows下环境配置笔记

1、概述 Orbbec SDK Python Wrapper基于Orbbec SDK进行设计封装,主要实现数据流接收,设备指令控制。 2、系统要求 2.1、操作系统 Windows:Windows 10 (x64)(本文 针对windows)Linux: 18.04/20.04/22.04 (x64)Arm32:…

express+mysql+vue,从零搭建一个商城管理系统4--mysql数据库链接

提示:学习express,搭建管理系统 文章目录 前言一、创建express_service数据库二、安装mysql三、新建config文件夹四、新建config/db.js五、index.js引入db.js文件六、启动项目预览总结 前言 需求:主要学习express,所以先写service…

自动驾驶框架:自动驾驶汽车定位-感知-规划-决策-控制概述,按照我的架构图理解:决策决定的是速度,规划决定的是路径(架构理解推荐)

1.按照我的架构图理解:决策决定的是速度,规划决定的是路径 参考链接:【自动驾驶】运动规划丨速度规划丨自动驾驶速度规划及状态协调方法 2.下面是参考别人的理解: 自动驾驶汽车定位-感知-规划-决策-控制概述 规划-决策-控制知…

爱普生为姿态和振动控制开发理想的IMU

- M-G370PDS0改善了短期噪声,扩展了型号阵容,使产品选择范围更广- 精工爱普生公司(“爱普生”,TSE: 6724)已经开发出M-G370PDS0样品,这是一种配备高性能六轴传感器的新型惯性测量单元(IMU)1。新产品计划于2022年春季批量生产。 爱…

51单片机-(定时/计数器)

51单片机-(定时/计数器) 了解CPU时序、特殊功能寄存器和定时/计数器工作原理,以定时器0实现每次间隔一秒亮灯一秒的实验为例理解定时/计数器的编程实现。 1.CPU时序 1.1.四个周期 振荡周期:为单片机提供定时信号的振荡源的周期…

深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过,所以这里直接上代码 1、 数据部分 1.1 读取数据 # 加载数据 data_path ./data/news.csv data pd.read_csv(data_path)# 预览数据的前几行 data.head()数据是csv格式,只有两列,第一列是标签&#…

导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统

随着元宇宙、VR、AR等新技术的快速发展,旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分,其形式更加多元化智能化。智能导览系统作为一种新的服务方式,能够为游客提供更加便捷的旅游服务和游览体验,也逐渐…

随机采样一致性识别模型 Ransac

pclpy 随机采样一致性识别模型 Ransac 一、算法原理1.背景2.运行说明1.显示带异常值的平面点云2.显示根据平面模型的随机采样一致性得到的平面点云3.显示带异常值的球形点云4.显示根据球形模型的随机采样一致性得到的球形点云 二、代码三、结果1.显示带异常值的平面点云2.显示根…

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

测试开发(6)软件测试教程——自动化测试selenium(自动化测试介绍、如何实施、Selenium介绍 、Selenium相关的API)

接上次博客:测试开发(5)测试分类标准 :按测试对像划分、按是否查看代码划分、按开发阶段划分、按测试实施组织、按是否运行划分、按是否手工划分、按测试地域划分-CSDN博客 目录​​​​​​​ 什么是自动化测试 自动化测试介绍…

react-组件进阶

1.目标 能够实用props接收数据 能够实现父子组件之间的通讯 能够实现兄弟组件之间的通讯 能够给组件添加props校验 能够说出生命周期常用的钩子函数 能够知道高阶组件的作用 2.目录 组件通讯介绍 组件的props 组件通讯的三种方式 Context props深入 组件的生命周期 Render-p…

数据结构:循环队列

一、队列的概念 操作受限的线性表,允许在队列的一端执行入队操作,另一端执行出队操作 先进先出(FIFO) 1.顺序队列 物理结构连续,依赖于数组实现 队列中有一个队头指针和队尾指针,队头指针保存每次要出队的元素,队…

SpringCloud--Nacos解析

一、Nacos简介 Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台,是阿里巴巴开源的一个项目,旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集,可以快速的实现动态服务发现、服务配置、服务元…

2024食品工程与智慧农业国际学术会议(ICFESA2024)

2024食品工程与智慧农业国际学术会议(ICFESA2024) 一、【会议简介】 2024食品工程与智慧农业国际学术会议(ICFESA2024)是一个专注于食品工程和智慧农业领域的国际学术会议。会议将在杭州举行,该会议旨在汇聚全球相关领域的专家学者&#xff…

LiveGBS流媒体平台GB/T28181功能-查看国标设备下通道会话列表直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话

LiveGBS流媒体平台GB/T28181功能-查看直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、下载…