Linux下调试工具gdb的基本使用

 

目录

1、前言

2、编译链接

3、调试 

4、结语


1、前言

        我们知道程序的发布方式有两种,一种是debug版本、另一种是release版本,debug版本是可以进行调试的,而release版本是经过编译器的优化的,整体的效率是要比debug版本高很多的,但是release版本下是不能够进行调试的。

2、编译链接

        在Linux下我们可以使用gcc/g++这样的编译器对程序进行编译,如如下一简单程序:

1 #include<stdio.h>
  2 
  3 int Sum(int top)
  4 {
  5     int sum = 0;
  6     int i = 0;                                                                                                                                
  7     for (i = 1; i <= top; i++)
  8     {
  9         sum += i;
 10     }
 11     return sum;
 12 }
 13 
 14 int main()
 15 {
 16     int n = 100;
 17     int ret = Sum(n);                                                            
 18     printf("%d\n", ret);                               
 19                                   
 20     printf("hello world1!\n");
 21                                                  
 22     printf("hello world2!\n");
 23                        
 24     printf("hello world3!\n");          
 25                        
 26     printf("hello world4!\n");
 27                                                                    
 28     printf("hello world5!\n");                                   
 29     return 0;                                             
 30 }  

 我们对其进行编译链接时只需要输入命令:

gcc -o mytest test.c 
//-o选项指的是程序执行到编译链接结束后生成可执行程序(Linux下是.out后缀,Windows下是.exe后缀)
//但需要注意的是Linux并不以文件后缀名来区分文件
//-o后跟的是自定义的可执行文件名称(若不指定生成名称Linux下默认生成a.out)

或者: 

gcc test.c -o mytest
//只要-o后接生成文件自定义的名称,对某个文件名的编译链接的位置可以调整

使用gdb对某个程序进行调试只需要输入命令:gdb 程序生成的可执行程序名称 

如此处mytest就是一个可执行文件,只需输入如下命令即可调试:

gdb mytest

但是gcc/g++默认编译链接出来的是release版本的,是不能够进行调试的,可能会遇到如下警告:

这时需要在进行编译链接时增加一个 -g 选项就可以生成debug版本的程序了:

 gcc -o mytest test.c -g     

这时再执行:

gdb mytest

就可以进行调试了,在命令行中输入l(list的简写)就可以查到调试的代码了,输入 l 0表示从第一行开始后的十行代码 ,继续输入l就可以继续查看下一个十行的代码,如下图所示:

3、调试 

        1. 设置断点:b 行号,b是break的简写

        2. 查看断点:info b,info是information的简写

如如下在17和25行设置了两个断点 ,其中断点信息中的Num表示断点的编号

        3. 开始调试:r 直接开始调试,如果没有设置断点就直接运行结束,如果设置了断点则会运行到第一个断点处,多次进行r操作则会重复如上操作,如下则会运行至第一个断点处,即17行

        4. 删除断点:d 断点编号,d是delete的简写,注意删除断点并不是 d 断电所在行号,而是 d 断点的编号,如删除17行的断点,17行断点的编号是1,删除该断点就是 d 1

        5. 逐过程: n 是逐过程调试程序,类似于VS2019上的F10,如果遇到函数是不会进入到函数内部调试的,n 是next的简写

可以看到26行和28行之间空行被跳过了,可以知道在调试程序时空行是会被跳过的。

        6. 逐语句:s 是逐语句调试程序,类似于VS2019上的F11,如果遇到函数是会进入到函数内部调试的,s 是step的简写

可以看到s逐语句调试已进入到函数内部调试。 

        7. 打印变量内容:p 变量名,p是print的简写,如在循环中打印sum的值以便观察

        8. 执行完当前函数:finish,如执行完finish后,当前的Sum函数就能够一下子跑完了

        9. 设置常显示:display 变量名,跟踪查看一个变量,每次停下来都显示它的值(取消常显示:undisplay 变量名)

        10.  运行至下一断点处:c,c是continue的简写

        11. 退出gdb:q 退出gdb调试,q是quit的简写 

4、结语

        谢谢阅读~ 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值