在 Linux 下排查 C++ 程序问题,很多人一开始会被命令行调试劝退,尤其是不清楚该先做什么、卡住后又该看什么。其实只要把 GDB 的基本流程串起来,先准备调试信息,再学会断点、单步和调用栈查看,绝大多数入门级问题都能有据可查。
先确认程序是否带有调试信息
在 Linux 下调试 C++ 程序,最常用的工具之一就是 GDB(GNU 调试器)。不过在启动调试器之前,第一件事不是直接运行 gdb,而是确认编译时加入了 -g 选项。这个选项会把调试信息写进可执行文件,后面你在 GDB 里查看代码位置、变量内容和调用关系时,才有足够的信息可用。
示例命令如下:
g++ -g -o myprogram myprogram.cpp
这一步是整个调试流程的基础。如果忘了加 -g,GDB 仍然可以启动程序,但很多定位问题时最关键的上下文会缺失,调试体验会差很多。
启动 GDB,并在可疑位置停住程序
完成编译后,就可以把目标程序交给 GDB:

gdb myprogram
进入 GDB 之后,最常见的做法是先设置断点。断点的作用是让程序运行到某个位置时暂停,这样你就不用靠猜测去判断问题发生在哪一步。
如果你怀疑 main.cpp 的第 10 行存在异常,可以这样设置断点:
break main.cpp:10
设置完成后,用下面的命令启动程序:
run
程序会正常执行,直到命中断点时停下来。对于初学者来说,这一步很关键,因为它把“程序跑错了”变成了“程序停在了一个具体位置”,后续观察变量和执行路径就有了落点。
查看变量值,区分 step 和 next 的使用场景
当程序在断点处暂停后,接下来通常要回答两个问题:当前数据对不对,以及这一行之后程序会怎么走。GDB 针对这两个问题分别提供了变量查看和单步执行命令。
查看变量值时,可以直接使用:
print variable_name
这条命令适合用来确认某个变量在当前时刻的真实值,尤其是在你怀疑判断条件、循环次数或函数参数有误时特别有用。
如果需要一行一行往下跟,可以使用两个最常见的单步命令:
step
next
step 会进入当前行调用到的函数内部,适合追查更深层的逻辑;next 则在当前层级继续执行,不进入函数体,更适合先看主流程是否正常。很多情况下,这两个命令配合使用,就能较快缩小问题范围。
如果当前位置没有异常,只是想让程序继续往后跑,到下一个断点或者程序结束,可以执行:
continue
程序崩溃时,用调用栈快速回溯
有些问题并不会在你预设的断点附近暴露,而是直接表现为程序崩溃,或者某个函数链条走偏了。这时候,最值得先看的通常不是单个变量,而是当前到底处在怎样的调用路径里。

GDB 提供的 backtrace 命令可以打印当前调用栈:
backtrace
它能帮助你看到程序当前执行到了哪个函数、这个函数又是被谁调用进来的。遇到崩溃、异常返回或者多层函数嵌套时,调用栈往往比盯着某一行代码更快暴露问题范围。
调试结束后,可以用下面的命令退出 GDB:
quit
如果只是入门使用,上面这一组命令已经覆盖了日常调试中的大部分需求。后续还可以继续了解条件断点、观察点和内存检查等更高级的能力,也可以直接查阅 man gdb。先把“带 -g 编译、下断点、看变量、做单步、查调用栈”这条主线练熟,排查 C++ Bug 时就会更有把握。







