Linux 中的 gdb 命令和示例
gdb是 GNU 调试器的首字母缩写词。该工具有助于调试用 C、C++、Ada、Fortran 等编写的程序。可以在终端上使用gdb命令打开控制台。
句法:
gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir] [prog[core|procID]]
例子:
要调试的程序应使用-g选项编译。下面给出的 C++ 文件保存为gfg.cpp 。我们将在本文中使用此文件。
#include
#include
#include
using namespace std;
int findSquare(int a)
{
return a * a;
}
int main(int n, char** args)
{
for (int i = 1; i < n; i++)
{
int a = atoi(args[i]);
cout << findSquare(a) << endl;
}
return 0;
}
使用以下命令编译上述 C++ 程序:
g++ -g -o gfg gfg.cpp
要启动上述gfg可执行文件的调试器,请输入命令gdb gfg 。在打印版本信息后,它会打开当前程序的 gdb 控制台。
- run [args] :此命令运行当前的可执行文件。在下图中,程序执行了两次,一次使用命令行参数 10,另一个使用命令行参数 1,并打印了它们相应的输出。
- quit 或 q :要退出 gdb 控制台,可以使用quit或q 。
- help :它启动 gdb 的手册以及单个命令的所有类列表。
- break :命令break [函数 name]有助于在程序开始执行函数时暂停程序。它有助于在那时调试程序。可以通过在必要时执行命令来插入多个断点。 b findSquare命令使 gfg 可执行文件在调试器开始执行 findSquare函数时暂停。
b break [function name] break [file name]:[line number] break [line number] break *[address] break ***any of the above arguments*** if [condition] b ***any of the above arguments***
在上面的例子中,正在执行的程序( run 10 100 )在遇到 findSquare函数调用时暂停。每当调用该函数时,程序就会暂停。一旦命令成功,它会打印断点号、程序计数器信息、文件名和行号。当它在执行过程中遇到任何断点时,它会打印断点编号、带有参数值的函数名称、文件名和行号。断点可以用指令地址(以*0x开头的十六进制形式)或行号设置,也可以与if条件组合(如果条件失败,则不会设置断点)例如, break findSquare 如果 a == 10 。
- continue :此命令有助于在被断点暂停后恢复当前的可执行文件。它执行程序,直到遇到任何断点或运行时错误或程序结束。如果参数(repeat count)中有一个整数,它会认为它是continue repeat count并执行continue命令“repeat count”的次数。
continue [repeat count] c [repeat count]
- next 或 n :此命令有助于在遇到断点后执行下一条指令。
每当遇到上述命令时,它都会通过打印执行中的行来执行可执行文件的下一条指令。
- delete :此命令有助于删除断点和检查点。如果不带任何参数执行删除命令,它将删除所有断点而不修改任何检查点。同样,如果删除了父进程的检查点,则所有子检查点都会自动删除。
d delete delete [breakpoint number 1] [breakpoint number 2] ... delete checkpoint [checkpoint number 1] [checkpoint number 2] ...
在上面的例子中,定义了两个断点,一个在 main 上,另一个在 findSquare 上。使用上面的命令 findSquare 断点被删除。如果命令后没有参数,则命令删除所有断点。
- clear :此命令删除位于名为 FUNCTION_NAME 的特定函数处的断点。如果参数是一个数字,那么它会删除位于该特定行中的断点。
clear [line number] clear [FUNCTION_NAME]
在上面的例子中,一旦执行了clear命令,打印断点号后就删除了断点。
- 禁用 [断点编号 1] [断点编号 2] .... :不是删除或清除断点,而是可以禁用它们,并且可以在需要时启用它们。
- 启用 [断点编号 1] [断点编号 2] .... :要启用禁用的断点,请使用此命令。
- info : info 断点调用时,会显示断点编号、类型、显示、状态、地址、位置。如果指定了断点编号,则只会显示有关该特定断点的信息。类似地,当调用信息检查点时,会显示检查点编号、进程 ID、程序计数器、文件名和行号。
info breakpoints [breakpoint number 1] [breakpoint number 2] ... info checkpoints [checkpoint number 1] [checkpoint number 2] ...
- checkpoint命令和重新启动命令:这些命令创建一个新进程并将该进程保持在挂起模式并打印创建的进程的进程 ID。
例如,在上面的执行中,断点保持在函数findSquare 处,并且程序使用参数“1 10 100”执行。当最初使用a = 1调用该函数,会发生断点。现在我们创建一个检查点,因此 gdb 返回一个进程 id(4272),将其保持在挂起模式并在调用 continue 命令后恢复原始线程。现在断点发生在a = 10并创建另一个检查点(pid = 4278)。从 info checkpoint 信息中,星号提到了 gdb 遇到 continue 时将运行的进程。要恢复特定进程,请使用restart命令与指定进程序列号的参数。如果所有进程都执行完毕,则info checkpoint命令不返回任何内容。
- set args [arg1] [arg2] ... :此命令创建参数列表,并在调用不带任何参数的运行命令时将指定的参数作为命令行参数传递。如果在set args之后使用参数执行run命令,则更新参数。每当run命令在没有参数的情况下运行时,默认设置参数。
- show args : show args 打印执行run命令时将传递的默认参数。如果使用参数执行set args或run命令,则默认参数将更新,并且可以使用上述show args命令查看。
- display [/format specifier] [expression] 和 undisplay [display id1] [display id2] ... :这些命令可以在每次执行遇到断点或n命令时自动显示表达式。 undisplay命令用于删除显示表达式。有效的格式说明符如下:
o - octal x - hexadecimal d - decimal u - unsigned decimal t - binary f - floating point a - address c - char s - string i - instruction
在上面的例子中,断点设置在第 12 行并使用参数 1 10 100 运行。 一旦遇到断点,将执行 display 命令以十六进制形式打印i的值和字符串中args[i] 的值形式。之后,无论何时遇到命令n或断点,值都会再次显示,直到使用undisplay命令禁用它们。
- print :此命令打印给定表达式的值。 display 命令在遇到断点或下一个命令时打印所有先前显示的值,而 print 命令保存所有先前显示的值并在调用时打印。
print [Expression] print $[Previous value number] print {[Type]}[Address] print [First element]@[Element count] print /[Format] [Expression]
- file : gdb 控制台可以使用命令gdb命令打开。要从控制台调试可执行文件,请使用file [executable filename]命令。