什么是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 提供了多种启动和加载程序的方式,根据不同的调试需求选择合适的方式:
-
直接启动并加载程序:
gdb <program>
这是最常用的方式,直接启动 GDB 并加载指定的可执行程序。
-
启动时指定参数:
gdb <program> --args <arguments>
可以在启动时直接为程序指定命令行参数。
-
先启动 GDB 再加载程序:
gdb
(gdb) file <program>
先进入 GDB 环境,然后使用 file 命令加载程序。
-
调试 core 文件:
gdb <program> core
用于分析程序崩溃时生成的 core dump 文件,这是我经常用的一个命令了。
-
attach 到正在运行的进程:
gdb attach <pid>
可以调试一个已经在运行的进程,需要知道进程的 PID,同样这也是重量级的一个命令。
2.1.2 命令行参数传递
在 GDB 中设置和查看程序参数的方法:
-
设置参数:
(gdb) set args arg1 arg2 arg3
使用 set args 命令设置程序的命令行参数。
-
查看参数:
(gdb) show args
使用 show args 命令查看当前设置的参数。
-
在启动时传递参数:
(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 的关键:
-
查看命令分类:
<


1202

被折叠的 条评论
为什么被折叠?



