gdb调试必须使用带-g选项编译的可执行文件,否则无法映射源码;break支持函数名、文件行号、成员函数全限定名等定位方式;run启动程序,next不进函数,step进入函数;backtrace查看调用栈,frame切换栈帧,print查看变量;关闭编译优化(-O0)是确保调试准确的前提。
直接运行 gdb 不加参数会进入空调试环境,无法设置断点或运行;必须指定已编译且含调试信息的可执行文件,比如 gdb ./a.out。若用 g++ 编译,务必加 -g 选项,否则 gdb 无法映射源码行号、变量名或查看局部作用域:
g++ -g -o main main.cpp。漏掉
-g 是最常见导致“断点打在汇编行”“print x 显示 Cannot access memory”的原因。
break,
但位置写法影响命中效果break 支持多种定位方式,选错会导致断点不触发或停在意外位置:
break main:停在 main 函数第一行(推荐用于入口检查)break main.cpp:12:停在 main.cpp 第 12 行(需确保该行有可执行语句,空行或注释行无效)break ClassName::methodName:C++ 成员函数需写全限定名,例如 break Vector::push_back
break *0x401234:按地址设断点(极少用,仅用于无符号信息或 inline 函数调试)断点设完后用 info breakpoints 查看编号和状态;用 disable 1 或 delete 1 管理,避免多断点干扰单步流程。
run/next/step,区别直接影响调试效率这三个命令行为差异明显,误用会导致跳过关键逻辑或陷入系统库:
run(或简写 r):启动程序,支持传参,如 run arg1 "arg two"
next(n):逐行执行,**不进入函数体**,把函数当黑盒;适合快速跳过标准库调用step(s):逐行执行,**遇到函数就进入其第一行**;C++ 中对重载函数或模板实例容易卡在未知头文件里,此时可先 finish 退出当前函数特别注意:对内联函数(inline)、std::vector::size() 这类 trivial getter,step 可能直接跳到汇编或报 “No source file”的错误——这不是 bug,是编译器优化+调试信息缺失的正常表现。
backtrace,但要结合 frame 和 print 定位真实问题backtrace(bt)只显示调用链,真正定位崩溃原因得往下挖:
bt:默认显示全部帧,太长时可用 bt 5 只看最近 5 层frame 2:切换到第 2 帧(从 0 开始),让后续 print、list 针对该栈帧上下文生效print x 或 p this->data_[i]:打印变量或表达式;C++ 中访问成员需显式写 this->,尤其在模板类中list(l):显示当前帧所在源码,默认 10 行;list 20,30 可指定范围如果 bt 显示大量 ?? 或地址(如 #3 0x00007ffff7b8a1a0 in ?? ()),说明对应共享库没装 debuginfo 包(如 Ubuntu 的 libstdc++6-12-dbg),此时只能靠源码逻辑推理,无法查看 STL 内部变量。
-g,若同时用了 -O2,gdb 也可能显示变量值为 ,或者单步跳转错乱——这不是 gdb 的问题,是编译器优化抹除了调试所需的信息。真要调试逻辑,关优化(-O0)比学多少 gdb 命令都管用。
# access
# ubuntu
# 栈
# ai
# c++
# 区别
# 作用域
# 标准库
# print
# 成员函数
# break
# 重载函数
# 堆
# delete
# this
# bug
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
C++如何使用std::optional?(处理可选值)
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看
如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题
php下载安装选zip还是msi格式_两种安装包对比【教程】
php能跑在stm32上吗_php在stm32微控制器上的移植方法【介绍】
Win11如何连接Xbox手柄 Win11蓝牙连接游戏手柄教程【步骤】
Win11怎么关闭OneDrive同步_Win11取消自动备份文件【教程】
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束
如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法
Bpmn 2.0的XML文件怎么画流程图
Python并发安全问题_资源竞争说明【指导】
Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭
Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】
Win10系统更新错误0x80240034怎么办 Win10更新错误解决法【方法】
Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置
MAC怎么设置程序窗口永远最前_MAC窗口置顶插件安装与快捷设置【方法】
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】
Win11快速助手怎么用_Win11远程协助连接教程【工具】
如何在JavaScript中动态拼接PHP的base_url与JS变量
Win11怎么关闭搜索历史_Win11清除任务栏搜索记录【隐私】
C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】
Python日志系统设计与实现_高可观测性架构实战
PHP 中 require() 语句返回值的用法详解
Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】
如何减少Golang内存碎片化_Golang内存分配与回收优化方法
Win11怎么设置虚拟内存_Windows 11优化内存性能提升速度【技巧】
用lighttpd能运行php吗_lighttpd配置php步骤【教程】
Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】
c# 在ASP.NET Core中管理和取消后台任务
Python网络异常模拟_测试说明【指导】
为什么Go需要go mod文件_Go go mod文件作用说明
php转mp4怎么保留字幕_php处理带字幕视频转换说明【说明】
如何优化Golang程序CPU性能_Golang CPU密集型任务优化方法
Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键
如何在 ACF 中正确更新嵌套多层的 Group 字段子字段
Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】
Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
全球各国上班时间表外贸邮件时间
Windows的便笺功能如何使用?(桌面备忘技巧)
Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】
如何在Golang中实现微服务负载均衡_Golang负载均衡策略与实现示例
Win11怎么查看局域网电脑_Windows 11网络邻居发现设置【技巧】
C++中引用和指针有什么区别?(代码说明)
Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】
Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】
如何在 Pandas 中按元素交集合并两列字符串
2025-12-27
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。