目录
00.背景
01.安装
02.生成调试信息
03.调试过程
00.背景
在软件开发中,通常会为程序构建两种不同的版本:Debug模式和Release模式。它们之间的区别主要在于优化级别、调试信息、错误检查等方面:
1.Debug 模式:
- 优化级别低:Debug 模式通常会关闭或者减少优化,这样可以使得生成的可执行文件更易于调试,因为优化通常会使得代码执行流程更难以跟踪。
- 包含调试信息:在 Debug 模式下,编译器会保留更多的调试信息,例如变量名称、源代码行号等,这些信息有助于在调试过程中定位和解决问题。
- 开启错误检查:Debug 模式通常会启用额外的错误检查和断言,这有助于在开发阶段及早发现程序中的错误。
2.Release 模式:
- 高度优化:Release 模式会应用更多的优化,以提高程序的运行性能和执行速度。这些优化可能包括代码内联、循环展开、函数内联等,使得程序更高效地运行。
- 剔除调试信息:为了减小可执行文件的大小,并提高程序运行效率,Release 模式通常会删除或者减少调试信息的存储,因此无法直接使用调试器进行源代码级别的调试。
- 关闭错误检查:为了提高性能,Release 模式通常会关闭或者减少额外的错误检查和断言。
总结
Debug模式适用于开发阶段,面向开发者,可以方便开发者进行调试和定位问题;而Release模式则适用于发布阶段,面向用户,可以获得更高的性能和更小的可执行文件大小,但同时也失去了一些调试能力。因此,在进行软件开发时,通常会现在Debug模式喜爱进行开发和调试,然后切换到Release模式进行测试和发布。
下面讲到的gdb调试器就是在Debug模式下运行的。
01.安装
GDB程序是GNU项目的一部分,全称是GNU Debugger。它是一个用于调试C、C++等编程语言的程序的强大工具。我们需要安装GDB才能在系统上使用它。
1.包管理器
在Ubuntu上可以使用以下命令安装:
sudo apt-get install gdb
在CentOS上可以使用以下命令安装:
sudo yum install gdb
2.源代码编译
想安装最新版的GDB可以从GDB官网下载源代码编译安装
https://www.gnu.org/software/gdb/
02.生成调试信息
想要使用gdb对程序进行调试,首先要生成该程序对于的调试信息,gdb在加载程序时需要找到调试符号才能进行调试。通过以下命令生成调试信息:
gcc -g source.c -o a.out
这会编译‘source.c’并生成一个包含调试信息的可执行文件‘a.out’,使得可以在gdb中进行源代码级别的调试。
使用以下指令进入调试界面:
gdb a.out
如果编译程序时没有使用选项“-g”,就不会生成调试信息,此时输入调试指令就会报错:
提示你gdb加载程序时没有找到调试符号
03.调试过程
具体调试时需要用到许多指令,这里列出来供大家参考:
list
或l
行号:显示源代码,接着上次的位置往下列,每次列10行。list
或l
函数名:列出某个函数的源代码。run
或r
:运行程序。next
或n
:单条执行。step
或s
:进入函数调用。break
(或b
)行号:在某一行设置断点。break
函数名:在某个函数开头设置断点。info breakpoints
:查看断点信息。finish
:执行到当前函数返回,然后挺下来等待命令。p
):打印表达式的值,通过表达式可以修改变量的值或者调用函数。p
) 变量:打印变量值。set var
:修改变量的值。continue
(或c
):从当前位置开始连续而非单步执行程序。delete breakpoints
:删除所有断点。delete breakpoints
n:删除序号为 n 的断点。disable breakpoints
:禁用断点。enable breakpoints
:启用断点。display
变量名:跟踪查看一个变量,每次停下来都显示它的值。undisplay
:取消对先前设置的那些变量的跟踪。until
X行号:跳至 X 行。breaktrace
(或bt
):查看各级函数调用及参数。info
(或i
)locals
:查看当前栈帧局部变量的值。quit
:退出 GDB。
显示源代码
输入“list
或 l
行号”指令,终端会以“行号”居中的布局显示源代码
通常情况下我们习惯输入“l 0”或“l”来查看全部代码,但只会显示10行代码,这该如何呢?我们只需要继续按‘回车’键,直到显示出全部代码
最后会提示总共有几行代码
断点
输入“run
或 r”指令即可运行代码,当程序报错时我们可能需要打入断点来筛查错误代码处
此时可以使用“break
(或 b
)行号”指令,在某一行设置断点,并使用“
info breakpoints(或b)”查看断点信息
(注意:这里我们设置的断点行号和实际生成的断点行号不一致是因为,在打入断点时gdb会跳过头文件、符号{}、空格、函数名等)
gdb中,断点是有序号的,从1开始排序,当我们想删除断点时,就可以使用“delete breakpoints
n”或“d n”指令,n就是断点的序号
我们输入“r”程序执行到断点处时可以使用“comtinue(或c)”命令让程序继续执行,如果后面还有断点,就会执行到下一个断点处,如果没有断点就会执行完整个程序。
跟踪变量
在 gdb 中,可以使用“print
(或 p
)变量”查看变量的值,但是面对一个实时变化的变量时,每执行一步就要输入“p”指令查看一次,显然太麻烦,可以像vs编译器那样设置一个监视窗口实时查看变量值吗?
我们可以使用 display
命令(或者disp
)来设置跟踪某个变量的值,并在每次程序执行时显示该变量的值。这样,在执行程序时,你可以同时查看变量的值,并继续执行程序。
和断点一样,也可以通过“info disp”指令来查看跟踪的变量,它们也都有从1开始的编号。
(注意:设置跟踪变量必须保证程序处于运行状态)
此时我们执行程序时就会同时显示变量
以上就是调试器gdb的基本使用说明~