在图形化调试工具普及的今天,为何资深开发者仍偏爱 gdb/cgdb?答案很简单:极致的灵活性、跨平台兼容性,以及对底层逻辑的深度掌控力。gdb 凭借丰富的命令集,能应对从用户态到内核态、从单机到分布式的各类调试场景;而 cgdb 作为 gdb 的 "可视化增强版",通过分屏显示代码与命令行,既保留了 gdb 的强大功能,又解决了传统命令行调试 "记不住代码位置" 的痛点。本文将不止于基础用法的罗列,更会深入剖析 gdb 的调试原理、cgdb 的高效技巧,以及两者在实际项目中的最佳实践,帮你彻底摆脱对图形化工具的依赖,成为更硬核的开发者。
样例代码:
cpp
// mycmd.c
#include <stdio.h>
int Sum(int s, int e)
{
int result = 0;
for(int i = s; i <= e; i++)
{
result += i;
}
return result;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}
一什么样的程序可以调试
答:有调试信息的程序。也就是Debug版本的程序。
刚刚样例代码生成的程序。

main.exe是release版本的。

调试没有作用。

main.exe是Debug版本的

这次的调试指令就有作用了。

gcc/g++默认生成的程序是release版本的。在指令末尾加上-g选项,生成Debug版本的程序。
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项,如果没有添加,程序无法被
编译
bash
$ gcc mycmd.c -o mycmd # 默认模式,不支持调试
$ file mycmd
mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux
3.2.0, not stripped
$ gcc mycmd.c -o mycmd -g # debug模式
$ file mycmd
mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux
3.2.0, with debug_info, not stripped
gcdb是可视化调试。
gdb不是可视化的。
二调试命令



三常用命令
1)list 查看代码(gdb里)
l 显示剩余内容


2)回车执行上一个指令。
四断点
1)breakpoint b +n
打断点。


2)infomation info b
查看断点信息。


再一次调试中,断点序号是递增的。
3)delete d+n
删除断点。这里的n是断点序号。


4)disable + n
禁用断点 n也是断点序号。


5)断点的本质
断点可以对代码分区执行,可以快速定位问题的范围。
五其他指令
1)run r
运行到断点。 

2)continue c
运行到下一个断点。


3)quite q
退出调试
六逐语句/逐过程

1)逐语句
一句一句执行,进入函数。
step s


2)逐过程
不进入函数。
next n

3)跳出循环
1.断点加c搭配使用


2.until +n
运行到指定的位置,不能跨函数,只能向下调试(跨函数了就执行完函数)

七执行函数后停止
finish 执行完指针在函数体内



八监视
1)p 临时查看
可以接变量或者表达式
2)diaplay 常显示

3)undisplay 取消监视
后面要加编号。
4)info local 打印所有本地变量

5)backtrace bt 查看函数调用栈
九三个常用技巧
1)watch 监测点
watch + 变量 会产生一个检测点,该变量变化会提醒。

检测指针这种不能轻易修改的变量。
2)set var 标志位
在调试期间修改值,验证问题。
set var 变量=值

3)条件断点
b +n if 条件
条件为真时则停止(启用断点)。

给断点修改条件
condition +编号 条件

细节
1.i 回到gdb
2.Esc 进入代码
十结语:
告别 print 语句的 "大海捞针",用 gdb/cgdb 的断点功能 "精准卡住" 异常,你也能成为别人羡慕的高效开发者。文中拆解的基础断点、条件断点、数据断点等场景,都是经过真实项目验证的实用技巧。调试的核心是 "看清代码运行的每一步",而断点就是帮你 "暂停时间" 的工具。不妨从今天开始,把断点融入日常调试流程,慢慢你会发现,定位问题的速度和准确性会大幅提升。



