Linux下如何使用GDB调试程序?

在Linux系统中,GDB(GNU Debugger)是功能强大的调试工具,主要用于调试C、C++、Go等语言编写的程序,通过GDB,开发者可以控制程序执行、设置断点、查看变量值、分析内存状态等,从而快速定位程序中的bug,以下将详细介绍GDB的使用方法,从安装到高级功能,帮助开发者掌握这一工具。

linux下如何使用gdb调试程序

安装GDB

在使用GDB前,需确保系统已安装,不同Linux发行版的安装命令不同:

  • Ubuntu/Debian:sudo apt update && sudo apt install gdb
  • CentOS/RHEL:sudo yum install gdb 或 sudo dnf install gdb(适用于较新版本)
    安装完成后,通过gdb --version验证是否成功,输出版本号即表示安装成功。

编译程序以支持调试

GDB调试需要程序包含调试符号(如变量名、行号信息),因此编译时需添加-g选项,使用gcc编译C程序:

gcc -g test.c -o test  # -g选项生成调试信息,-o指定输出文件

若忽略-g,GDB将无法显示源码行号和变量名,调试功能受限。

启动GDB

启动GDB的基本语法为gdb [可执行文件],

gdb ./test  # 调试当前目录下的test程序

启动后,GDB会进入交互式界面,提示符为(gdb),GDB还支持其他启动方式:

  • 调试已运行的进程:gdb -p [进程ID](需配合ps aux查找进程ID)
  • 调试core文件:gdb [可执行文件] [core文件](需先用ulimit -c unlimited开启core文件生成)

GDB核心调试命令

GDB通过命令控制程序执行,以下是常用命令及功能说明(部分命令可缩写,如break→b):

linux下如何使用gdb调试程序

命令(缩写) 功能描述 示例
run(r) 启动程序,运行至断点或结束 (gdb) r
start 启动程序,停在main函数第一行 (gdb) start
next(n) 单步执行,不进入函数 (gdb) n
step(s) 单步执行,进入函数内部 (gdb) s
continue(c) 继续运行至下一个断点或结束 (gdb) c
finish 执行至当前函数返回,显示返回值 (gdb) finish
break(b) 设置断点 (gdb) b 10(第10行)
info breakpoints(i b) 查看所有断点信息 (gdb) i b
delete(d) 删除断点 (gdb) d 1(删除断点1)
disable/enable 禁用/启用断点 (gdb) disable 1
print(p) 打印变量值 (gdb) p i(打印变量i)
ptype 打印变量类型 (gdb) ptype i
display 持续显示变量值(每次停顿时) (gdb) display i
undisplay 取消持续显示 (gdb) undisplay 1
examine(x) 查看内存内容 (gdb) x/4xw $ebp(查看4个32位字)
backtrace(bt) 查看调用堆栈 (gdb) bt
frame(f) 切换堆栈帧 (gdb) f 2(切换到第2帧)
info frame(i f) 显示当前帧信息 (gdb) i f
info locals 显示当前局部变量 (gdb) info locals
info args 显示当前函数参数 (gdb) info args

断点管理

断点是调试的核心,GDB支持多种断点类型:

  1. 行号断点:在指定源码行设置断点,如b main.c:20(main.c第20行)。
  2. 函数断点:在函数入口处设置断点,如b main或b 'void func(int)'(带函数签名)。
  3. 条件断点:仅当条件满足时触发,如b 10 if i == 5(第10行且i等于5时停)。
  4. 观察点:监控变量值变化,如watch i(i变化时停),rwatch(读变化),awatch(读/写变化)。

高级调试功能

  1. 多线程调试

    • 查看线程:info threads(显示所有线程,标记当前线程)
    • 切换线程:thread [线程ID](如thread 2)
    • 设置锁调度:set scheduler-locking on(调试时锁定线程,避免其他线程干扰)
  2. 远程调试
    通过target remote调试远程设备上的程序,如target remote 192.168.1.100:1234(连接远程GDB服务器)。

  3. 动态断点
    使用catch捕获事件,如catch throw(捕获异常)、catch fork(捕获进程创建)。

  4. 源码查看

    • list(l):显示当前行附近的源码,如l 1,20(显示1-20行)
    • set listsize 50:设置每次显示的源码行数

