如何在 Linux 中使用 GNU 调试器

GNU Debugger 用于调试程序、分析崩溃或查看程序在特定点上的行为。它由 GNU 项目在 1980 年代开发,一直是使用最广泛的命令行调试器之一,也是最受欢迎的 GNU 软件之一。

让我们首先编写一个小 C 程序,然后我们将对其进行调试。首先,创建一个新的 。C 文件使用 vim 或您选择的任何编辑器:

vim测试.c

创建以下 C 程序:

#include int main() { int i = 5;浮动 f = 5.5 i = i + 3; f = f + 2.2; printf("i 和 f 的值分别为:%d 和 %f\n", i, f);返回0; }

逃脱 进入 vim 命令模式。然后输入 :wq 保存程序并退出。

编译并查看程序是否运行:

gcc test.c -o test ./test i 和 f 的值为:8 和 7.700000

要在程序中启用调试支持, 我们编译它 -G 旗帜。如果不使用该标志,用户仍然可以调试程序,尽管选项有限。

gcc test.c -g -o 测试

开始调试 我们的可执行文件 测试数据库, 我们跑:

数据库测试

它会打开 数据库 控制台,您可以在其中键入 数据库 命令。要查看命令列表,请使用 帮助 命令。

$(gdb) help 命令类别列表: aliases -- 其他命令的别名断点 -- 使程序在某些点停止 data -- 检查数据文件 -- 指定和检查文件内部 -- 维护命令模糊 -- 模糊功能运行-- 运行程序堆栈 -- 检查堆栈状态 -- 状态查询支持 -- 支持设施跟踪点 -- 在不停止程序的情况下跟踪程序执行 用户定义 -- 用户定义命令 键入“help”,后跟类名获取该类中的命令列表。为所有命令的列表键入“help all”。键入“help”后跟命令名称以获取完整文档。输入“apropos word”以搜索与“word”相关的命令。如果没有歧义,则允许使用命令名称缩写。

然后你可以输入 帮助类名 查看属于该类的命令。要使用子字符串搜索命令,请使用 适当的子串.

要在程序进入函数时设置断点, 跑:

$(gdb) 中断主要

在这里,我们在代码中唯一的函数处设置了一个断点,即 主要的.使用命令 执行程序直到下一个断点,或直到退出。

$(gdb) 运行

要在函数的特定位置设置断点, 利用:

中断 *主要 + 4

这将在函数 main 的第 4 行设置一个断点。

现在, 跳过程序流到下一个代码行, 只需运行 命令。

$(gdb) 第 5 步:浮动 f = 5.5;

要显示变量的内容,展示 .

$(gdb) 显示 i 6: i = 5

要修改变量的内容, 这可能需要在变量的特定值下分析程序的运行,运行 设置变量=表达式.

$(gdb) 设置变量 i=10 $(gdb) 显示 i 7: i = 10

在这里,“表达式”可以是任何有效的(算术/逻辑)表达式。为简单起见,我们只是将另一个值 (10) 分配给变量 一世.

要打印程序的汇编代码, 使用命令 反汇编函数名:

只用 拆卸 打印整个程序的汇编代码。请注意汇编代码中特定行处的箭头。它表示调试会话当前在该特定内存位置(即该代码行)暂停。

要在特定代码行跳转调试器, 跑:

$(gdb) jump *main + 2 在 0x400528 处继续。断点 2, 0x000000000040052a in main () at test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i = 

这将使调试器跳转到函数中第二行代码的内存位置 主要的.请注意,这里我从 main 的开始直接跳到第二个位置。因此,变量 一世 从未设置,这导致调试器抛出错误,无法访问变量地址处的内存内容 一世.

这些是一些基本命令,可以帮助您开始在 Linux 中调试可执行文件。我们希望您发现此页面上的信息对您有所帮助。