Linux系统编程入门3——GDB调试的使用

前言

GDB 调试工具是 Linux平台最重要的C程序调试工具,也是最好用的(违反广告法)。虽然比不得 VS 那优美的图形化界面操作,但是 GDB 调试工具也是很重要的存在,不仅仅是在面试时,在实际工作中也会用到,本文会详细介绍关于GDB的使用方法及基本知识。本文所使用的环境为虚拟机 Ubuntu系统,使用 xshell 进行远程连接调试,所有示例均经过测试无误。

GDB 的使用

GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境, GDB 是 Linux 和许多类 Unix 系统中的标准开发环境

GDB的主要功能:

  1. 启动程序,可以按照自定义的要求随心所欲的运行程序
  2. 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
  3. 当程序被停住时,可以检查此时程序中所发生的事
  4. 可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG

使用准备工作

在调试编译时,一般会选择关掉 编译器的优化编译选项 -o 而打开调试选项 -g 还可以使用 -Wall 在不影响程序行为的情况下打开所有的 warning,可以发现许多问题,避免不必要的bug

gcc -g -Wall program.c -o program

主要指令的使用

image

image

image

下面以程序为例,演示 GDB 调试的使用过程

首先看下程序代码:

    #include <stdio.h>                                                                                                                                
  2 #include <stdlib.h>
  3 
  4 int test(int a);
  5 
  6 int main(int argc, char* argv[]) {
  7     int a, b;
  8     printf("argc = %d\n", argc);
  9 
 10     if(argc < 3) {
 11         a = 10;
 12         b = 30;
 13     } else {
 14         a = atoi(argv[1]);
 15         b = atoi(argv[2]);
 16     }
 17     printf("a = %d, b = %d\n", a, b);
 18     printf("a + b = %d\n", a + b);
 19 
 20     for(int i = 0; i < a; ++i) {
 21         printf("i = %d\n", i);
 22         // 函数调用
 23         int res = test(i);
 24         printf("res value: %d\n", res);
 25     }
 26 
 27     printf("THE END !!!\n");
 28     return 0;
 29 }

        int test(int a) {
 32     int num = 0;
 33     for(int i = 0; i < a; ++i) {
 34         num += i;
 35     }
 36     return num;
 37 }          

在使用 GDB 调试是,需要加载程序调试信息,使用如下命名:-g 表明使用gdb调试

gcc test.c -o test -g

生成可调式程序:
image

然后进入 GDB 调试过程,输入:

gdb test

进入 jdb 调试程序:
image

gdb 可以对程序运行时需要输入的参数进行设置,并获取,通过以下命令

set args 10 20 
show args

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aRK1pInp-1640322690268)(C:\Users\鲸落\AppData\Roaming\Typora\typora-user-images\image-20211022101303345.png)]

help命令和好用,要学会使用

在 gdb 页面,可以使用 list 命令 查看代码,list命令默认显示10行,如果要继续显示,可以再次输入list命令,或者回车(默认执行上次命令)

使用 set list/listsize 行数,修改显示的行数

使用 list 行号,可以显示 此行号上下五行的内容,或者 list 函数名,显示指定函数内容
image

如果 多文件编译,如果需要在 gdb 调试下,查看某个文件中的内容,使用

list main.cpp:10  #查看 main.cpp 文件第十行中上下五行的内容
l select.cpp:selectSort # 查看 select.cpp 文件中 selectSort函数的内容

使用break 行号 命令打断点,
image

使用 info break (i b )命令查看 断点信息
image

在退出 gdb 之后,之前设置的断点信息就会清空,下次需要使用就需要重新设置

在有断点之后,使用start命令,可以使程序从第一行开始运行,然后遇到断点就停下来,如果是使用 run 命令,就会直接执行程序,然后在断点处停下来,期间可以通过 n/next 命令进行单行代码执行,或是 通过 c/continue 命令继续执行,直到遇到下一个断点或程序结束,或者使用finish跳出函数,防止一直在循环中执行。

使用 display 命令设置自动变量,就可以实现每次运行到相同变量时,自动打印出设置的变量的值,减少手动设置的功夫。
image

总结

一定要熟练掌握 gdb调试这项基本技能。

最后

感谢观赏,一起提高,慢慢变强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值