【Linux】开始使用gdb吧!

简介: 这篇文章我们来学习 gdb 的使用方法。我们在Windows端编写代码时有宇宙最强编译器VS2022帮助我们调试,那Linux端有没有一款强大的调试工具呢???


这篇文章我们来学习 gdb 的使用方法。我们在Windows端编写代码时有宇宙最强编译器VS2022帮助我们调试,那Linux端有没有一款强大的调试工具呢???

当然有了 它就是 gdb :

Linux下的gdb(GNU Debugger)是一款强大的调试工具,对于程序员来说,掌握gdb的使用技巧是开发过程中必不可少的技能。根据Statista的数据,截至2023,Linux在全球服务器操作系统市场占据近37%的份额,这使得gdb成为了许多专业人士必备的工具。。

本文将介绍如何使用gdb。

1 下载安装

首先我们要确保已经安装gdb,可以通过 gdb -version来进行间接查看。

未安装使用sudo yum -y install gdb 下载安装即可。

2 开始使用

首先进入gdb直接使用:gdb 文件名

接下来我直接给出 gdb 的 所有功能命令(注意简写形式,会经常使用):

  1. list /l 行号:显示指定行号附近的源代码,每次显示10行,从当前光标位置向下滚动
  2. list /l 函数名:显示指定函数的完整源代码
  3. r 或 run:开始执行程序
  4. n 或 next:执行下一条语句,不会进入函数内部相当于 F10
  5. s 或 step:执行下一条语句,如果下一条语句是函数调用,则进入该函数内部相当于 F11
  6. break(b) 行号:在指定的行号设置断点。相当于 F9
  7. break 函数名:在指定函数的开头设置断点。
  8. info break:显示所有断点的信息
  9. finish:执行当前函数的剩余部分,直到函数返回,然后暂停程序。
  10. print ( p ) 表达式:计算并打印表达式的值。
  11. p 变量:打印变量的值
  12. set var:修改变量的值
  13. continue(或c):继续执行程序,直到下一个断点或程序结束相当于 F5
  1. run(或r):从程序的开始处执行程序,直到程序结束或遇到断点。

断点相关操作

  1. delete breakpoints:删除所有断点。
  2. delete breakpoints n:删除指定编号的断点。
  3. disable breakpoints:禁用所有断点。
  4. enable breakpoints:启用所有断点。
  5. ignore:忽略特定的断点。例如,ignore 1 main 会让断点1在主函数上失效
  6. info(或i) breakpoints:显示当前设置的所有断点。
  7. 监视相关操作
  8. display 变量名:跟踪指定变量的值,并在每次程序暂停时显示它。
  9. undisplay:取消对先前设置的变量的跟踪。
  10. until X行号:继续执行程序,直到达到指定的行号。
  11. breaktrace(或bt):显示程序的调用栈,包括所有函数的调用和参数。
  12. info(i) locals:显示当前函数栈帧中局部变量的值。
  13. quit:退出GDB。

3 实践运用

接下来我们在实践中加深对gdb的熟悉:

首先我们编写一段简单程序:

 1 #include<iostream>
    2 using namespace std;
    3 
    4 int main(){
    5   int i = 0;
    6   int j = 100;
    7 
    8   while(i < 100){
    9     int sum = i + j;
   10     i++;
   11     j -= 2;
   12   }
   13                                                                                                                                                                             
   14   for(int k = 0;k<10;k++){
   15     cout<<"hello bit"<<endl;
   16   }
   17 
   18 
   19   return 0;
   20 }

然后我们直接进入gdb

出乎意料的是 再使用list出现了报错(No symbol table is loaded. Use the “file” command.)!!!

这是因为 gdb操作的应该是编译后的文件

当编译时,未加 - g 选项,则进入gdb环境中执行命令会出现No symbol table is loaded. Use the “file” command.提示;

一定要进行gcc/g++ -g test.c -o test操作哦。

这样就好了:成功显示出我们代码

接下来我们打开监视,来看看每个变量的变化。我们先打上断点来进入主函数:

然后逐个 display 展示即可:

然后调试(continue、step、next)就好,可以清楚看到每个变量的值

我们来试试断点的快速移动:

我们直接就跳出了正在进行的while循环,来到14行了。

其他指令就不进行探索了,熟悉使用就可以了。

补充一下 print 的 功能 (类似监视窗口的作用)和显示堆栈的功能

  1. print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
  2. print a:将显示整数 a 的值
  3. print ++a:将把 a 中的值加1,并显示出来
  4. print name:将显示字符串 name 的值
  5. print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
  6. print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
  7. watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
  8. whatis :查询变量或函数
  9. info function: 查询函数,扩展info locals: 显示当前堆栈页的所有变量

堆栈:

  1. where/bt :当前运行的堆栈列表;
  2. bt backtrace 显示当前调用堆栈
  3. up/down 改变堆栈显示的深度
  4. set args 参数:指定运行时的参数
  5. show args:查看设置好的参数
  6. info program: 来查看程序的是否在运行,进程号,被暂停的原因。

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
67 10
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
113 3
|
4月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
179 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
49 1
|
6月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
92 0
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
36 0
|
6月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
7月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
405 2
|
7月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
100 0
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
121 0