【Linux系统编程】代码调试工具gdb--1

简介: 【Linux系统编程】代码调试工具gdb--1


介绍:


       gdb是一个非常强大的调试工具,在gdb下,我们可对编写的代码进行各种调试,找出其中的bug,但是需注意的是,此工具调试与VS编译器的调试道理相同,只有在debug版本下才可以被调试,在release版本下不能被调试。因为debug版本是程序员专门开发时使用的版本,要包含一切与调试相关的数据,占用内存大,而release版本是最终开发后给用户使用的版本,也就是测试版本,没有与调试相关的数据,并且还将代码做了许多优化,占用内存小。


版本的调用:


       在Linux系统的CentOS 7版本下,gcc/g++编译时默认的模式是release模式,以下的所有演示都是在CentOS 7版本下进行的。其它版本下编译器的配置可能有些不同,默认的模式可能是debug。


       如果需要使用debug模式,通常需要在编译命令中添加 -g 参数,如 gcc -g 或 g++ -g等。如果想要编译为release模式,需要在编译命令中添加 -O2 或 -O3 参数。


[zhu@zhujunhao day11]$ g++ -o code-d -g code.cpp   //运用debug模式进行编译
[zhu@zhujunhao day11]$ g++ -o code-r -O2 code.cpp  //运用release模式进行编译
[zhu@zhujunhao day11]$ g++ -o code.exe code.cpp    //默认模式,使用release进行编译
[zhu@zhujunhao day11]$ ll
//下面可观察到release模式和debug模式编译形成的可执行程序占用内存大小差距很大
total 48
-rw-rw-r-- 1 zhu zhu   103 Dec 11 11:18 code.cpp
-rwxrwxr-x 1 zhu zhu 19536 Dec 11 12:29 code-d
-rwxrwxr-x 1 zhu zhu  8968 Dec 11 12:31 code.exe
-rwxrwxr-x 1 zhu zhu  8832 Dec 11 12:30 code-r

       gdb调试器只能在debug编译模式下运行,因为只有debug有与调试有关的数据。从上面可看出,debug生成的可执行程序占用的内存大,里面包含了可调试的数据。


readelf工具:


       readelf 工具用于读取可执行程序的格式问题。可执行程序所对应的格式在Linux中叫做ELF。通过使用 readelf 命令,我们可查看ELF文件的头部信息、节区信息、符号表等等。这些信息对于理解和分析程序的组成、结构和行为非常重要。后期在gdb调试工程过程中,会更加依赖使用readelf工具查看格式化问题。如使用 readelf -S [可执行文件] 只读取头部ELF信息。


[zhu@zhujunhao day11]$ readelf -S code-d   //显示节头


       这里提醒下,readelf只能用于程序的可执行文件。


gdb调试运用:


       首先,当我们生成可执行程序时,使用 gdb [可执行文件] 可进入调试阶段。当进入调试界面后,l 指令可查看源文件的内容,具体使用如下:


         1,l n(n代表行号) 从第n行开始,显示往后的10行源代码。


         2,只输入 l ,将从源代码中光标所在的位置开始显示10行内容。


         3,l [文件]:n(n代表行号)  显示指定[文件]中10行内容,其中,第 n 行内容将会在中间。


       若我们想往后面再观看源代码时,只需直接 “回车” 键即可,因为gdb会自动记录最近一次的指令。若想退出,输入quit后可退出调试界面。注意,gdb调试器调试的是生成的可执行文件,不是源文件。  


[zhu@zhujunhao day11]$ gdb code.exe    //进入code.exe的调试界面
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/zhu/day11/code.exe...done.
(gdb) l 1       //从第一行开始显示10行源代码
warning: Source file is more recent than executable.
1    #include <iostream>
2    using namespace std;
3    int main()
4    {
5        int i = 0, n = 5;  
6        while (i < n)
7        {
8            cout << "兔子" << endl;
9            i++;
10        }
(gdb)         //直接回车继续往下显示源代码,一次10行
11        cout << "Debug" << endl;
12        return 0;    
13    }
(gdb)         
Line number 14 out of range; code.cpp has 13 lines.   //表示已全部展开完毕
(gdb) quit   //退出调试界面


      当进入调试界面后,r(run的简写)指令可运行程序,即从头开始进行调试。


(gdb) r   //启动运行,这里没有设置断点,直接运行完毕
Starting program: /home/zhu/day11/code.exe 
兔子
兔子
Debug
[Inferior 1 (process 12251) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64


断点功能:


       break(简写:b)是设置断点的指令,使用方法有:


               1,b n 在第n行处设置断点。    


               2,b [函数名] 在指定的函数入口处设置断点。


               3,b [文件名]:n 在指定的文件第n行设置断点。

【Linux系统编程】代码调试工具gdb--2 https://developer.aliyun.com/article/1424718?spm=a2c6h.13148508.setting.26.214f4f0elA5UEs

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
5月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
210 16
|
4月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
204 0
|
10月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
414 13
|
11月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
157 1
|
12月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
2117 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
269 4
|
Linux Shell Python
9-7|salt代码在linux机子那个目录
9-7|salt代码在linux机子那个目录
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
152 10
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
243 1
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
989 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码