灌篮少年 发表于 2024-9-30 17:48:14

【Linux】开始使用gdb吧!

https://i-blog.csdnimg.cn/blog_migrate/836fa0b5df410231c07694c66b9a083f.png


这篇文章我们来学习 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 下载安装即可。
https://i-blog.csdnimg.cn/blog_migrate/aac426edf31b54e99145ff1f01bff6a9.png
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 #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
https://i-blog.csdnimg.cn/blog_migrate/c19dbd2e15c63c531a81b71abb7f0779.png
出乎意料的是 再使用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利用哦。
https://i-blog.csdnimg.cn/blog_migrate/d783aebed788d70e4b5c8a06f592cbe3.png
这样就好了:乐成显示出我们代码
https://i-blog.csdnimg.cn/blog_migrate/e29dd8ccbad7a387fcf5e1a8b37fe336.png
接下来我们打开监督,来看看每个变量的变革。我们先打上断点来进入主函数:
https://i-blog.csdnimg.cn/blog_migrate/190ffd1f942f835a6e880c2bb203f96f.pnghttps://i-blog.csdnimg.cn/blog_migrate/0ede5cd321d91f36bc782d789704dfe1.png
然后逐个 display 展示即可:
https://i-blog.csdnimg.cn/blog_migrate/1586bf5d092ed4b5bd5f55f19c1a8f7d.png
然后调试(continue、step、next)就好,可以清楚看到每个变量的值
https://i-blog.csdnimg.cn/blog_migrate/d147497e13f7635ba64effd3413840da.png
我们来试试断点的快速移动:
https://i-blog.csdnimg.cn/blog_migrate/a4f0e6aa5807adb1cca46ce7253a59a7.png
我们直接就跳出了正在举行的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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Linux】开始使用gdb吧!