调试流程示例

假设有以下C程序test.c(存在数组越界bug):

linux下如何使用gdb调试程序

#include <stdio.h>
int main() {
    int arr[3] = {1, 2, 3};
    int i = 0;
    while (i < 5) {
        printf("%dn", arr[i]);  // 越界访问arr[3]、arr[4]
        i++;
    }
    return 0;
}

调试步骤:

  1. 编译:gcc -g test.c -o test
  2. 启动GDB:gdb ./test
  3. 设置断点:b main(停在main函数入口)
  4. 运行:r,执行后用n单步执行,观察i和arr[i]的变化(p i、p arr[i])
  5. 当i=3时,arr[3]越界,GDB会显示错误信息,定位到问题代码行。

相关问答FAQs

Q1: GDB调试时提示“No symbol table is loaded”,怎么办?
A: 该错误通常是因为编译时未加-g选项,导致可执行文件不含调试符号,解决方法:重新编译程序时添加-g,如gcc -g test.c -o test,然后重新启动GDB调试。

Q2: 如何调试多线程程序中的死锁问题?
A: 可通过以下步骤定位死锁:

  1. 启动GDB后,用info threads查看所有线程状态,确认线程是否卡住。
  2. 对每个线程执行bt(backtrace),查看调用堆栈,分析线程是否等待同一锁或资源。
  3. 使用set scheduler-locking on锁定当前线程,避免其他线程干扰,逐步分析线程间的资源竞争关系。
  4. 若怀疑锁未释放,可在加锁处设置观察点(如watch mutex_var),监控锁状态变化。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/25556.html

赞 (0)
酷番叔酷番叔
上一篇 2025年9月18日 18:31
下一篇 2025年9月18日 18:51

相关推荐

  • Linux系统退出GDB调试器的正确方法是什么?

    在Linux系统中,GDB(GNU Debugger)是常用的程序调试工具,掌握退出GDB的方法是高效调试的基础,退出GDB的方式多样,可根据调试场景、程序状态及需求选择合适的方法,既能正常结束调试,也能应对异常卡顿或强制终止的情况,以下从常规退出、异常处理、脚本/批量退出等场景详细说明退出GDB的操作方法,常……

    2025年9月30日
    27200
  • Linux下SSH连接服务器全攻略?

    基础连接步骤安装SSH客户端大多数Linux发行版已预装OpenSSH客户端,检查是否安装:ssh -V # 显示版本即表示已安装若未安装,执行:sudo apt install openssh-client # Debian/Ubuntusudo yum install openssh-clients # C……

    2025年8月8日
    30700
  • Linux如何打开文件夹?命令行与图形界面操作方法

    在Linux系统中,打开文件夹是日常操作的基础,根据用户习惯和场景不同,可通过图形界面(GUI)或命令行(CLI)两种方式实现,图形界面操作直观便捷,适合新手;命令行则更高效灵活,适合高级用户或自动化场景,以下将详细介绍不同方法及注意事项,图形界面(GUI)打开文件夹的方法Linux的图形界面操作依赖于桌面环境……

    2025年8月27日
    33900
  • Linux中查找进程ID的常用命令及详细步骤有哪些?

    在Linux系统中,进程ID(PID)是操作系统为每个运行中的进程分配的唯一标识符,用于进程管理、资源监控和操作控制,无论是终止异常进程、查看资源占用,还是调试程序,快速准确地查找PID都是基础操作,本文将详细介绍Linux中查找进程ID的多种方法,涵盖基础命令、进阶技巧及工具对比,帮助用户根据实际场景选择最合……

    2025年9月18日
    27900
  • 忘记Linux用户名和密码,如何删除该用户?

    在Linux系统中,用户和密码是系统安全的基础,但偶尔会遇到忘记用户名或密码需要删除用户的情况,无论是忘记普通用户的凭据,还是因管理员(root)密码丢失导致无法操作,都需要通过特定步骤安全删除用户,本文将分场景详细说明操作方法,涵盖不同Linux发行版的差异及注意事项,Linux用户存储基础与删除逻辑Linu……

    2025年9月13日
    23200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信