介绍:
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