0

0

C++怎么使用GDB调试程序_C++调试工具与GDB使用方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-14 10:44:03

|

407人浏览过

|

来源于php中文网

原创

GDB是C++开发中常用的命令行调试工具,通过g++ -g -O0编译生成带调试信息的程序,使用gdb ./myprogram启动后可设置断点、单步执行、打印变量;程序崩溃时用bt查看调用栈,结合frame、info locals等命令定位问题,支持条件断点break 20 if i==5和监视点watch x追踪变量变化。

c++怎么使用gdb调试程序_c++调试工具与gdb使用方法

GDB 是 GNU 调试器,是 C++ 开发中最常用的命令行调试工具。它能帮助你查看程序运行时的状态,比如变量值、函数调用、执行流程等,快速定位和修复 bug。下面介绍如何在 C++ 项目中使用 GDB 进行有效调试。

编译程序时启用调试信息

要使用 GDB 调试 C++ 程序,首先必须在编译时加入调试符号。否则 GDB 无法查看变量、源码行等信息。

使用 -g 编译选项生成调试信息:

g++ -g -o myprogram main.cpp

推荐同时关闭优化(-O0),避免编译器优化导致代码执行顺序与源码不符:

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

g++ -g -O0 -o myprogram main.cpp

启动和基本操作

使用 gdb 命令加载可执行文件:

gdb ./myprogram

进入 GDB 后,常用命令包括:

稿定AI绘图
稿定AI绘图

稿定推出的AI绘画工具

下载
  • run (r):运行程序,可带命令行参数,如 run arg1 arg2
  • break b main:在函数处设断点
  • break :在指定行号设断点,如 b 15
  • list (l):显示源代码,默认显示当前行附近
  • next (n):单步执行,不进入函数内部
  • step (s):单步执行,遇到函数会进入
  • continue (c):继续运行直到下一个断点
  • print (p):打印变量值,如 p x
  • quit (q):退出 GDB

查看程序状态

调试过程中,了解程序当前状态至关重要。

  • backtrace (bt):查看函数调用栈,知道从哪一路调用到了当前位置
  • info locals:显示当前作用域内所有局部变量的值
  • info args:显示当前函数的参数值
  • frame :切换到指定栈帧,便于查看不同层级的变量

处理崩溃和信号

如果程序崩溃(如段错误),GDB 会暂停在出错位置。

启动后运行程序,发生段错误时:

  • 输入 bt 查看调用栈,找到崩溃源头
  • frame 切换栈帧,检查各层变量状态
  • 常见问题如空指针解引用、数组越界,在对应代码行结合 print 检查变量即可发现

条件断点与监视点

有时只在特定条件下才需要中断。

  • break 20 if i == 5:当变量 i 等于 5 时才触发断点
  • watch x:设置监视点,当变量 x 的值被修改时中断(对全局或局部变量都有效)
  • watch 支持条件:watch x if x

小技巧与建议

  • 使用 directory 命令添加源码路径,方便查看分离的源文件
  • 写一个 .gdbinit 文件存放常用设置或命令别名
  • 配合 make 使用:直接在 Makefile 中保留 -g 选项,便于随时调试
  • 对于多线程程序,使用 info threadsthread 切换线程调试

基本上就这些。GDB 功能强大,但掌握核心命令就能解决大多数调试问题。熟练之后,你会发现比打印日志高效得多。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.09.27

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

712

2023.08.22

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

116

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

253

2025.10.24

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

253

2025.10.24

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

561

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号