mcpField
G
gdb

gdb

github.com/mohitmishra786开发269956 次安装18 周前更新
代码仓库

关于 gdb

这是一份面向 Agent 的 GDB 实用指南,涵盖从基础调试到崩溃分析、反向调试、远程目标和多线程检查,并提供常见问题排查方法。

主要功能

  1. 01启动和控制 GDB 会话
  2. 02设置条件断点和观察点
  3. 03检查变量、内存和线程
  4. 04记录并回放程序执行
  5. 05通过 gdbserver 连接远程目标
  6. 06排查符号和回溯问题

适用场景

  1. 01通过核心转储或回溯分析崩溃
  2. 02在变量满足条件时暂停程序
  3. 03检查多线程程序的运行状态
  4. 04回放执行过程以定位错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill gdb

安装后在 Claude Code 中输入/gdb确认已加载。

附带文件references/cheatsheet.mdreferences/scripting.md

详细介绍

GDB

用途

引导 Agent 完成从首次启动到高级工作流的 GDB 调试:崩溃诊断、反向调试、远程调试和多线程检查。

触发场景

  • “我的程序段错误/崩溃了——该如何调试?”
  • “如何在满足条件 X 时设置断点?”
  • “如何在 GDB 中检查内存/变量?”
  • “如何调试远程嵌入式目标?”
  • “GDB 显示 ?? 栈帧/没有源代码”
  • “如何确定性地重放错误?”(record/replay)

工作流

1. 前置条件:编译时包含调试信息

始终使用 -g 编译(GCC/Clang)。对于大多数需要调试的代码,使用 -Og 或 -O0。

gcc -g -Og -o prog main.c

对于发布版本:使用 -g -O2,并保留带符号的二进制文件(使用 objcopy 单独剥离符号)。

2. 启动 GDB
gdb ./prog                          # load binary
gdb ./prog core                     # load with core dump
gdb -p 12345                        # attach to running process
gdb --args ./prog arg1 arg2         # pass arguments
gdb -batch -ex 'run' -ex 'bt' ./prog  # non-interactive (CI)
3. 基本命令
命令快捷方式效果
run [args]r启动程序
continuec从断点处继续运行
nextn单步执行,但不进入函数(源代码行)
steps单步进入函数
nextini单步执行,但不进入函数(指令)
stepisi单步进入函数(指令)
finish运行到当前函数结束
until N运行到第 N 行
return [val]强制从函数返回
quitq退出 GDB
4. 断点和观察点
break main                          # break at function
break file.c:42                     # break at line
break *0x400abc                     # break at address
break foo if x > 10                 # conditional break
tbreak foo                          # temporary breakpoint (fires once)
rbreak ^mylib_.*                    # regex breakpoint on all matching functions

watch x                             # watchpoint: break when x changes
watch *(int*)0x601060               # watch memory address
rwatch x                            # break when x is read
awatch x                            # break on read or write

info breakpoints                    # list all breakpoints
delete 3                            # delete breakpoint 3
disable 3                           # disable without deleting
enable 3
5. 检查状态
print x                             # print variable
print/x x                           # print in hex
print *ptr                          # dereference pointer
print arr[0]@10                     # print 10 elements of array
display x                           # auto-print x on every stop
undisplay 1

info locals                         # all local variables
info args                           # function arguments
info registers                      # all CPU registers
info registers rip rsp rbp          # specific registers
x/10wx 0x7fff0000                   # examine 10 words at address
x/s 0x400abc                        # examine as string
x/i $rip                            # examine current instruction

backtrace                           # call stack (bt)
bt full                             # bt + local vars
frame 2                             # switch to frame 2
up / down                           # move up/down the stack
6. 多线程调试
info threads                        # list threads
thread 3                            # switch to thread 3
thread apply all bt                 # backtrace all threads
thread apply all bt full            # full bt all threads
set scheduler-locking on            # pause other threads while stepping
7. 反向调试(record/replay)

录制需要 target record-full 或 target record-btrace(Intel PT):

# Software record (slow but universal)
record                              # start recording
run
# ... trigger the bug ...
reverse-continue                    # go back to last break
reverse-next                        # step backwards
reverse-step
reverse-finish

# Intel Processor Trace (fast, hardware)
target record-btrace pt
run
# view instruction history
record instruction-history
8. 使用 gdbserver 进行远程调试

在目标设备上:

gdbserver :1234 ./prog
# Or attach:
gdbserver :1234 --attach 5678

在主机上:

gdb ./prog
(gdb) target remote 192.168.1.10:1234
(gdb) break main
(gdb) continue

交叉编译时:在主机上使用 aarch64-linux-gnu-gdb。

9. 常见问题
症状原因解决方法
No symbol table编译二进制时未使用 -g使用 -g 重新编译
回溯中出现 ?? 栈帧缺少调试信息或栈损坏安装 debuginfo 软件包;检查是否发生栈破坏
Cannot access memory at address空指针解引用/访问已释放的内存解引用前检查指针;使用 ASan
回溯中出现 SIGABRT调用了 abort() 或断言失败向上查看栈帧,找到触发的断言
GDB 在 run 时挂起二进制正在等待输入重定向标准输入:run < /dev/null
断点位置不正确优化器移动了代码使用 -Og 编译;或使用 nexti
10. GDB 初始化文件(~/.gdbinit)
set history save on
set history size 1000
set print pretty on
set print array on
set print array-indexes on
set pagination off
set confirm off

命令速查表见 references/cheatsheet.md。 有关 pretty-printer 和 Python 脚本编写,请参阅 references/scripting.md。

相关技能

  • 加载 core 文件时使用 skills/debuggers/core-dumps
  • 使用基于 LLDB 的工作流时使用 skills/debuggers/lldb
  • 在需要调试器之前捕获错误时使用 skills/runtimes/sanitizers
  • 了解 -g 标志详情时使用 skills/compilers/gcc

评论

支持 Markdown