GDB - Java 调试器

2025年3月28日 | 11 分钟阅读
GDB Tutorial

什么是 GDB?

GDB 代表 GNU 调试器。它是一个强大的工具,用于调试各种编程语言的程序,例如 C、Fortran、Go、C++ 等。它在类 Unix 操作系统上运行。这个概念由 Richard Stallman 于 1986 年编写。它实际上是一个自由软件,在 GNU GPL 下发布。这个调试器是用 C 语言编写的。

以下是 GDB 支持的各种语言:

  • Ada
  • 汇编
  • C
  • Fortran
  • Go
  • OpenCL
  • Modula-2
  • C++
  • D
  • Pascal
  • Rust

GDB 使用简单的 CLI(命令行界面),以便用户或程序员可以轻松理解它。它允许用户检查程序或代码在执行期间的特定点正在做什么。

它还使用户/程序员能够在特定点停止程序并打印该点特定变量的值。它还对编译过程产生的二进制文件进行操作。

GDB 的安装

首先,我们必须检查 GNU 调试器是否已安装在 Unix 或 Linux 操作系统上。为此,我们必须在终端中运行以下命令:

如果已经安装了 GDB,则上述命令将显示 GDB 可用的选项。如果未安装此工具,则必须在我们的系统上安装 GDB。

我们可以使用以下两种不同的方式或过程在我们的 Linux 机器上轻松安装 GDB:

1. 使用预构建的 gdb 二进制文件

在此过程中,我们必须在我们的 ubuntu 终端上运行以下两个命令。以下第一个命令用于更新依赖项:

成功执行上述命令后,运行以下命令安装 GDB:

2. 使用下载的源代码的编译过程

在此过程中,我们必须按照给定的步骤下载 GDB:

1. 在此步骤中,我们必须使用 http://ftp.gnu.org/gnu/gdb/ 站点在命令中下载源代码。

2. 现在,我们必须提取下载的源代码:

3. 提取后,我们必须通过逐个运行以下三个命令来配置和编译源代码:

4. 完成上述命令后。现在,我们必须使用下面给出的命令来安装 GDB:

默认情况下,上述命令将 GDB 的二进制文件安装在 /usr/local/bin 中,并将 GDB 的库安装在 /usr/local/lib 中。

成功执行上述命令后,我们已成功在 Linux 系统中编译并安装了 GNU 调试器。

之后,我们可以通过键入以下命令轻松查看 GDB 的版本,并验证它是否已成功安装:

GDB 命令

GDB 是一个命令行工具。因此,在学习如何使用 GDB 之前,我们必须学习 GDB 的命令。

GDB 提供了各种命令,可帮助用户调试代码或程序。下表显示了命令及其描述的列表:

序号。命令名称描述
1.Attach此命令将 GNU 调试器附加到正在运行的进程。
2.backtrace此命令显示当前所选线程的调用堆栈。
3.backtrace full此命令显示局部变量的值。
4.b fun此命令在函数开始处设置断点。
5.b N此命令在当前正在执行的文件的第 N 行号处设置断点。
6.b main此命令在程序开始处设置断点。
7.b此命令在当前正在执行的文件的当前行设置断点。
8.b +N此命令在文件当前行之后的第 N 行设置断点。
9.Bt此命令显示堆栈跟踪。
10.C此“命令”允许 GDB 运行程序,直到下一个断点或错误为止。
11.Clear此命令删除特定位置的断点。
12.checkpoint此命令有助于创建新的检查点。
13.d此命令删除或移除程序中的所有断点。此命令与 clear 命令不同。
14.d N此命令删除/移除第 N 行号的断点。
15.d 1 2此命令删除或移除程序中的断点 1 和 2。
16.delete checkpoint此命令删除或移除先前创建的检查点。
17.detach此命令将 GNU 调试器从进程中分离。
18.disable此命令禁用程序的所有断点或特定断点。
19.down此命令仅选择低一级的帧。
20.down N此命令选择低 N 级的帧。
21.enable此命令启用程序的所有断点或特定断点。
22.enable once此命令启用断点,并在第一次命中后自动禁用它。
23.enable delete此命令启用断点,并在第一次命中后自动删除它。
24.finish此命令继续执行到函数结束。
25.frame此命令选择堆栈帧。它还显示当前所选的堆栈帧。
26.gdb此命令启动 GNU 调试器。它从没有调试文件开始。
27.gdb --help此命令描述了命令行的各种选项。
28.gdb --version此命令打印 GDB 的版本和有关 GDB 的一些信息。
29.help此命令显示命令类的列表。
30.help <cmd>此命令描述了如何使用该命令。
31.i此命令提供所有 info 命令的列表。
32.info address此命令显示指定符号的地址。
33.info b此命令显示所有断点的列表。
34.info breakpoints此命令显示有关断点的信息。
35.info checkpoints此命令提供已创建的检查点列表。
36.info functions此命令显示程序的函数列表。
37.info registers此命令显示正在使用的寄存器的内容/列表。
38.info watch此命令显示定义的监视点。
39.info source此命令显示当前正在使用的文件的信息。
40.Info sources此命令提供正在使用的所有源文件的列表。
41.info symbol此命令打印位于特定地址的符号名称。
42.Info lines此命令显示代码中指定源行的开始和结束地址。
43.info args此命令显示当前使用的帧的函数的参数值。
44.info locals此命令显示有关局部变量的信息。
45.info frame此命令显示有关堆栈帧的详细信息。
46.info break <断点编号>此命令打印有关特定断点的信息。
47.info vector此命令显示向量寄存器的信息。
48.info variables此命令显示调试程序或代码中存在的静态或全局变量的列表。
49.kill此命令停止程序的执行。
50.print此命令显示指定表达式的值。
51.p var此命令打印或显示当前使用的变量“var”的值。
52.p/x variable此命令以十六进制格式打印整数变量的值。
53.p/d variable此命令将变量的值打印为带符号的整数。
54.p/o variable此命令以八进制格式打印整数变量的值。
55.p/a variable此命令将变量的值打印为十六进制地址。
56.qquit此命令退出 GNU 调试器。
57.runr此命令从头到尾或到下一个断点运行程序。
58.s此命令执行程序的下一行或语句。
59.s N此命令执行程序的下 N 行或语句。
60.select-frame此命令用于选择堆栈帧。
61.show args此命令显示参数列表。
62.set args此命令指定为空的参数列表。
63.set var = v此命令将值“v”分配给变量“var”。
64.set args arglist此命令为调试程序指定默认参数。
65.show env此命令显示所有环境变量。
66.show env 'var'此命令显示“var”的值,它是一个环境变量。
67.step此命令执行代码的下一行。
68.step N此命令执行代码的下 N 行。
69.tbreak此命令类似于 break 命令,但它是一个临时断点。断点将在一次命中后自动删除。
70.up此命令仅选择高一级的帧。
71.up N此命令选择高 N 级的帧。
72.undisplay此命令移除由 display 命令设置的自动显示的表达式。
73.unset env var此命令从环境中移除变量 'var'。
74.其中此命令显示当前行号和您所在的函数。
75.x 地址表达式此命令显示命令中给出的地址处的内存信息。

