GDB调试工具

张开发
2026/4/8 3:36:45 15 分钟阅读

分享文章

GDB调试工具
GDB调试工具GDBGNU Debugger是Linux平台上最强大的调试工具。掌握GDB能够大幅提高调试效率快速定位程序bug。本文将系统讲解GDB的使用方法和实战技巧。一、GDB基础1.1 编译调试版本使用-g选项编译程序gcc-g-O0program.c-oprogram-g生成调试信息-O0关闭优化O是字母O数字01.2 启动GDB方式1直接启动gdb ./program方式2附加到运行中的进程gdb attachpid方式3分析core文件gdb ./program core1.3 GDB基本命令命令简写说明runr运行程序breakb设置断点nextn单步执行不进入函数steps单步执行进入函数continuec继续执行printp打印变量值listl显示源代码quitq退出GDB二、断点管理2.1 设置断点# 在函数处设置断点(gdb)breakmain(gdb)b my_function# 在指定行设置断点(gdb)break20(gdb)breakfile.c:20# 条件断点(gdb)break20ifi5(gdb)b main.c:30ifx10# 查看断点信息(gdb)infobreak(gdb)i b# 删除断点(gdb)delete1# 删除1号断点(gdb)d1-5# 删除1到5号断点# 禁用/启用断点(gdb)disable1(gdb)enable12.2 观察点Watchpoint# 监视变量变化(gdb)watchx# x值改变时停止(gdb)rwatch x# x被读取时停止(gdb)awatch x# x被读取或写入时停止# 查看观察点(gdb)infowatch三、程序控制3.1 执行控制# 运行程序(gdb)run(gdb)r arg1 arg2# 带参数运行# 单步执行(gdb)next# 下一步不进入函数(gdb)n(gdb)step# 下一步进入函数(gdb)s# 继续执行(gdb)continue# 运行到下一个断点(gdb)c# 执行到指定位置(gdb)until30# 执行到第30行(gdb)u30# 跳出当前函数(gdb)finish# 执行到函数末尾(gdb)return# 立即返回(gdb)return100# 返回指定值3.2 查看源代码# 显示源代码(gdb)list(gdb)l# 显示指定范围(gdb)list10,20# 显示指定函数(gdb)list main# 显示其他文件(gdb)list file.c:main四、变量检查4.1 打印变量# 打印变量值(gdb)print x(gdb)p/x x# 十六进制(gdb)p/d x# 十进制(gdb)p/c x# 字符# 打印数组(gdb)print arr[0]10# 打印arr的前10个元素(gdb)p *arr10# 打印结构体(gdb)print *ptr(gdb)p ptr-member# 打印字符串(gdb)print str(gdb)p/s str# 打印内存(gdb)x/10xwvar# 查看var开始的10个字4.2 显示类型# 查看变量类型(gdb)whatis x# 查看详细类型(gdb)ptype struct_name4.3 自动显示# 每次停止时自动显示(gdb)display x(gdb)display/i$pc# 显示当前指令# 查看display列表(gdb)info display# 删除display(gdb)undisplay1五、栈帧管理5.1 查看调用栈# 显示调用栈(gdb)backtrace(gdb)bt(gdb)bt5# 只显示5层# 切换栈帧(gdb)frame2# 切换到第2帧(gdb)f2# 查看当前帧信息(gdb)info frame(gdb)info locals# 查看局部变量(gdb)info args# 查看函数参数六、高级调试6.1 多线程调试# 查看所有线程(gdb)info threads# 切换线程(gdb)thread2# 在所有线程设置断点(gdb)setscheduler-locking on# 只让当前线程运行(gdb)setscheduler-locking off# 所有线程运行6.2 内存检查# 检查内存泄漏需要valgrindvalgrind --leak-checkfull ./program# GDB内存检查(gdb)x/20xw 0x7fffffffdc00# 查看内存6.3 Core文件分析# 开启core文件生成ulimit-cunlimited# 程序崩溃后生成core文件./program# 分析core文件gdb ./program core# 在GDB中查看崩溃位置(gdb)bt(gdb)frame0(gdb)info locals七、实用技巧7.1 命令历史# 查看历史命令(gdb)show commands# 使用历史命令(gdb)!10# 执行第10条历史命令7.2 日志记录# 开启日志(gdb)setlogging on(gdb)setloggingfilegdb.log7.3 自定义命令# 定义快捷命令 define plist set $node $arg0 while $node print *$node set $node $node-next end end八、常见调试场景8.1 段错误调试# 方法1使用core文件ulimit-cunlimited ./program gdb ./program core(gdb)bt# 方法2直接运行gdb ./program(gdb)run# 程序崩溃后(gdb)bt(gdb)frame08.2 死循环定位gdb ./program(gdb)run# 程序卡住时按CtrlC(gdb)bt(gdb)info locals8.3 变量值异常# 使用条件断点(gdb)break30ifx0(gdb)run# 触发断点后检查相关变量(gdb)print x(gdb)bt九、总结GDB是Linux调试的利器基本操作run、break、next、step、continue变量检查print、display、whatis栈管理backtrace、frame高级功能多线程、core分析调试技巧善用条件断点使用watch监视变量配合core文件定位崩溃多线程调试使用scheduler-locking

更多文章