news 2026/4/18 4:02:29

《gdb 与 cgdb 深度解析:命令行调试的效率革命》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《gdb 与 cgdb 深度解析:命令行调试的效率革命》

在图形化调试工具普及的今天,为何资深开发者仍偏爱 gdb/cgdb?答案很简单:极致的灵活性、跨平台兼容性,以及对底层逻辑的深度掌控力。gdb 凭借丰富的命令集,能应对从用户态到内核态、从单机到分布式的各类调试场景;而 cgdb 作为 gdb 的 “可视化增强版”,通过分屏显示代码与命令行,既保留了 gdb 的强大功能,又解决了传统命令行调试 “记不住代码位置” 的痛点。本文将不止于基础用法的罗列,更会深入剖析 gdb 的调试原理、cgdb 的高效技巧,以及两者在实际项目中的最佳实践,帮你彻底摆脱对图形化工具的依赖,成为更硬核的开发者。

样例代码:

// 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 选项,如果没有添加,程序无法被
编译

$ 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 的断点功能 “精准卡住” 异常,你也能成为别人羡慕的高效开发者。文中拆解的基础断点、条件断点、数据断点等场景,都是经过真实项目验证的实用技巧。调试的核心是 “看清代码运行的每一步”,而断点就是帮你 “暂停时间” 的工具。不妨从今天开始,把断点融入日常调试流程,慢慢你会发现,定位问题的速度和准确性会大幅提升。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:27:38

Windows 操作系统 - Windows 禁止应用开机自启、Windows 设置默认浏览器

Windows 禁止应用开机自启 最直观的方式&#xff1a;点击 【开始菜单】 -> 点击 【设置】 -> 点击 【应用】 -> 点击 【启动】 -> 管理指定应用的开机自启Windows 设置默认浏览器 点击 【开始菜单】 -> 点击 【设置】 -> 点击 【应用】 -> 点击 【默认应用…

作者头像 李华
网站建设 2026/4/18 5:31:19

爱普生TG3225CEN高精度稳定的CMOS温补晶振解决方案

在现代工业自动化与通信技术快速发展的背景下&#xff0c;高精度、高稳定性的时钟源成为各类精密设备的核心组件。爱普生&#xff08;EPSON&#xff09;推出的TG3225CEN温补晶体振荡器&#xff08;TCXO&#xff09;&#xff0c;以其卓越的频率稳定性、紧凑尺寸和CMOS输出特性&a…

作者头像 李华
网站建设 2026/4/18 7:37:50

2025-12-17:优惠券校验器。用go语言,你有三个等长数组 code、businessLine 和 isActive,分别记录 n 个优惠券的标识符、所属业务线和是否有效。 把某张券视为“合格”

2025-12-17&#xff1a;优惠券校验器。用go语言&#xff0c;你有三个等长数组 code、businessLine 和 isActive&#xff0c;分别记录 n 个优惠券的标识符、所属业务线和是否有效。 把某张券视为“合格”的条件是&#xff1a;标识符非空且只包含字母、数字或下划线&#xff1b;所…

作者头像 李华
网站建设 2026/4/18 7:01:50

AXI-A7.4.10 Support for Atomic transactions(2)

Manager support 该部分描述了AXI协议中,管理器(Manager,如CPU、DMA等主设备)对原子事务的一种向后兼容性支持机制。其核心在于,即使一个管理器本身具备发起原子事务的能力,它也可以被配置为不发起这类事务,以确保在不支持原子操作的旧系统中能正常工作。这是通过一个可…

作者头像 李华
网站建设 2026/4/18 5:32:00

币安加密货币数据 (Crypto Market)对接指南

与股票接口不同&#xff0c;加密货币接口对接币安 (Binance) 数据&#xff0c;使用 Symbol (如 BTCUSDT) 作为唯一标识&#xff0c;且 K 线数据的返回格式为数组格式&#xff08;而非对象格式&#xff09;&#xff0c;这一点在解析时需要特别注意。StockTV API 对接文档&#x…

作者头像 李华