前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gdb调试功能从零到会(Linux详解)

gdb调试功能从零到会(Linux详解)

作者头像
洁洁
发布2023-10-10 13:33:16
8490
发布2023-10-10 13:33:16
举报
文章被收录于专栏:小洁叫你mysql

前言

 gdb是Linux 下功能全面的调试工具。gdb支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在Linux环境软件开发中,gdb 是主要的调试工具,用来调试 C 和 C++ 程序。

👀 1.安装gdb

直接在命令行输入:sudo yum install -y gdb

即可直接安装成功。

👀2.判断是否安装成功

安装成功后,在命令行直接输入 gdb 或者 gdb --version 进入交互模式。

如图所示:

e10c2303cd5f46db9129d29bb2fd0dd1.png
e10c2303cd5f46db9129d29bb2fd0dd1.png

 当我们进入交互模式后发现无论我们输入什么命令都没有作用(无法调试),只会出现这样的情况:

代码语言:javascript
复制
"/home/bsk/test1/one/test.c": not in executable format: File format not recognized
(gdb) l
No symbol table is loaded.  Use the "file" command.

哪为什么会这样呢?原因很简单,因为gdb在linux中默认是以release版(一般软件进行发布,用户体验模式)的方式来进行发布的,不可以被调试!所以我们要把它改成debug方式(包含调试信息)发布。

👀3.改成debug方式发布。

在命令行输入:vim Makefile(自动化构建工具(多文件操作))

进入之后写如下代码,其中的 -g选项就是把其改成debug方式。

代码语言:javascript
复制
  1 mytest:test.c
  2     gcc $^ -o $@ -g
  3 
  4 .PHONY:clean
  5 clean:
  6     rm -f mytest
  7                 

现在再make一下就会生成对应的mytest(debug版)

以上是详细内容,方便从根上理解。

而我们在日常使用时直接在 gcc命令下添加 -g 选项即可,再直接gdb就可。如下图所示:

76405e2de25f49b59f95ee48390a79a7.png
76405e2de25f49b59f95ee48390a79a7.png

👀 4.gdb功能简介

接下来就可以进行gdb使用了,简单介绍其几个功能如下:

     l:显示代码(l+数字:可以从你输入的数字开始显示,但会出现和其相关的上下文)

代码语言:javascript
复制
(gdb) l
1	#include <stdio.h>
2	int main()
3	{
4	   printf("long time no see\n");
5	   fflush(stdout);
6	   sleep(2);
7	   return 0;
8	}
(gdb) 

     b+行号:打断点

代码语言:javascript
复制
(gdb) b 5
Breakpoint 1 at 0x40060b: file test.c, line 5.
(gdb) 

      info b :查看断点编号信息(如下所示)

代码语言:javascript
复制
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040060b in main at test.c:5
	breakpoint already hit 1 time
2       breakpoint     keep y   0x0000000000400601 in main at test.c:2
(gdb) 

     d+编号:删除断点(不要输入以前打断点的行号,要输入查看断点信息里面的对应的Num号)

代码语言:javascript
复制
(gdb) d 1
(gdb) info b
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x0000000000400601 in main at test.c:2
(gdb) 

      r :运行程序(遇到断点会停下来,没有断点直接运行到最后)

代码语言:javascript
复制
(gdb) r
Starting program: /home/bsk/test1/one/a.out 
long time no see

Breakpoint 1, main () at test.c:5
5	   fflush(stdout);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-317.el7.x86_64
(gdb) 

在第5行停了下来。(最后一行提示缺少一个工具,复制安装就可以,或者不用管)

       n:单步执行语句(对应vs逐过程,不进入函数内部)

代码语言:javascript
复制
(gdb) n
6	   sleep(2);
(gdb) 

       finish :结束函数调用,然后停下来。

       s:进入函数内部(对应vs逐语句)

       until +行数:跳转到指定行

        display +名称:常显示(对应vs中的监视)

        undisplay +编号:取消常显示(监视)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档