目 录CONTENT

文章目录

调试工具 gdb

TalentQ
2025-09-04 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

引言

在软件开发过程中,调试是不可避免的重要环节。虽然现代IDE提供了强大的图形化调试工具,但掌握命令行调试器GDB(GNU Debugger)仍然是每位C/C++开发者必备的核心技能。GDB不仅能在缺乏图形界面的环境中发挥作用,还能提供更底层、更灵活的控制能力。

1. GDB 概述

GDB是GNU项目中的标准调试工具,支持多种编程语言(主要是C和C++),能够在多种操作系统和硬件平台上运行。它允许开发者在程序运行时检查内部状态、跟踪执行流程和分析程序崩溃原因。

2. 基础调试技巧

2.1 编译用于调试的程序

要使用GDB调试程序,需要在编译时添加-g选项,这会保留调试信息:

gcc -g -o example example.c

2.2 启动GDB

gdb ./example

2.3 基本调试命令

在GDB中,可以使用以下基本命令:

命令

缩写

描述

run

r

运行程序

break

b

设置断点

continue

c

继续执行

next

n

执行下一行(不进入函数)

step

s

执行下一行(进入函数)

print

p

打印变量值

backtrace

bt

显示调用栈

quit

q

退出GDB

示例调试会话:

(gdb) break main         # 在main函数设置断点
(gdb) run                # 运行程序
(gdb) next               # 执行下一行
(gdb) print n            # 打印变量n的值
(gdb) break fibonacci    # 在fibonacci函数设置断点
(gdb) continue           # 继续执行
(gdb) backtrace          # 显示调用栈
(gdb) quit               # 退出

断点设置

按函数名设置断点:break main

按行号设置断点:break 42

条件断点:break 42 if x > 10

删除断点:delete <断点号>

单步调试

next:执行下一行,不进入函数

step:执行下一行,进入函数

finish:运行到当前函数返回

continue:继续执行到下一个断点

查看和修改变量

查看变量:print x

修改变量: set x=42

调用栈分析

backtrace或bt:显示函数调用栈

frame <编号>:切换到指定栈帧

多线程调试

info threads:查看所有线程

thread <编号>:切换到指定线程

3. 高级调试功能

3.1 条件断点

条件断点只在满足特定条件时触发,这对于调试循环或特定数据状态非常有用:

# 当i等于5时触发断点
(gdb) break example.c:20 if i == 5

# 当函数参数满足条件时触发
(gdb) break fibonacci if n == 7

3.2 观察点(Watchpoints)

观察点用于监控变量的变化,当变量被读写时暂停程序:

# 监控变量sum的写操作
(gdb) watch sum

# 监控变量n的读操作
(gdb) rwatch n

# 监控变量的读写操作
(gdb) awatch total

3.3 检查内存内容

GDB提供了检查内存的强大功能:

# 检查变量地址
(gdb) print &n

# 以十六进制格式检查内存
(gdb) x/8xw &numbers  # 检查8个字(4字节),十六进制格式

# 以十进制格式检查内存
(gdb) x/5dw &numbers  # 检查5个字,十进制格式

# 以字符格式检查内存
(gdb) x/10cb buffer   # 检查10个字节,字符格式

3.4 修改变量和内存

在调试过程中可以修改变量和内存值:

# 修改变量值
(gdb) set variable n = 20

# 修改内存内容
(gdb) set {int}0x7fffffffdca4 = 100

3.5 调用函数

可以直接在GDB中调用函数:

# 调用函数并打印结果
(gdb) print fibonacci(10)

# 调用函数并忽略返回值
(gdb) call printf("Debug message\n")

4. 多进程与多线程调试

4.1 多进程调试

GDB默认会跟踪父进程,要调试子进程需要使用以下命令:

# 在fork后同时调试父进程和子进程
(gdb) set follow-fork-mode child  # 跟踪子进程
(gdb) set follow-fork-mode parent # 跟踪父进程

# 同时调试多个进程
(gdb) set detach-on-fork off      # 不分离其他进程
(gdb) info inferiors             # 显示所有进程
(gdb) inferior 2                 # 切换到进程2

4.2 多线程调试

对于多线程程序,GDB提供了专门的线程调试命令:

# 显示所有线程
(gdb) info threads

# 切换到指定线程
(gdb) thread 2

# 为所有线程设置断点
(gdb) break main thread all

# 只对特定线程设置断点
(gdb) break main thread 2

# 应用命令到所有线程
(gdb) thread apply all backtrace

5. 核心转储分析

核心转储(core dump)是程序崩溃时的内存快照,可以用于事后分析:

5.1 启用核心转储

# 设置核心转储文件大小限制
ulimit -c unlimited

# 设置核心转储文件模式
echo "core.%p" | sudo tee /proc/sys/kernel/core_pattern

5.2 分析核心转储文件

gdb ./program core

在GDB中分析崩溃:

(gdb) backtrace        # 查看调用栈
(gdb) info registers   # 查看寄存器状态
(gdb) info frame       # 查看当前栈帧信息
(gdb) list             # 查看当前位置的代码

0

评论区