如何在linux系统下快速上手调试器gdb

news2024/12/24 3:17:53

在这里插入图片描述

1.什么是调试器?

调试器是一种帮助开发人员查看和修复程序错误的工具

2.gdb的作用和特点?

gdb的作用

帮助开发人员寻找错误,并且提供了一系列的功能和工具进行调试

gdb的特点

  1. 源代码级调试
  2. 多平台支持
  3. 强大的调试功能
  4. 拓展性强

3.gdb的基本用法

gdb的基本用法
打开一个文件

-rw-rw-r-- 1 shuaijie shuaijie   67 Sep  9 07:56 Makefile
-rwxrwxr-x 1 shuaijie shuaijie 9880 Sep  9 10:27 mycode
-rw-rw-r-- 1 shuaijie shuaijie  490 Sep  9 10:25 mycode.c
[shuaijie@hecs-20819 test_gdb]$ 

用gdb打开文件,进行调试工作

[shuaijie@hecs-20819 test_gdb]$ gdb mycode
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/shuaijie/test_gdb/test_gdb/mycode...done.

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

 (gdb) list 0
1	#include<stdio.h>
2	void Printf3()
3	{
4	    printf("hello Printf3\n");
5	}
6	void Printf2()
7	{
8	    printf("hello Printf2\n");
9	    Printf3();
10	}

list/l 函数名:列出某个函数的源代码。

