【Linux】开始使用gdb吧!

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922



  
这篇文章我们来学习 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 的 全部功能命令(注意简写形式,会常常使用):

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

  • delete breakpoints:删除全部断点。
  • delete breakpoints n:删除指定编号的断点。
  • disable breakpoints:禁用全部断点。
  • enable breakpoints:启用全部断点。
  • ignore:忽略特定的断点。比方,ignore 1 main 会让断点1在主函数上失效
  • info(或i) breakpoints:显示当前设置的全部断点。
监督相干利用

  • display 变量名:跟踪指定变量的值,并在每次程序停息时显示它。
  • undisplay:取消对先前设置的变量的跟踪。
  • until X行号:继续执行程序,直到达到指定的行号。
  • breaktrace(或bt):显示程序的调用栈,包括全部函数的调用和参数。
  • info(i) locals:显示当前函数栈帧中局部变量的值。
  • quit:退出GDB。
3 实践运用

接下来我们在实践中加深对gdb的认识:
首先我们编写一段简朴程序:
  1. 1 #include<iostream>
  2.     2 using namespace std;
  3.     3
  4.     4 int main(){
  5.     5   int i = 0;
  6.     6   int j = 100;
  7.     7
  8.     8   while(i < 100){
  9.     9     int sum = i + j;
  10.    10     i++;
  11.    11     j -= 2;
  12.    12   }
  13.    13                                                                                                                                                                             
  14.    14   for(int k = 0;k<10;k++){
  15.    15     cout<<"hello bit"<<endl;
  16.    16   }
  17.    17
  18.    18
  19.    19   return 0;
  20.    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 的 功能 (类似监督窗口的作用)和显示堆栈的功能


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

  • where/bt :当前运行的堆栈列表;
  • bt backtrace 显示当前调用堆栈
  • up/down 改变堆栈显示的深度
  • set args 参数:指定运行时的参数
  • show args:检察设置好的参数
  • info program: 来检察程序的是否在运行,进程号,被停息的原因。
Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表