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.mfbz.cn/a/415090.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于InternLM和LangChain搭建自己的知识库

背景 LLM存在一定的局限性,如: 知识时效性受限:如何让LLM能够获取最新的知识专业能力有限:如何打造垂直领域的大模型定制化成本高:如何打造个人专属的LLM应用 正文 为了突破LLM的局限性,目前有两种范式…

Python入门学习:if语句与条件控制--and、or、in、not in详解与实践

Python入门学习:if语句与条件控制–and、or、in、not in详解与实践 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

Zookeeper启动报错排查

前言:生产linux部署的zookeeper,执行启动脚本后,还是无法使用,故进行重启排查 在zookeeper的bin目录下执行 ./zkServer.sh start-foreground 可实时查看启动日志排查问题 根据上面的日志可以看出,是zoo.cfg配置文件里…

本地快速部署谷歌开放模型Gemma教程(基于LMStudio)

本地快速部署谷歌开放模型Gemma教程(基于LMStudio) 一、介绍 Gemma二、部署 Gemma2.1 部署工具2.1 部署步骤 三、总结 一、介绍 Gemma Gemma是一系列轻量级、最先进的开放式模型,采用与创建Gemini模型相同的研究和技术而构建。可以直接运行在…

Kafka安全模式之身份认证

一、简介 Kafka作为一个分布式的发布-订阅消息系统,在日常项目中被频繁使用,通常情况下无论是生产者还是消费者只要订阅Topic后,即可进行消息的发送和接收。而kafka在0.9.0.0版本后添加了身份认证和权限控制两种安全服务,本文主要…

10 Redis之SB整合Redis

7. SB整合Redis Spring Boot 中可以直接使用 Jedis 实现对 Redis 的操作,但一般不这样用,而是使用 Redis操作模板 RedisTemplate 类的实例来操作 Redis。 RedisTemplate 类是一个对 Redis 进行操作的模板类。该模板类中具有很多方法,这些方…

stable-diffusion-webui+sadTalker开启GFPGAN as Face enhancer

接上一篇:在autodl搭建stable-diffusion-webuisadTalker-CSDN博客 要开启sadTalker gfpgan as face enhancer, 需要将 1. stable-diffusion-webui/extensions/SadTalker/gfpgan/weights 目录下的文件拷贝到 :~/autodl-tmp/models/GFPGAN/目录下 2.将G…

杰理-按键多次按下识别多击

杰理-按键多次按下识别多击 #define ALL_KEY_EVENT_CLICK_ONLY 0 //是否全部按键只响应单击事件

ansys计算结果保存

100 : 图片质量 ON:白色背景 右键设置保存图片的背景格式:

基于Python网络爬虫的IT招聘就业岗位数据分析可视化推荐系统

文章目录 基于Python网络爬虫的IT招聘就业岗位数据分析可视化推荐系统项目概述招聘岗位数据爬虫分析系统展示用户注册登录系统首页IT招聘数据开发岗-javaIT招聘数据开发岗-PythonIT招聘数据开发岗-AndroidIT招聘数据开发岗-其它招聘岗位数据分析算法方面运维方面测试方面招聘岗…

redis是单线程,为什么这么快?

redis是纯内存操作,C语言编写,执行速度非常快。 采用单线程,避免不必要的上下文切换,不用考虑线程安全问题。 采用I/O多路复用模型,非阻塞I/O。 例如:bgsave和bgrewriteaof都是在后台执行操作&#xff0…

农业四情监测设备为什么符合高标准农田建设

TH-Q3随着科技的不断进步,智慧农业正逐渐成为现代农业发展的重要方向。其中,农业四情监测系统以其独特的功能和优势,在高标准农田建设中发挥着越来越重要的作用。 一、农业四情监测系统的概念及功能 农业四情监测系统,顾名思义&am…

C++之queue和dqueue

1、queue queue(队列),一种数据结构,可以让某些数据结构的操作变得简单。队列(queue)最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后,比它后进入队列的元素才能够出…

算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)

算法沉淀——动态规划之回文串问题 01.回文子串02.最长回文子串03.分割回文串 IV04.分割回文串 II05.最长回文子序列06.让字符串成为回文串的最少插入次数 01.回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 给你一个字符串 s &#xf…

08 MyBatis之查询专题(返回对象/Map/List封装Map/Map封装Map)+列名与属性名映射的三种方法

准备: INSERT INTO t_car (id, car_num, brand, guide_price, produce_time, car_type) VALUES (165, 6666, 丰田霸道, 32.00, 2020-11-11, 燃油车); INSERT INTO t_car (id, car_num, brand, guide_price, produce_time, car_type) VALUES (166, 1202, 大众速腾, 30.00, 2020…

IntelliJ IDEA 2023:创新不止步,开发更自由 mac/win版

IntelliJ IDEA 2023激活版是一款强大而智能的集成开发环境(IDE),为开发者提供了一系列先进的功能和工具,帮助他们更高效地编写、调试和测试代码。 IntelliJ IDEA 2023 软件获取 IntelliJ IDEA 2023继承了其前代版本的优秀基因,并在此基础上进…

基于AMDGPU-ROCm的深度学习环境搭建

在风起云涌的AI江湖,NVIDIA凭借其CUDA生态和优秀的硬件大杀四方,立下赫赫战功,而另一家公司AMD也不甘示弱,带着他的生态解决方案ROCm开始了与不世出的NVIDA的正面硬钢,"ROCm is the answer to CUDA", AMD官网…

177基于matlab的基于S函数的变步长自适应滤波算法

基于matlab的基于S函数的变步长自适应滤波算法,比传统的算法收敛速度更快。传统的LMS算法中,权值向量实时地被更新。这些更新可能会由于噪声的影响而变得不稳定。SVSLMS算法是一种改进的LMS算法,它采用了矢量处理的概念,利用信号和…

分布式锁的应用与疑惑

文章目录 一、为什么需要用分布式锁二、Redis实现分布式锁三、Zookeeper实现分布式锁 一、为什么需要用分布式锁 集群下,普通的锁,无法解决问题 集群下,保证安全需要使用分布式锁 二、Redis实现分布式锁 Redisson内部封装的RedLock实现分…

yolov9,使用自定义的数据训练推理

[源码 🐋]( GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information) [论文 📘](arxiv.org/pdf/2402.13616.pdf) 论文摘要:本文介绍了一种新的目标检测…