在 Linux 下使用 GDB 调试程序

在 Linux 下使用 GDB 调试程序

在 Linux 环境下,GDB(GNU Debugger) 是开发者最常用的调试工具之一。它可以帮助我们快速定位程序中的问题,查看变量值,跟踪程序执行流程,甚至修改程序状态。本文将详细介绍如何使用 GDB 调试程序,并通过一些实用的命令提升调试效率。


1. 准备工作

1.1 编译程序

在使用 GDB 调试之前,确保你的程序在编译时加入了 -g 选项,这样可以生成调试信息,方便 GDB 读取源代码和变量信息。例如:

gcc -g example.c -o example

1.2 启动 GDB

编译完成后,使用以下命令启动 GDB 并加载你的程序:

gdb ./example

你将看到 GDB 的交互界面,提示你输入调试命令。

ubuntu@ubuntu-virtual-machine:~/code/test$ gdb example
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from example...done.
(gdb) 

2. 设置断点

断点是调试程序时的关键功能,它可以让程序在指定位置暂停执行,方便你查看当前状态。

2.1 在函数入口设置断点

如果你想在某个函数的入口处暂停程序,可以使用以下命令:

(gdb) break <function_name>

例如,在 main 函数入口处设置断点:

(gdb) break main

2.2 在文件的指定行设置断点

你也可以在源代码的特定行设置断点:

(gdb) break <file_name>:<line_number>

例如,在 example.c 文件的第 10 行设置断点:

(gdb) break example.c:10

3. 删除断点

如果你不再需要某个断点,可以通过以下命令删除:

3.1 删除所有断点

(gdb) delete

3.2 删除指定编号的断点

通过 info breakpoints 查看所有断点及其编号,然后删除指定编号的断点:

(gdb) info breakpoints
(gdb) delete <number>

3.3 删除特定文件或行的断点

(gdb) delete breakpoints <file>:<line>

4. 查看和运行程序

4.1 查看变量值

在程序暂停时,你可以查看变量的值:

(gdb) print <variable_name>

例如,查看变量 x 的值:

(gdb) print x

4.2 全速运行

遇到断点不会停:

(gdb) run

4.3 单步执行

进入函数内部:

(gdb) step

执行当前行,但不进入函数内部:

(gdb) next

4.4 继续执行程序

遇到断点会停(执行到下一个断点):

(gdb) continue

4.5 重新开始运行程序

从程序的入口点(通常是 main 函数)开始执行:

(gdb) restart

5. 打开和关闭代码窗口

GDB 提供了一个代码窗口,可以方便地查看当前执行的代码。

5.1 打开代码窗口

(gdb) layout src

5.2 打开混合窗口(显示寄存器和源代码)

(gdb) layout reg

5.3 关闭代码窗口

使用快捷键执行ctrl+x 再执行 ctrl+a


6. 示例

假设我们有以下简单的 C 程序 example.c

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 10;
    int result = add(x, y);
    printf("The result is %d\n", result);
    return 0;
}

编译程序:

gcc -g example.c -o example

启动 GDB 并调试:

$ gdb ./example
(gdb) break main
Breakpoint 1 at 0x401136: file example.c, line 8.
(gdb) layout src
(gdb) run
Starting program: /path/to/example 

Breakpoint 1, main () at example.c:8
8           int x = 5;
(gdb) next
9           int y = 10;
(gdb) print x
$1 = 5
(gdb) next
10          int result = add(x, y);
(gdb) step
add (a=5, b=10) at example.c:4
4           return a + b;
(gdb) print a
$2 = 5
(gdb) print b
$3 = 10
(gdb) continue
Continuing.
The result is 15
[Inferior 1 (process 12345) exited normally]
(gdb) quit

7. 注意事项

确保编译时加入 -g 选项,否则调试信息会非常有限。
熟悉常用命令,如 breakrunprintstepnextcontinue
查看帮助文档:在 GDB 中输入 helphelp <command>,获取更多帮助信息。

8. 参考命令

设置断点:break <function_name>break <file_name>:<line_number>
删除断点:delete <number>delete breakpoints <file>:<line>
查看断点:info breakpoints
查看变量:print <variable_name>
单步执行:stepnext
继续执行:continue
打开代码窗口:layout src
关闭代码窗口:layout text
退出 GDBquit

结语

GDB 是一个功能强大的调试工具,掌握它的基本用法可以大大提高你的开发效率。希望本文能帮助你更好地使用 GDB 调试程序。如果你有任何问题或建议,欢迎在评论区留言,我们一起交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值