行业资讯
📅 2026/7/27 7:15:39
附录G GDB命令速查表
附录G GDB命令速查表摘要GDBGNU Debugger是Linux/Unix系统下最强大的C/C调试器。本速查表整理了最常用的GDB命令帮助你快速定位和解决程序bug。使用前提# 编译时加-g选项生成调试信息gcc-g-O0-oprogram program.c1. 启动与退出命令说明示例gdb program启动GDB调试程序gdb ./myappgdb --args program arg1 arg2调试带参数的程序gdb --args ./server 8080gdb -p pid附加到运行中的进程gdb -p 12345gdb program core分析core dump文件gdb ./app core.12345quit或q退出GDB(gdb) quitrun或r开始运行程序(gdb) runrun arg1 arg2运行程序并传递参数(gdb) run input.txt2. 断点管理2.1 设置断点命令说明示例break function在函数入口设置断点(gdb) break mainbreak file:line在指定文件的行设置断点(gdb) break test.c:42break line在当前文件的行设置断点(gdb) break 100break *address在内存地址设置断点(gdb) break *0x400500break ... if condition条件断点(gdb) break main if argc 1tbreak location临时断点触发一次后删除(gdb) tbreak mainrbreak regex正则匹配函数名设置断点(gdb) rbreak ^test_.*2.2 查看和管理断点命令说明示例info breakpoints或i b列出所有断点(gdb) info breakpointsdelete n删除指定编号的断点(gdb) delete 2delete删除所有断点(gdb) deletedisable n禁用断点(gdb) disable 3enable n启用断点(gdb) enable 3clear location删除指定位置的断点(gdb) clear maincondition n expr为断点添加条件(gdb) condition 2 i100ignore n count忽略断点N次(gdb) ignore 2 102.3 观察点命令说明示例watch expr当表达式值改变时停止(gdb) watch countrwatch expr当表达式被读取时停止(gdb) rwatch *ptrawatch expr当表达式被读或写时停止(gdb) awatch buffer[0]info watchpoints列出所有观察点(gdb) info watchpoints3. 执行控制命令说明示例continue或c继续执行到下一个断点(gdb) continuenext或n单步执行不进入函数(gdb) nextstep或s单步执行进入函数(gdb) stepnexti或ni单步执行一条机器指令不进入(gdb) nextistepi或si单步执行一条机器指令进入(gdb) stepifinish或fin执行到当前函数返回(gdb) finishuntil执行到当前循环结束(gdb) untiluntil location执行到指定位置(gdb) until 100jump location跳转到指定位置执行(gdb) jump 50return [value]强制当前函数返回(gdb) return 04. 查看变量和内存4.1 打印变量命令说明示例print expr或p打印表达式的值(gdb) print iprint/format expr以指定格式打印(gdb) print/x ptrprint *ptr打印指针指向的值(gdb) print *headprint arr[0]10打印数组的10个元素(gdb) print arr[0]10print struct打印结构体(gdb) print studentdisplay expr每次停止时自动显示(gdb) display iundisplay n取消自动显示(gdb) undisplay 1info display列出所有自动显示(gdb) info display格式化输出格式说明示例/d十进制print/d var/x十六进制print/x ptr/o八进制print/o num/t二进制print/t flags/c字符print/c ch/f浮点数print/f pi/s字符串print/s str4.2 查看内存命令说明示例x/nfu addr查看内存(gdb) x/10xw 0x400000x/s str查看字符串(gdb) x/s messagex/10i $pc查看指令(gdb) x/10i $pcx命令格式说明n显示的单元数量f显示格式x十六进制, d十进制, u无符号, o八进制, t二进制, a地址, i指令, c字符, s字符串u单元大小b字节, h半字2字节, w字4字节, g巨字8字节示例(gdb) x/10xw 0x400000 # 以十六进制显示10个4字节字 (gdb) x/20xb buffer # 以十六进制显示20个字节 (gdb) x/10i main # 显示main函数开始的10条指令4.3 查看变量信息命令说明示例info locals显示当前函数的局部变量(gdb) info localsinfo args显示当前函数的参数(gdb) info argsinfo variables显示所有全局变量(gdb) info variableswhatis expr显示表达式的类型(gdb) whatis ptrptype expr显示表达式的详细类型(gdb) ptype student5. 调用栈命令说明示例backtrace或bt显示调用栈(gdb) backtracebacktrace full或bt full显示调用栈及局部变量(gdb) bt fullbacktrace 10只显示最近10帧(gdb) bt 10frame n或f n切换到指定栈帧(gdb) frame 2up切换到上一层栈帧(gdb) updown切换到下一层栈帧(gdb) downinfo frame显示当前栈帧信息(gdb) info frameinfo stack显示调用栈同backtrace(gdb) info stack调用栈示例(gdb) backtrace #0 func_c (ptr0x0) at test.c:10 #1 0x0000000000400567 in func_b (ptr0x0) at test.c:15 #2 0x0000000000400582 in func_a () at test.c:20 #3 0x000000000040059d in main () at test.c:256. 源代码查看命令说明示例list或l显示当前位置附近的代码(gdb) listlist function显示函数的代码(gdb) list mainlist file:line显示指定位置的代码(gdb) list test.c:42list start,end显示指定行范围的代码(gdb) list 10,20set listsize n设置list显示的行数(gdb) set listsize 20disassemble或disas反汇编当前函数(gdb) disassembledisassemble function反汇编指定函数(gdb) disas main7. 修改变量和内存命令说明示例set var value修改变量值(gdb) set var i 10set {type}addr value修改内存值(gdb) set {int}0x400000 100set $reg value修改寄存器值(gdb) set $rax 0call function(args)调用函数(gdb) call printf(test\n)8. 多线程调试命令说明示例info threads列出所有线程(gdb) info threadsthread n切换到指定线程(gdb) thread 2thread apply all bt显示所有线程的调用栈(gdb) thread apply all btthread apply all command对所有线程执行命令(gdb) thread apply all print iset scheduler-locking on只运行当前线程(gdb) set scheduler-locking onset scheduler-locking off运行所有线程(gdb) set scheduler-locking off9. 信号处理命令说明示例info signals列出所有信号的处理方式(gdb) info signalshandle signal action设置信号处理方式(gdb) handle SIGINT stopsignal signalnum向程序发送信号(gdb) signal SIGINT信号处理动作stop收到信号时停止nostop收到信号时不停止print收到信号时打印消息noprint收到信号时不打印消息pass将信号传递给程序nopass不将信号传递给程序10. 高级功能10.1 反向调试命令说明示例target record-full开始记录执行(gdb) target record-fullreverse-continue或rc反向继续执行(gdb) rcreverse-step或rs反向单步进入函数(gdb) rsreverse-next或rn反向单步不进入函数(gdb) rnreverse-finish反向执行到函数调用前(gdb) reverse-finish10.2 检查点命令说明示例checkpoint创建检查点(gdb) checkpointinfo checkpoints列出所有检查点(gdb) info checkpointsrestart n恢复到检查点(gdb) restart 1delete checkpoint n删除检查点(gdb) delete checkpoint 110.3 宏和脚本命令说明示例define cmdname定义GDB命令(gdb) define hellodocument cmdname为命令添加文档(gdb) document hellosource file执行GDB脚本文件(gdb) source debug.gdbmacro expand expr展开宏定义(gdb) macro expand MAX(a,b)11. 常用设置命令说明示例set print pretty on格式化打印结构体(gdb) set print pretty onset print array on格式化打印数组(gdb) set print array onset pagination off关闭分页(gdb) set pagination offset logging on开启日志记录(gdb) set logging onset logging file file设置日志文件(gdb) set logging file gdb.logshow variable显示设置的值(gdb) show print pretty12. 快捷键快捷键说明Enter重复上一条命令CtrlC中断程序执行CtrlD退出GDBTab命令自动补全CtrlL清屏CtrlP/↑上一条命令CtrlN/↓下一条命令13. 实用调试场景13.1 调试段错误# 1. 生成core dumpulimit-cunlimited ./program# Segmentation fault (core dumped)# 2. 用GDB分析gdb ./program core(gdb)backtrace# 查看崩溃时的调用栈(gdb)frame0# 切换到崩溃帧(gdb)info locals# 查看局部变量(gdb)print ptr# 检查指针值13.2 调试内存泄漏# 使用Valgrind配合GDBvalgrind--vgdbyes --vgdb-error0./program# 在另一个终端gdb ./program(gdb)target remote|vgdb13.3 调试多线程死锁(gdb) info threads # 查看所有线程 (gdb) thread apply all bt # 查看所有线程的调用栈 (gdb) thread 2 # 切换到线程2 (gdb) info frame # 查看当前帧信息 (gdb) print mutex # 检查锁的状态13.4 条件断点调试循环# 只在i1000时停止 (gdb) break loop.c:10 if i 1000 # 只在指针不为空时停止 (gdb) break process if ptr ! 0 # 只在字符串匹配时停止 (gdb) break handler if strcmp(name, test) 014. .gdbinit配置文件创建~/.gdbinit文件可以自动执行GDB命令# 美化输出 set print pretty on set print array on set print array-indexes on # 关闭分页 set pagination off # 历史记录 set history save on set history size 10000 set history filename ~/.gdb_history # 自动加载符号 set auto-load safe-path / # 定义快捷命令 define plist set $node $arg0 while $node print *$node set $node $node-next end end document plist 打印链表: plist head end15. 常见问题Q1: 为什么看不到源代码A: 编译时需要加-g选项gcc-g-O0-oprogram program.cQ2: 如何调试优化后的代码A: 使用-Og而不是-O2gcc-g-Og-oprogram program.cQ3: 如何在GDB中查看宏定义A: 编译时使用-g3gcc-g3-O0-oprogram program.c(gdb)macroexpandMAX(a, b)Q4: 程序运行太慢怎么办A: 使用条件断点或临时断点避免频繁停止。Q5: 如何保存GDB会话A: 使用日志功能(gdb) set logging on (gdb) set logging file session.log16. 快速参考卡片启动调试gdb program# 启动调试gdb-ppid# 附加到进程gdb program core# 分析core dump最常用命令必记r # 运行 b main # 在main设置断点 c # 继续执行 n # 单步执行不进入 s # 单步执行进入 p var # 打印变量 bt # 显示调用栈 l # 显示源代码 q # 退出调试流程设置断点 →break main运行程序 →run单步执行 →next/step查看变量 →print var查看调用栈 →backtrace继续执行 →continue相关章节第24章调试技术附录F常见运行时错误与调试技巧附录I指针使用速查表