如何使用 GNU 调试器

到目前为止,我们已经学习了 GDB 是什么以及它的命令是什么,现在我们必须学习示例以及如何使用它。

在本节中,我们将学习如何使用 GNU 调试器调试程序。

现在,我们必须按照步骤来运行带有 GDB 的程序

步骤 1: 首先,我们必须在文本编辑器中创建一个 C 或 C++ 程序。因此,我们创建以下代码来查找一个数的阶乘。并且,我们将此代码保存为 .c 扩展名。

步骤 2: 现在,我们必须借助调试符号在终端中编译并构建上述 program.c

在上面的命令中,我们使用 -g 选项,该选项用于在调试模式下编译程序。

步骤 3: 现在,我们必须使用 GDB 运行程序,因此在上面的命令之后在终端中键入以下命令

上面的命令给出了当前程序的 GDB 的以下控制台。

在此控制台中,我们必须使用 GDB 命令来分析和调试程序。

步骤 4: 最后,在调试之后,通过在 GDB 提示符下键入 quitq 命令退出 GDB。

GDB 示例

在本节中,我们将学习如何通过 C 编程语言的示例使用 GDB 命令

此示例查找给定数字的阶乘。在此程序中,存在用于调试目的的错误。

现在,通过在终端中键入以下两个命令来检查程序的输出。第一个命令用于编译程序

第二个命令用于运行程序

键入以上命令后,我们将看到以下输出

Enter the number: 6
The factorial of 6 is 23592240

在此输出中,6 的阶乘是错误的,因此我们必须使用命令中的 -g 选项再次编译上述程序以进行调试

现在,启动 GDB 调试器以调试问题,方法是键入以下命令。在此命令中,a.out 是编译后生成的文件。

上面的命令给出以下控制台,该控制台允许我们运行 GDB 命令进行调试

GDB Tutorial

现在,我们使用以下步骤来调试上述程序

步骤 1: 首先,我们必须使用以下语法在此阶乘程序中设置断点

在 c 程序中放置断点后,调试器将停在该断点处,并为我们提供调试提示。因此,在从头开始执行程序之前,我们必须在程序中放置给定的断点

此命令给出以下语句

步骤 2: 现在,我们必须使用以下语法在 gdb 调试器中从头开始执行 c 程序

我们可以使用上述命令轻松地从头开始运行程序。我们还可以通过在上述命令中传递参数来为代码提供命令行参数。但是,我们的程序不需要命令行参数,因此我们仅使用 run

键入上述命令后,它会给出以下用于调试的提示,并执行程序直到第一个断点

键入 6 后,它将给出以下提示

步骤 3: 现在,我们必须使用以下语法打印此程序中使用的变量的值

键入以下命令,以在控制台上显示上述程序的变量的值

在上述值中,变量 j 的值是垃圾值,因此由于此原因,阶乘程序的输出是错误的。

因此,首先我们必须将变量 j 的值初始化为 1,然后再次执行上述程序。