C++ Debug in Linux through GDB
Prerequisite
修改 CMakelists.txt
Linux 下为了使用 GDB 调试 C++ 项目,在编译的过程中需要加入 -g -ggdb 参数,而习惯上我们使用 CMakelists 来生成 Makefile , 因此我们需要修改 CMakelists.txt 来生成符合条件的 Makefile 。
首先在 CMakelists.txt 中加入以下内容:
1 | # The configuration used for construction of Debug Makefile |
加入这两行的之后,我们就可以分别用不同的命令调用不同的CMAKE_CXX_FLAGS生成不同的Makefile。
编译
使用下面的指令生成用于 Debug 的Makefile:
1 | cmake -DCMAKE_BUILD_TYPE=Debug |
然后用make指令生成可执行文件即可。
Debug
开始调试
进入到可执行文件的目录下,假设可执行文件名为 TestClass, 输入以下命令则进入调试模式:
1 | gdb TestClass |
如果没有错误的话,应当可以看到以下输出:

窗口相关指令
gdb 自带的显示界面为 TUI , 通过在gdb中输入不同的指令可以开启多个窗口查看不同的内容,方便调试,常用的命令为:
| 命令 | 功能 |
|---|---|
layout src |
显示源代码窗口 |
layout regs |
显示寄存器窗口 |
layout asm |
显示汇编代码窗口 |
layout split |
显示源代码和汇编窗口 |
refresh |
刷新所有窗口 |
focus cmd/src |
切换当前关注窗口 |
程序运行指令
| 命令 | 功能 |
|---|---|
r |
运行程序 |
c |
运行程序到下一个断点 |
当程序开始运行后,我们可以使用下面的指令逐步运行程序。
必须是程序运行起来后,才能逐步运行程序,否则会出现 The program is not being run 的错误。
| 命令 | 功能 |
|---|---|
n |
单行运行 |
s |
单步运行 |
断点
我们可以设置,查看,删除断点来帮助调试程序。
| 命令 | 功能 |
|---|---|
b {number of line} |
在某行设置断点 |
b {function name} |
在函数开始处设置断点 |
info b |
查看断点 |
d |
删除所有断点 |
d {nubmer} |
删除指定断点 |
enable {nubmer} |
启用指定断点 |
disable {nubmer} |
禁止指定断点 |
显示相关指令
指令 l 可以在窗口显示当前 10 行的源代码, 如果出现 no read file 的报错,是因为在 cmake 的时候没有选择加入 -DCMAKE_BUILD_TYPE=Debug 的选项导致生成的可执行文件不能用于调试。
同时,我们还可以利用p打印变量的值,或者利用display方便地跟踪查看变量, 和x查看内存的值。
| 命令 | 功能 |
|---|---|
p {variables} |
打印输出某个变量的值 |
display {variables} |
跟踪该变量,每次运行都输出该变量的值 |
undisplay {number} |
取消跟踪该变量 |
x {address} |
跟踪该内存地址的值 |
References
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment




