Linux下如何用gdb调试程序?

目录

一、编译带调试信息的 C 程序

二、启动 GDB 并加载程序

三、核心调试流程(以示例程序为例)

1. 设置断点

2. 运行程序

3. 查看变量与执行流程

四、常用调试命令(C 语言场景)

五、调试崩溃程序(Core Dump)

六、实用技巧


在 Linux 下使用 GDB 调试 C 语言程序的流程与调试其他编译型程序类似,但针对 C 语言有一些更具体的操作方式。以下是详细步骤和常用技巧:

一、编译带调试信息的 C 程序

调试 C 程序前,必须用 -g 选项编译,确保生成包含调试信息的可执行文件:

gcc -g -o myapp myapp.c  # 基本编译(myapp.c是源文件,myapp是输出的可执行文件)
# 若有多个源文件:
gcc -g -o myapp file1.c file2.c

-g 选项会保留变量名、行号等调试信息,否则 GDB 无法关联源代码。

二、启动 GDB 并加载程序

通过以下命令启动 GDB 并加载可执行文件:

gdb ./myapp

进入 GDB 交互界面后,提示符为 (gdb),此时可输入调试命令。

三、核心调试流程(以示例程序为例)

假设有一个简单的 C 程序 test.c

#include <stdio.h>

int add(int a, int b) {
    return a + b;  // 第4行
}

int main() {
    int x = 5, y = 3;  // 第8行
    int sum = add(x, y);  // 第9行
    printf("Sum: %d\n", sum);  // 第10行
    return 0;  // 第11行
}
1. 设置断点
  • 在指定行设置断点(如第 9 行):

    gdb

    (gdb) break 9   # 或简写 b 9
    Breakpoint 1 at 0x119d: file test.c, line 9.
    
  • 在函数入口设置断点(如 add 函数):

    gdb

    (gdb) break add  # 或 b add
    Breakpoint 2 at 0x1169: file test.c, line 4.
    
  • 查看所有断点:

    gdb

    (gdb) info breakpoints  # 或 info b
    
2. 运行程序

gdb

(gdb) run  # 或简写 r
Starting program: /path/to/myapp 

Breakpoint 1, main () at test.c:9
9           int sum = add(x, y);

程序会在第一个断点(第 9 行)处暂停。

3. 查看变量与执行流程
  • 打印变量值(如 x 和 y):

    gdb

    (gdb) print x  # 或 p x
    $1 = 5
    (gdb) p y
    $2 = 3
    
  • 单步执行(进入 add 函数内部):

    gdb

    (gdb) step  # 或 s
    add (a=5, b=3) at test.c:4
    4           return a + b;
    
  • 查看当前函数的参数(在 add 函数内):

    gdb

    (gdb) info args  # 显示函数参数
    a = 5
    b = 3
    
  • 继续执行到下一个断点或程序结束:

    gdb

    (gdb) continue  # 或 c
    Sum: 8
    [Inferior 1 (process 12345) exited normally]
    

四、常用调试命令(C 语言场景)

命令功能描述
list 行号 或 l 行号显示指定行附近的源代码(默认显示 10 行)
next 或 n逐行执行(跳过函数调用,直接执行完函数)
step 或 s逐行执行(进入函数调用内部)
print 变量 或 p 变量打印变量值(支持表达式,如 p x+1
set 变量=值临时修改变量值(如 set x=10
backtrace 或 bt显示函数调用栈(查看当前程序执行路径)
frame 编号 或 f 编号切换到栈帧编号对应的函数(查看上层调用)
delete 断点号删除指定断点(如 delete 1
watch 变量监视变量(当变量值改变时自动暂停)
quit 或 q退出 GDB

五、调试崩溃程序(Core Dump)

如果 C 程序崩溃(如段错误 Segmentation fault),可通过 core 文件定位问题:

  1. 开启 core 文件生成(默认可能关闭):
    ulimit -c unlimited  # 允许生成core文件(仅当前终端有效)
    
  2. 运行程序,崩溃后会生成 core 或 core.xxx 文件:
    ./myapp
    Segmentation fault (core dumped)  # 生成core文件
    
  3. 用 GDB 加载 core 文件分析:
    gdb ./myapp core
    (gdb) bt  # 查看崩溃时的函数调用栈,快速定位错误位置
    

六、实用技巧

  • 条件断点:仅当条件满足时触发(适合循环中调试):

    gdb

    (gdb) break 10 if x > 100  # 第10行仅在x>100时暂停
    
  • 宏定义调试:若程序使用宏,可用 info macro 宏名 查看宏定义:

    gdb

    (gdb) info macro MAX  # 查看MAX宏的定义
    
  • 保存调试会话:将常用命令写入 .gdbinit 文件(如自动设置断点),GDB 启动时会自动执行。

通过以上步骤,可高效调试 C 语言程序中的逻辑错误、崩溃问题等。如需更详细的命令说明,可在 GDB 中输入 help 命令名(如 help break)查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

start_up_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值