(gdb) l main
23	    }
24	    Printf1();
25	    return res;
26	}
27	int main()
28	{
29	    printf("debug begin\n");
30	    int top=100;
31	    int sum=addToTop(top);
32	    printf("sum:%d\n",sum);

r或run:运行程序

(gdb) r
Starting program: /home/shuaijie/test_gdb/test_gdb/mycode 
debug begin
hello Printf1
hello Printf2
hello Printf3
sum:5050
debgin end
[Inferior 1 (process 25637) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64

break(b) 行号:在某一行设置断点

(gdb) b 30
Breakpoint 4 at 0x40060f: file mycode.c, line 30.
(gdb) b 31
Breakpoint 5 at 0x400616: file mycode.c, line 31.
(gdb) b 32
Breakpoint 6 at 0x400623: file mycode.c, line 32.

info break :查看断点信息

(gdb) info break
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x000000000040060f in main at mycode.c:30
5       breakpoint     keep y   0x0000000000400616 in main at mycode.c:31
6       breakpoint     keep y   0x0000000000400623 in main at mycode.c:32

s或step:进入函数调用
先用r运行程序,再用s进入函数调用

(gdb) r
Starting program: /home/shuaijie/test_gdb/test_gdb/mycode 
debug begin

Breakpoint 4, main () at mycode.c:30
30	    int top=100;
(gdb) s

Breakpoint 5, main () at mycode.c:31
31	    int sum=addToTop(top);
(gdb) 
addToTop (top=100) at mycode.c:18
18	    int res=0;
(gdb) 
19	    int i=1;
(gdb) 
20	    for(;i<=top;i++)
(gdb) 
22	        res+=i;

n 或 next:每次执行一条语句

(gdb) n
20	    for(;i<=top;i++)
(gdb) n
22	        res+=i;
(gdb) n
20	    for(;i<=top;i++)
(gdb) n
22	        res+=i;

finish:执行到当前函数返回,然后挺下来等待命令

(gdb) finish
Run till exit from #0  addToTop (top=100) at mycode.c:22
hello Printf1
hello Printf2
hello Printf3
0x0000000000400620 in main () at mycode.c:31
31	    int sum=addToTop(top);
Value returned is $1 = 5050

print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数

(gdb) print
$2 = 5050

p 变量:打印变量值。

(gdb) p
$3 = 5050

set var:修改变量的值

(gdb) set top =30
(gdb) p top
$6 = 30

continue(或c):从当前位置开始连续而非单步执行程序

(gdb) r
Starting program: /home/shuaijie/test_gdb/test_gdb/mycode 
debug begin

Breakpoint 4, main () at mycode.c:30
30	    int top=100;
(gdb) c
Continuing.

Breakpoint 5, main () at mycode.c:31
31	    int sum=addToTop(top);
(gdb) 
Continuing.
hello Printf1
hello Printf2
hello Printf3

Breakpoint 6, main () at mycode.c:32
32	    printf("sum:%d\n",sum);
(gdb) 
Continuing.
sum:5050
debgin end
[Inferior 1 (process 25650) exited normally]

delete breakpoints:删除所有断点
先执行info break 查看当前的断点信息,再执行delete breakpoints删除所有的断点

(gdb) info break**加粗样式**
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x000000000040060f in main at mycode.c:30
	breakpoint already hit 1 time
5       breakpoint     keep y   0x0000000000400616 in main at mycode.c:31
	breakpoint already hit 1 time
6       breakpoint     keep y   0x0000000000400623 in main at mycode.c:32
	breakpoint already hit 1 time
(gdb) delete breakpoints
Delete all breakpoints? (y or n) y
(gdb) info break
No breakpoints or watchpoints.

delete breakpoints n:删除序号为n的断点
先用b在30,31,32这三行设置三个断点;再用info break查看当前的断点信息;然后用delete breakpoints 7把序号为7的断点删除;最后只剩下了8,9断点

(gdb) b 30
Breakpoint 7 at 0x40060f: file mycode.c, line 30.
(gdb) b 31
Breakpoint 8 at 0x400616: file mycode.c, line 31.
(gdb) b 32
Breakpoint 9 at 0x400623: file mycode.c, line 32.
(gdb) info break
Num     Type           Disp Enb Address            What
7       breakpoint     keep y   0x000000000040060f in main at mycode.c:30
8       breakpoint     keep y   0x0000000000400616 in main at mycode.c:31
9       breakpoint     keep y   0x0000000000400623 in main at mycode.c:32
(gdb) delete breakpoints 7
(gdb) info break
Num     Type           Disp Enb Address            What
8       breakpoint     keep y   0x0000000000400616 in main at mycode.c:31
9       breakpoint     keep y   0x0000000000400623 in main at mycode.c:32

info(或i) breakpoints:参看当前设置了哪些断点

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
8       breakpoint     keep y   0x0000000000400616 in main at mycode.c:31
9       breakpoint     keep y   0x0000000000400623 in main at mycode.c:32

until X行号:跳至X行
先用r执行程序,然后执行unitl 4跳转到第4行

(gdb) r
Starting program: /home/shuaijie/test_gdb/test_gdb/mycode 
debug begin

Breakpoint 8, main () at mycode.c:31
31	    int sum=addToTop(top);
(gdb) until 4
hello Printf1
hello Printf2
hello Printf3

Breakpoint 9, main () at mycode.c:32
32	    printf("sum:%d\n",sum);

disable breakpoints:禁用断点
先用r执行程序,再执行disable breakpoints,用info break查看断点信息,可以看到当前状态为关闭状态

(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) dis^H^CEOF [assumed Y]
Starting program: /home/shuaijie/test_gdb/test_gdb/mycode 
Quit
(gdb) disable breakpoints
(gdb) info break
Num     Type           Disp Enb Address            What
8       breakpoint     keep n   0x0000000000400616 in main at mycode.c:31
9       breakpoint     keep n   0x0000000000400623 in main at mycode.c:32

breaktrace(或bt):查看各级函数调用及参数

(gdb) bt
#0  main () at mycode.c:32

enable breakpoints:启用断点

(gdb) info break
Num     Type           Disp Enb Address            What
8       breakpoint     keep y   0x0000000000400616 in main at mycode.c:31
9       breakpoint     keep y   0x0000000000400623 in main at mycode.c:32
10      breakpoint     keep y   0x0000000000400623 in main at mycode.c:32
	breakpoint already hit 1 time

quit或者ctrl+d:退出gdb

(gdb) quit
[shuaijie@hecs-20819 test_gdb]$ 

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

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

相关文章

项目(智慧教室)第四部分,页面交互功能,WebServer建立与使用,

一。页面构思 1.标题栏 大标题&#xff1a;智慧教室管理系统 小标题&#xff1a;灯光&#xff0c;报警&#xff0c;风扇&#xff0c;温度&#xff0c;湿度&#xff0c;光照 2.样式设计 背景设置。字体设置&#xff08;字体大小&#xff0c;格式&#xff0c;颜色&#xff09; 3.…

多线程与高并发——并发编程(6)

文章目录 六、并发集合1 ConcurrentHashMap1.1 存储结构1.2 存储操作1.2.1 put方法1.2.2 putVal方法-散列算法1.2.3 putVal方法-添加数据到数组&初始化数组1.2.4 putVal方法-添加数据到链表1.3 扩容操作1.3.1 treeifyBin方法触发扩容1.3.2 tryPresize方法-针对putAll的初始…

VMware17 下载以及 配置虚拟机 一条龙全教程

前言&#xff1a;在网络安全相关方面的学习时&#xff0c;我们难免要使用虚拟机来模拟实现网络攻击或者防御&#xff0c;在这里&#xff0c;笔者就给大家分享 VMware 17 虚拟机下载安装使用的保姆级教程 目录 虚拟性软件版本推荐 下载 VMware 下载镜像 配置虚拟机 虚拟性软…

系统软件启动过程

实验一&#xff1a;系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm&#xff08;修改了名字&#xff0c;以便于彩色显示&#xff09;a. 开启A20 16位地址线 实现 20位地址访问 芯片版本兼容通过写 键盘控制器8042 的 64h端口 与 60h端口。b.…

数学的魅力

数学的魅力 数学的历史古代数学古希腊数学中世纪数学文艺复兴数学 数学的分支1. 代数学2. 几何学3. 微积分学4. 概率论与统计学5. 数论 数学的重要性1. 科学和技术2. 经济学和金融3. 医学和生物学4. 社会科学5. 环境科学 数学的未来1. 人工智能2. 网络安全3. 空间探索 结论 数学…

Spring与Docker:如何容器化你的Spring应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

BI技巧丨Window应用之移动平均

Window函数白茶之前介绍过&#xff0c;可以用来处理同环比问题&#xff0c;因为其函数内部特性&#xff0c;我们还可以用其来处理移动平均问题。 先来看看本期的案例数据&#xff1a; 案例数据非常的简单&#xff0c;随机模拟一下销售挂蛋的情况即可。 将其导入到PowerBI中&…

YOLO目标检测——棉花病虫害数据集+已标注txt格式标签下载分享

实际项目应用&#xff1a;目标检测棉花病虫害数据集的应用场景涵盖了棉花病虫害的识别与监测、研究与防治策略制定、农业智能决策支持以及农业教育和培训等领域。这些应用场景可以帮助农业从业者更好地管理棉花病虫害&#xff0c;提高棉花产量和质量&#xff0c;推动农业的可持…

医院信息化、数字医学影像、DICOM、PACS源码

PACS系统适合卫生院、民营医院、二甲或以下公立医院的放射科、超声科使用。功能强大且简洁&#xff0c;性能优异&#xff0c;具备MPR&#xff08;三维重建&#xff09;、VR&#xff08;容积重建&#xff09;、胶片打印功能&#xff0c;能够快速部署。 PACS系统支持DR、CT、磁共…

SpringCloud-Config配置中心

接上文 SpringCloud-GetWay 路由网关 针对每个模块都要配置一个配置文件&#xff0c;例如当进行数据库修改时候&#xff0c;又有很多服务&#xff0c;则需要一个一个去修改。因此需要一种集中化的配置文件管理工具&#xff0c;集中得对配置文件进行配置。 1.部署配置中心服务…

PS基础-新建窗口工作区(保存合适自己的窗口布局)

保存自己的工作区 一&#xff0c;打开自己需要的窗口 2,打开的窗口拖拽到边&#xff0c;就可放置 3&#xff0c;保存自己习惯的工作区分布 下次打开时&#xff0c;点击保存时的图标就会看到自己命名的工作区

Shape Completion Enabled Robotic Grasping

摘要-这项工作提供了一个架构&#xff0c;使机器人能够通过形状完成抓取规划。形状完成是通过使用3D卷积神经网络(CNN)来完成的。该网络是在我们自己的新的开源数据集上训练的&#xff0c;该数据集包含了从不同视角捕获的超过44万个3D样本。运行时&#xff0c;从单个视角捕获的…

8.Xaml Border控件

1.运行图片 2.运行源码 <Grid Name="Grid1"><!--Border 里面只能有一个子元素--><!--BorderBrush="Red" 边框颜色-->

Nginx配置踩坑:一定注意location和proxy_pass的是否以“/”结尾

Nginx是开源、高性能、高可靠的Web和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性能是Nginx最重要的考量&#xff0c;其…

数据库的内连接和外连接的区别

内连接&#xff1a; 指连接结果仅包含符合连接条件的行&#xff0c;参与连接的两个表都应该符合连接条件。 1.等值连接 依据两个表中相同内容的字段进行连接 表TESTA,TESTB,TESTC&#xff0c;各有A, B两列。 内连接 内连接&#xff0c;即最常见的等值连接&#xff0c;例&…

机器学习实战-系列教程4:手撕线性回归3之多特征线性回归(项目实战、原理解读、源码解读)

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 手撕线性回归1之线性回归类的实现 手撕线性回归2之单特征线性回归 手撕线性回归3之多特征线性回归 手撕线性回归4之非线性回归 8…

Vue中数据可视化关系图展示与关系图分析

Vue中数据可视化关系图展示与关系图分析 数据可视化是现代Web应用程序的重要组成部分之一&#xff0c;它可以帮助我们以图形的方式呈现和分析复杂的数据关系。Vue.js是一个流行的JavaScript框架&#xff0c;它提供了强大的工具来构建数据可视化应用。本文将介绍如何使用Vue.js…

基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题(附完整源码下载)

背包问题算法设计 问题要求在一个物品集合中选择合适的物品放入背包&#xff0c;在放入背包中的物品总重量不超过背包容量的前提下&#xff0c;希望放入背包的物品总价值最大。根据是否允许部分物品放入背包的要求&#xff0c;背包问题可以分为【分数背包问题】和【0-1背包问题…

Spring Web Flow远程代码执行漏洞复现(CVE-2017-4971)

一、搭建环境 cd vulhub/spring/CVE-2017-4971 docker-compose up -d 影响版本:Spring Web Flow 2.4.0 ~ 2.4.4 触发条件: 1.MvcViewFactoryCreator对象的useSpringBeanBinding参数需要设置为false&#xff08;默认值&#xff09; 2. flow view对象中设置BinderConfiguration…