Linux使用GDB 调试

什么是GDB ?

GDB(GNU Debugger)是由Richard Stallman在 1986 年编写的开源调试器,作为 GNU 系统的一部分,最初是模仿 Berkeley Unix 的 dbx 调试器开发的。它是一款功能强大的便携式调试工具,可以在许多类 UNIX 系统上运行,并支持多种编程语言,包括 、C、C++ 等。

GDB 的核心工作原理基于 Linux 内核提供的ptrace 系统调用。当启动 GDB 调试程序时,会创建一个父子进程关系:GDB 作为父进程,被调试程序作为子进程。子进程通过调用 ptrace (PTRACE_TRACEME) 将自己设置为被跟踪模式,而父进程(GDB)可以通过 ptrace 系统调用来监控和控制子进程的执行流程,包括检查和修改其内存映像及寄存器。

GDB 调试的实现完全建立在信号机制的基础上。当使用 ptrace 系统调用建立调试关系后,交付给目标程序的任何信号都会首先被 GDB 截获。例如,当设置断点时,GDB 会在断点位置写入断点指令 INT3(0xCC),当目标程序执行到该指令时会触发 SIGTRAP 信号,GDB 捕获该信号并暂停程序执行。

所以这样看起来GDB也没那么神秘~ 

一、GDB调试配置 

在开始调试前,必须确保程序编译时包含调试信息。这是 GDB 调试的前提条件,没有调试信息的程序无法进行有效的调试,很多初学者一次容易配置错误。

1. 编译选项设置

使用 GCC/G++ 编译时,必须添加 -g 选项  来生成调试信息:

//C语言程序

gcc -g -o program program.c

-g 选项会告诉编译器生成调试符号信息,包括:

  • 变量的名字和类型

  • 源代码中对应的行号

  • 函数调用栈的信息

  • 调试信息存储在符号表中,不会影响程序的实际执行逻辑

调试信息通常嵌入到 ELF 可执行文件的特殊节区中,如.debug_info、.debug_line 等。GCC 默认生成 DWARF 格式的调试信息,具体版本由 GCC 版本决定。

2. 优化选项与调试

在调试时,建议使用 -O0 选项 (无优化)来确保调试体验最佳,当然其他优化等级也可以用,只是可能会存在一些认为的乱跳:

gcc -O0 -g -o program program.c

优化选项会影响调试体验,因为优化可能会改变程序的执行流程,导致变量值无法正确显示或断点位置偏移。如果需要保留部分优化但仍能调试,可以使用较低的优化级别如 - O1 或 - O2。

3. Makefile 配置

在大一点的项目中,通常使用 Makefile 进行构建。要在 Makefile 中启用调试支持,需要在编译选项中添加 - g:

# 基本Makefile配置
CFLAGS = -Wall -O0 -g  # C语言编译选项
CXXFLAGS = -Wall -O0 -g  # C++编译选项
LDFLAGS = -g  # 链接选项

TARGET = my_program
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) $(LDFLAGS) -o $@ $^

clean:
    rm -f $(OBJECTS) $(TARGET)

二、GDB 操作使用

2.1 启动 GDB 与加载程序

2.1.1 启动 GDB 的多种方式

GDB 提供了多种启动和加载程序的方式,根据不同的调试需求选择合适的方式:

  1. 直接启动并加载程序

gdb <program>

这是最常用的方式,直接启动 GDB 并加载指定的可执行程序。

  1. 启动时指定参数

gdb <program> --args <arguments>

可以在启动时直接为程序指定命令行参数。

  1. 先启动 GDB 再加载程序

gdb

(gdb) file <program>

先进入 GDB 环境,然后使用 file 命令加载程序。

  1. 调试 core 文件

gdb <program> core

用于分析程序崩溃时生成的 core dump 文件,这是我经常用的一个命令了。

  1. attach 到正在运行的进程

gdb attach <pid>

可以调试一个已经在运行的进程,需要知道进程的 PID,同样这也是重量级的一个命令。

2.1.2 命令行参数传递

在 GDB 中设置和查看程序参数的方法:

  1. 设置参数

(gdb) set args arg1 arg2 arg3

使用 set args 命令设置程序的命令行参数。

  1. 查看参数

(gdb) show args

使用 show args 命令查看当前设置的参数。

  1. 在启动时传递参数

(gdb) run arg1 arg2 arg3

使用 run 命令启动程序时直接传递参数。

2.2 GDB 命令基础与帮助系统

2.2.1 命令格式与语法

GDB 命令具有统一的格式,基本语法为:

command [arguments] [options]

GDB 支持以下特性:

  • 命令缩写:如果命令缩写唯一,可以使用缩写形式,如break可缩写为b

  • Tab 补全:按 Tab 键可以自动补全命令和文件名

  • 历史记录:使用上下箭头键可以查看和重复使用历史命令

  • 快捷键:一些常用命令有快捷键,如continue可以用c表示

2.2.2 帮助系统使用

GDB 提供了完善的帮助系统,学会使用帮助系统是掌握 GDB 的关键:

  1. 查看命令分类

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值