如何在Ubuntu 20.04中使用GDB调试程序
GNU 调试器 (GDB) 是 GNU 系统的开源调试器。该调试器是可移植的,可用于 C/C++ 和 Fortran 等多种语言。它可用于通过观察特定断点上的状态来调试程序,甚至更改流程或值以进一步执行。通常,GDB 在命令行中运行,但也为其开发了几个 GUI。
在本文中,我们将探讨如何在 Ubuntu 20.04 LTS (Focal Fossa) 中使用 GDB 调试 C 程序。
先决条件
- Ubuntu 20.04系统
- 具有重命名多个文件的 sudo 权限的用户。
注意:本文中讨论的命令已在 Ubuntu 20.04 LTS(Focal Fossa) 上进行了测试。
安装软件包
安装编译和调试所需的 GN 包。在终端中运行以下命令:
sudo apt install gcc gdb -y
用于调试的 C 程序示例
代码
在运行之前,需要编译程序。我们将在文件 main.c 中编译以下 C 代码。
#include <stdio.h>
int main() {
for (int i=0; i<5; ++i) {
printf("Iterator: %d\n", i);
}
return 0;
}
使用GCC编译C程序
通常,使用以下命令在 GCC 中编译 C 代码:
gcc main.c -o bin
需要提供另一个参数以在二进制文件中包含符号。 GDB 使用这些符号来跟踪和调试程序。在终端中运行以下命令来编译 C 代码:
gcc -g main.c -o bin
将出现一个名为 bin 的可执行文件。
执行测试程序
名为 bin 的二进制文件可以像命令行界面上的任何其他可执行文件一样执行。使用以下命令在终端中运行它:
./bin
将出现代码的输出。
在 Linux 上调试应用程序
启动调试器
在终端中使用以下命令运行 GDB 实用程序:
gdb bin
按回车键。将会出现 GDB 终端的控制台。在此控制台中输入run命令以运行作为参数提供给实用程序的可执行文件。
(gdb) run
调试断点
添加断点
可以通过多种方式添加断点。我们将在代码中的 printf 函数上添加一个断点。在终端中运行以下命令添加断点:
(gdb) break printf
或者,也可以使用行号来添加断点。
(gdb) break 6
输入run命令,程序将在断点处停止。
单步执行断点
使用命令继续继续执行程序。
(gdb) continue
还有另外两个命令用于继续执行程序的不同目的:
- 步骤:逐步执行下一条机器指令。
- 下一步:执行下一行代码。
也可以使用命令的缩写。 继续命令的缩写是c。
(gdb) c
有关断点的信息
可以使用gdb的info命令观察断点信息。在终端运行以下命令:
(gdb) info breakpoints
将出现有关断点的信息。
注意:断点左边的数字用于其他命令引用它。
删除断点
可以使用delete命令并参考info实用程序的输出中观察到的断点编号来删除断点。
(gdb) delete 1
现在断点已经被删除,如果运行的话,程序会直接执行到最后。
观察变量
可以使用 watch 实用程序来监视变量。首先,我们需要输入变量存在的范围。为此,首先使用以下命令添加断点:
(gdb) break 6
然后运行遇到该断点的代码。
(gdb) r
现在我们处于变量i存在的循环中。
watch 命令将用于观察循环中变量i 的先前值和新值。
(gdb) watch i
现在由 watch 命令生成的断点也将出现在断点列表中。可以使用以下命令显示断点列表:
(gdb) info breakpoints
而且,我们不需要之前插入的断点。可以使用以下命令轻松删除它:
(gdb) delete 1
现在,如果继续,只要变量更改了值,代码就会查看值并显示旧值和新值。
(gdb) c
使用相同的命令也可以观察程序的进一步迭代。
退出调试器
在终端中运行以下命令退出调试器。
(gdb) quit
将出现此关闭gdb实用程序和默认命令行提示符。
结论
在本文中,我们探讨了如何在 GDB 中运行和中断程序。此外,它还被配置为在变量值发生更改时自行中断。我们希望您看完本文后能够轻松地在 GDB 中调试您的程序。