【Linux】调试工具gdb(1)

简介: 【Linux】调试工具gdb(1)

👻内容专栏: Linux操作系统基础

🐨本文概括: gdb的相关背景与命令使用。

🐼本文作者: 阿四啊

🐸发布时间:2023.9.21

背景

Linux中的debug和release

1.在用vs编译器时,我们知道程序发布的方式有两种:debug模式和release模式,在debug模式下可以进行调试操作,在release模式下不可以进行调试操作。在linux当中,我们编译代码的时候默认是release模式.

如何去证明是release版本的呢?

方法一:首先,在mycode.c中写入一段简单的C语言代码,在Makefile文件中写入依赖方法与依赖关系,后面直接make命令自动编译。

[Asi@localhost day02]$ touch mycode.c
[Asi@localhost day02]$ ls >Makefile
[Asi@localhost day02]$ ll
total 4
-rw-rw-r-- 1 Asi Asi 18 Sep 21 15:09 Makefile
-rw-rw-r-- 1 Asi Asi  0 Sep 21 15:09 mycode.c
[Asi@localhost day02]$ cat mycode.c
#include<stdio.h>
int AddToTop(int n)
{
  int sum = 0;
  int i = 1;
  for(;i <= n;i++)
  {
    sum += i;
  }
  return sum;
}
int main()
{
  int top = 100;
  int result = 0;
  result = AddToTop(top);
  printf("result = %d\n",result);
  return 0;
}
[Asi@localhost day02]$ cat Makefile 
mybin: mycode.c
  gcc -o $@ $^
.PHONY:clean
clean:
  rm -f mybin
[Asi@localhost day02]$ make
gcc -o mybin mycode.c
[Asi@localhost day02]$ ./mybin
result = 5050

我们使用gdb --vesion命令,查看gdb调试工具的版本。

注:默认情况下gdb是没有安装的,我们可以执行sudoyum install gdb命令进行安装。

[Asi@localhost day02]$ gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

然后我们输入gdb + 可执行文件名称 进行调试

发现最后()中显示“no debugging symbols found”,意思是没有debug信息被发现,是调试不了的。

[Asi@localhost day02]$ gdb mybin
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/Asi/study/day02/mybin...(no debugging symbols found)...done.

说明linux当中,程序默认是release模式的。

如果想要以debug模式运行,需要在源文件当中gcc编译添加编译选项-g (表示以debug模式编译该程序),修改之后编译再运行。

最后发现,没有显示“(no debugging symbols found)”,修改为了debug模式,可以进行调试

  1. 在debug发布的时候,一定给可执行程序添加了某些debug信息,所以形成debug版本的可执行程序的大小 > 形成release版本的可执行程序的大小
    我们在Makefile中修改目标文件,分别修改两份,一份以“mybin-g”命名,编译时加上-g选项,表示debug版本的可执行程序,一份以“mybin-r”命名,不加上-g选项,表示release版本的可执行程序。

    最后ll命令查看,确实如此。
    另外,还可以只用readelf命令查看linux中形成的可执行程序格式(ELF格式)
    我们明显观察到 mybin-g 文件中与mybin-r文件相比,确实多了一些debug调试字段。这也进一步说明了我们的编译代码默认模式是release模式。

    所以,你想让自己的程序能够被调试,那么在编译时就必须添加上-g选项,以debug方式发布。

使用

进入与退出

进入gdb调试工具:gdb + binfile(可执行文件)

退出gdb:ctrl + dquit 命令

列出

list + 行号:显示binfile文件源代码,接着上次的位置往下列,每次列出10行。list也可以用l字母表示

我们可以使用 l 0或者l 1列出源代码第一行,然后按「回车」键…… 可以将所有代码显示出来。

运行程序

run:表示运行程序,相当于vs当中的「F5」键,表示开始调试,遇到断点会停下来,没有断点相当于开始执行不调试。run也可以用r字母表示


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
62 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
140 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
42 1
|
5月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
86 0
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
378 2
|
6月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
99 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序