GDB 调试

一、基础用法

1. 启动

gdb ./app                       # 调试可执行
gdb ./app core                  # 调试 core dump
gdb --pid 1234                  # attach 到运行中进程
gdb --args ./app arg1 arg2      # 带参数启动

2. 常用命令

break main            # 断点到 main
break file.c:line     # 源文件断点
break func            # 函数入口断点
break *0x40000000     # 地址断点(汇编级)
break foo if x == 5   # 条件断点

run                   # 运行
next / step / finish  # 下一步 / 进入函数 / 执行完当前函数
continue              # 继续
until line            # 跳出循环

info registers        # 查看寄存器
info locals           # 局部变量
info args             # 函数参数
info threads          # 线程
info breakpoints      # 断点

print x               # 打印变量
print *p              # 解引用
print/x x             # 十六进制
print *(int*)p        # 强转
display x             # 每步都打印
whatis x              # 类型
ptype x               # 详细类型

backtrace / bt        # 调用栈
frame N               # 切换栈帧
up / down

list                  # 显示源码
list func
list file.c:1,20

set var x = 10        # 改值
call foo()            # 调函数
disassemble           # 反汇编当前函数
disassemble main

watch x               # 数据断点(写)
rwatch x              # 读断点

3. 初始化文件 ~/.gdbinit

set print pretty on
set pagination off
set disassembly-flavor intel
define hook-run
    set print pretty on
end

二、Core Dump 分析

1. 启用

ulimit -c unlimited          # 当前 shell
echo '/tmp/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern

2. 调试

gdb ./app /tmp/core.app.1234
(gdb) bt                     # 看崩溃栈
(gdb) frame 3
(gdb) info locals
(gdb) list

3. 内核转储(kdump)

三、远程调试

1. gdbserver(嵌入式推荐)

# 目标板
gdbserver :2345 ./app
gdbserver --attach :2345 PID

# 主机
gdb
(gdb) target remote 192.168.1.100:2345
(gdb) set sysroot /opt/sysroot-arm
(gdb) set solib-search-path /opt/sysroot-arm/usr/lib
(gdb) b main
(gdb) continue

2. kgdb(内核调试)

3. OpenOCD + JTAG

四、多线程调试

info threads                       # 列出线程
thread 3                           # 切换
thread apply all bt                # 全部线程栈
set scheduler-locking on           # 只跑当前线程
set print thread-events on         # 线程切换时打印

五、TUI 模式

gdb -tui ./app
# 进入 TUI 后:
# Ctrl+X A:源码 / 汇编切换
# Ctrl+X O:窗口切换
# Ctrl+X 2:双窗口

六、常用插件 / 增强

七、踩坑清单

问题 解决
看不到源码 编译时加 -g 且不要 strip
看不到共享库符号 set sysroot / set solib-search-path
优化后变量看不见 -O0-Og
内核调试卡死 检查 kgdb 配置、串口线