C++如何使用GDB进行调试?(常用命令教程)

发布时间 - 2026-01-09 00:00:00    点击率:
c++kquote>GDB调试C++程序的核心是“编译带调试信息+启动GDB+控制执行+查看状态”:需用-g或-g3 -O0编译,gdb ./app启动后设断点(break)、单步(n/s)、查栈(bt)、打印变量(p)及内存(x)。

用GDB调试C++程序,核心是“编译带调试信息 + 启动GDB + 控制执行 + 查看状态”。只要掌握几个关键命令,就能快速定位变量值、函数调用和崩溃位置。

编译时必须加 -g 参数

没有调试信息,GDB只能看到汇编,看不到变量名和源码行。务必使用:

  • g++ -g -o myapp main.cpp(基础调试版)
  • g++ -g3 -O0 -o myapp main.cpp(推荐:-g3保留宏信息,-O0禁用优化,避免变量被优化掉或行号错乱)

如果用了 CMake,确保设置:set(CMAKE_BUILD_TYPE Debug) 或在命令行加 -DCMAKE_BUILD_TYPE=Debug

启动与基本运行控制

启动后先加载程序,再决定如何跑:

立即学习C++免费学习笔记(深入)”;

  • gdb ./myapp —— 启动GDB并载入可执行文件
  • runr —— 开始运行(可跟参数:r arg1 "arg two"
  • kill —— 终止当前运行的程序
  • quitq —— 退出GDB

打断点、单步与继续执行

断点是调试的起点,灵活组合才能高效排查:

  • break main —— 在 main 函数入口设断点
  • break foo.cpp:25 —— 在 foo.cpp 第25行设断点
  • break ClassName::methodName —— 对类成员函数设断点(注意命名空间或模板需完整写法)
  • continuec —— 从当前断点继续运行到下一个断点
  • nextn —— 下一行(不进入函数内部)
  • steps —— 进入函数内部(遇到函数调用就跳进去)
  • finish —— 执行完当前函数,停在它的返回处

查看变量、栈帧与内存

运行暂停后,重点就是“看”:

  • print xp x —— 打印变量 x 的值(支持表达式:p *ptrp vec[0]
  • print /x i —— 以十六进制打印 i;/t 是二进制,/f 是浮点
  • info locals —— 显示当前栈帧所有局部变量
  • btbacktrace —— 查看完整调用栈(崩溃时第一要输的命令)
  • frame 2 —— 切换到第2层栈帧,再用 info locals 看那里的变量
  • x/4dw &i —— 查看 i 地址开始的4个有符号整数(x = examine,常用 x/10xb ptr 查内存字节)

实用技巧与避坑提醒

真实调试中这些细节常决定成败:

  • 多线程程序加 set follow-fork-mode child,让 GDB 跟进子进程
  • 段错误崩溃后,直接输 bt,90% 能看到空指针解引用或越界位置
  • 变量显示为 ?说明没加 -O0 或忘了 -g
  • 想看 STL 容器内容?安装 python 自定义脚本(如 libstdc++ pretty printers),否则 vector 只显示地址
  • Ctrl+C 可随时中断正在运行的程序,停在当前执行点,方便检查状态


# python  # app  # 字节  #   # ai  # c++ 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器租用费用高吗?如何避免常见误区?  Windows Hello人脸识别突然无法使用  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何为不同团队 ID 动态生成多个“认领值班”按钮  如何解决hover在ie6中的兼容性问题  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何记录自定义日志?(Log频道配置)  如何在云服务器上快速搭建个人网站?  Laravel如何配置任务调度?(Cron Job示例)  如何破解联通资金短缺导致的基站建设难题?  iOS验证手机号的正则表达式  微信小程序 require机制详解及实例代码  QQ浏览器网页版登录入口 个人中心在线进入  如何在建站之星绑定自定义域名?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  详解MySQL数据库的安装与密码配置  Laravel如何自定义错误页面(404, 500)?(代码示例)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何快速查询网址的建站时间与历史轨迹?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Mybatis 中的insertOrUpdate操作  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel如何实现API资源集合?(Resource Collection教程)  PHP 500报错的快速解决方法  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel如何实现用户注册和登录?(Auth脚手架指南)  如何快速生成专业多端适配建站电话?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  深圳网站制作的公司有哪些,dido官方网站?  企业网站制作这些问题要关注  怎样使用JSON进行数据交换_它有什么限制  原生JS实现图片轮播切换效果  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  如何在万网自助建站中设置域名及备案?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  详解Android图表 MPAndroidChart折线图