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 中调试可执行文件。我们希望您发现此页面上的信息对您有所帮助。