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调试这项基本技能。

最后

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

  • 0
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论
<p class="MsoNormal" style="margin: 8px 0px 0px; color: #000000; font-family: Helvetica, &#39;Hiragino Sans GB&#39;, 微软雅黑, &#39;Microsoft YaHei UI&#39;, SimSun, SimHei, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">1<span style="font-family: 宋体;">:课程特点实战性比较强。</span></p> <p class="MsoNormal" style="margin: 8px 0px 0px; color: #000000; font-family: Helvetica, &#39;Hiragino Sans GB&#39;, 微软雅黑, &#39;Microsoft YaHei UI&#39;, SimSun, SimHei, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">2<span style="font-family: 宋体;">:本课程基于</span>RK3399 Android10.0 <span style="font-family: 宋体;">为基础开发驱动课程。</span></p> <p class="MsoNormal" style="margin: 8px 0px 0px; color: #000000; font-family: Helvetica, &#39;Hiragino Sans GB&#39;, 微软雅黑, &#39;Microsoft YaHei UI&#39;, SimSun, SimHei, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">3<span style="font-family: 宋体;">:更适合立志全栈工程师全方位发展学员。毕竟大多数中小企业需要是从</span>APP<span style="font-family: 宋体;">到内核驱动全面手,大公司某方面专家型人才毕竟是少数。</span></p> <p class="MsoNormal" style="margin: 8px 0px 0px; color: #000000; font-family: Helvetica, &#39;Hiragino Sans GB&#39;, 微软雅黑, &#39;Microsoft YaHei UI&#39;, SimSun, SimHei, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">4<span style="font-family: 宋体;">:利用多块开发板,力求驱动从基础或操作到提高,使学员尽可能知其然还要知其所以然,触类旁通。</span></p> <p class="MsoNormal" style="margin: 8px 0px 0px; color: #000000; font-family: Helvetica, &#39;Hiragino Sans GB&#39;, 微软雅黑, &#39;Microsoft YaHei UI&#39;, SimSun, SimHei, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">5<span style="font-family: 宋体;">:为了更好适应越来越多公司对</span>Android <span style="font-family: 宋体;">应用在系统安全性、性能方面越来越高要求,而增设了部分</span>Android NDK<span style="font-family: 宋体;">、</span>JNI <span style="font-family: 宋体;">相关开发知识:从驱动到应用到如何编译成系统应用。</span></p> <p class="MsoNormal" style="margin: 8px 0px 0px; color: #000000; font-family: Helvetica, &#39;Hiragino Sans GB&#39;, 微软雅黑, &#39;Microsoft YaHei UI&#39;, SimSun, SimHei, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">6<span style="font-family: 宋体;">:视频中提供了一些实战经验及调试方法。</span></p> <p> </p>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

夏海藻Liam

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值