GNU Debugger (GDB) 是 GNU 系统的开源调试器。 调试器是可移植的,可用于 C/C++ 和 Fortran 等多种语言。 它可用于通过观察特定断点上的状态甚至更改流程或值以进一步执行来调试程序。 通常,GDB 在命令行中运行,但也已经为它开发了几个 GUI。
在本文中,我们将探讨如何在 Ubuntu 20.04 LTS (Focal Fossa) 中使用 GDB 调试 C 程序。
先决条件
- Ubuntu 20.04 系统
- 用户与 sudo 重命名多个文件的权限。
笔记: 本文中讨论的命令已在 Ubuntu 20.04 LTS (焦点窝)。
安装包
安装必备的 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: %dn", 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 终端的控制台。 Enter 此控制台中的 run 命令运行作为参数提供给实用程序的可执行文件。
(gdb) run
调试断点
添加断点
可以通过多种方式添加断点。 我们将在代码中的 printf 函数上添加一个断点。 在终端中运行以下命令以添加断点:
(gdb) break printf
或者,也可以使用行号来添加断点。
(gdb) break 6
Enter 运行命令,程序将在断点处停止。
单步执行断点
使用命令 continue 继续执行程序。
(gdb) continue
还有另外两个用于不同目的的命令来继续执行程序:
- Step:逐步执行下一条机器指令。
- Next:逐步执行下一行代码。
也可以使用命令的缩写。 像 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
这个 close gdb 实用程序和默认命令行提示符将出现。
结论
在本文中,我们探讨了如何在 GDB 中运行和中断程序。 此外,它还被配置为在变量的值发生变化时自行中断。 我们希望您在阅读本文后可以轻松地在 GDB 中调试您的程序。