【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
相关文章
|
1月前
|
监控 安全 Ubuntu
Linux下如何安装配置Fail2ban防护工具
通过以上步骤,可以在Linux系统中成功安装和配置Fail2ban,从而有效保护服务器免受暴力破解等攻击。Fail2ban通过实时监控日志文件,自动更新防火墙规则,为系统安全提供了一层重要的保护。
133 36
|
23天前
|
Linux API
Linux下载工具wget与curl
`wget` 是一个用于从网络下载文件的命令行工具,支持HTTP、HTTPS和FTP协议。它能自动处理下载中断,并支持递归下载网站内容。基本用法:`wget URL`,可指定文件名(`-O`)、保存目录(`-P`),还支持断点续传(`-c`)、限速(`--limit-rate`)和递归下载(`-r`)。相比之下,`curl` 更侧重于发送各种HTTP请求(如GET、POST),并支持文件上传、自定义请求头和cookie等功能。
57 10
|
20天前
|
存储 Ubuntu 前端开发
Linux软件包管理工具概览
在Linux系统中,dpkg、apt、rpm、yum和dnf是几种常见的包管理工具,它们分别属于不同的Linux发行版或家族,并有着各自的诞生顺序和特点。下面将按照这些工具的诞生顺序,并结合Debian、Red Hat、CentOS、Ubuntu和Kali等系统,进行详细的介绍。
24 4
|
1月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
49 17
|
1月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
60 26
|
2月前
|
Linux 网络性能优化 网络安全
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
151 28
|
2月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
56 11
|
存储 Ubuntu Linux
【Linux】Python代码模块化
在目录下创建py文件,并进行运行任务要点:python的os和sys系统接口,文件接口
122 0
【Linux】Python代码模块化
|
1月前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
77 24
Linux系统之whereis命令的基本使用
|
2天前
|
Linux
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat &gt; filename` 创建新文件,`cat &gt;&gt; filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
20 5
Linux 常用文件查看命令