『Linux升级路』基础开发工具——gdb篇

简介: 『Linux升级路』基础开发工具——gdb篇



一、背景知识介绍

    在软件开发中,通常会有两种主要的构建配置:Debug(调试)和Release(发布)。这两种配置的存在是为了在不同的开发和使用阶段提供不同的优化和调试支持。以下是它们存在的主要原因:

📝调试配置:

  • 符号信息: Debug 配置通常包含完整的符号信息,这使得在调试过程中能够准确地追踪到源代码的行号和调用堆栈信息。这对于开发人员在调试应用程序时非常重要。
  • 优化程度低: Debug 配置一般不进行代码优化,以确保生成的代码更易于调试。变量和表达式的值通常保留在内存中,而不进行过多的优化操作。

📝发布配置:

  • 符号信息: Release 配置通常会剔除符号信息,减小可执行文件的大小,并防止未经授权的人员通过符号信息获取源代码的详细信息。
  • 优化成程度高: Release 配置通常会进行更多的代码优化,以提高应用程序的性能。这包括删除不必要的代码、内联函数、变量寄存器优化等。

gcc/g++编译器默认是以release的模式编译得到可执行程序,我们使用gdb是无法进行调试的。

想进行代码调试,我们就要让代码以debug的模式发布,需要加-g选项。

gcc code.c -o mycode -g

我们可以通过readelf mycode-d -S | grep debug查看mydoe-d文件中的debug信息

二、gdb指令介绍

    我会通过下面这段代码,来给大家演示gdb的使用。

#include <stdio.h>
int Add(int n)
{
    int ret=0;
    int i=0;
    for(i=0;i<n;i++)
    {
        ret+=i;
    }
    return ret;
}
int main()
{
    int num=50;
    int sum=Add(num);
    printf("%d\n",sum);
    return 0;
}

📒进入gdb环境

  • gdb binFile:进入gdb环境,binFile是一个可执行程序。

📒退出gdb环境:

  • ctrl + d quit :退出gdb环境

📒显示代码:

  • list l :显示binFile源代码,接着上次的位置往下列,每次列10行。

  • list numnum是行号,将源代码的第num行在中间位置显示。

gdb会自动记录上一次执行的指令,我们执行一次 list 后,可以直接回车,就可以看到完整的源代码。

📒查看函数:

  • list Func l FuncFunc是函数名,列出某个函数的源代码。

📒运行程序:

  • run r 运行程序,不是单步执行程序。

📒设置断点:

  • break numb num:num表示行号,在某行设置断点。

📒查看断点:

  • info break:查看断点信息。

📒删除断点:

  • d numnum表示断点的编号,删除断点。

我们在删除断点时,这里的num表示的不是行号,我们要输入要删除断点的编号。

注意:如果在调试过程中退出,那么再次进入调试环境,上一次的调试信息会丢失,即之前设置的断点都没了。

📒单步执行:

  • n next:逐过程,单条执行,当有函数调用时,不会进入函数内部。
  • s step:逐语句,进入函数调用。
  • finish:跳出当前函数,执行完当前函数返回,然后停下来等待命令。

flish指令可以快速的帮我们查看问题是不是出在当前函数中。

📒查看变量的值:

  • p 变量:打印变量的值。
  • display 变量:跟踪查看一个变量,每次停下来都显示它的值。

  • undisplay num:取消对先前设置的那些变量的追踪,其中num是先前设置的跟踪变量所对应的编号。
  • info locals:查看当前函数栈帧中所有局部变量的值。

📒其他指令:

  • until x:跳至x行,可以让我们快速的运行代码块。
  • c continue:继续执行直到下一个断点。
  • disable breakpoints:禁用断点。
  • enable breakpoints:启用断点
  • break 函数名:在函数开头设置断点。
  • backtrace:查看堆栈。
  • set var:修改变量的值。
  • break filename:line_number:在文件的特定行设置断点。示例:
b code.c:15

code.c这个源文件的第15行设置断点。


🎁结语:

    本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
30天前
|
Ubuntu 安全 Linux
|
2月前
|
安全 Linux 网络安全
Linux端的ssh如何升级?
Linux端的ssh如何升级?
287 59
|
18天前
|
人工智能 安全 Linux
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
62 10
|
3月前
|
Linux TensorFlow 算法框架/工具
在Linux上安装其他版本的cmake 或 升级cmake
在Linux上安装其他版本的cmake 或 升级cmake
95 2
|
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远程连接进行调试的详细步骤。
142 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
379 2
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
103 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
42 1