Linux 基础开发工具:Git 版本管理与 GDB/CGDB 调试技巧
Linux 环境下 Git 版本控制与 GDB/CGDB 调试工具的使用指南。涵盖 Git 安装、仓库创建、add/commit/push 流程及冲突处理。重点讲解 GDB 调试模式编译选项-g 的含义,readelf 验证调试信息,以及常用调试命令如断点、单步执行、变量查看、条件断点和 watch 监视等。提供 cgdb 图形化界面安装与操作对比,帮助开发者高效定位程序错误。

Linux 环境下 Git 版本控制与 GDB/CGDB 调试工具的使用指南。涵盖 Git 安装、仓库创建、add/commit/push 流程及冲突处理。重点讲解 GDB 调试模式编译选项-g 的含义,readelf 验证调试信息,以及常用调试命令如断点、单步执行、变量查看、条件断点和 watch 监视等。提供 cgdb 图形化界面安装与操作对比,帮助开发者高效定位程序错误。

本文简要介绍 Git 版本控制器的核心内容。
在编写文档或代码时,为了防止丢失或失误,常会复制出多个副本(如 v1, v2, 最终版)。随着版本增多,管理变得困难。版本控制器能记录文件的每一次改动和版本迭代,方便协同作业。
目前最主流的版本控制器是 Git。它可管理所有格式文件,对开发人员而言,主要用于管理源代码。
Git 诞生于 Linux 内核开源项目协作需求中。早期使用 BitKeeper,后因授权问题,Linus Torvalds 基于经验开发了 Git。目标包括:速度快、设计简单、支持非线性开发模式、完全分布式、高效管理超大规模项目。
yum install git # CentOS 版本
git --version # 查看当前版本
详见相关文档,此处不再赘述。
将代码放到目录中,告知 Git 需要管理的文件。
git add [文件名]
提交改动到本地。
git commit -m "XXX"
提交时应注明日志,描述改动详细内容。
同步到远端服务器。需填入用户名密码。成功后刷新页面可见代码改动。
详见相关教程。
git log/status/pull, .ignore 等。
#include <stdio.h>
int Sum(int s, int e) {
int result = 0;
int i = s;
for (; 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;
}
make
gcc -o cmd.exe mycmd.c
./cmd.exe
输出:I will begin running done,result is:[1-100]=5050
程序的发布方式有两种:debug 模式和 release 模式。Linux gcc/g++ 出来的二进制程序默认是 release 模式。
-g 选项要使用 gdb 调试,必须在生成二进制程序时加上 -g 选项。
gcc mycmd.c -o mycmd # 默认模式,不支持调试
gcc mycmd.c -o mycmd -g # debug 模式
-g 之后的效果gcc -o cmd.exe-debug mycmd.c -g
./cmd.exe-debug
使用 readelf 命令查看二进制文件格式。
readelf -S cmd.exe-debug | grep -i debug
输出包含 .debug_aranges, .debug_info 等段,证明存在调试信息。
| 命令 | 作用 | 样例 |
|---|---|---|
| 代码查看命令 | ||
list/l | 显示源代码 | list/l 10 |
list/l 函数名 | 列出指定函数源码 | list/l main |
| 程序执行控制 | ||
r/run | 从程序开始连续执行 | run |
n/next | 单步执行,不进入函数内部 | next |
s/step | 单步执行,进入函数内部 | step |
continue/c | 从当前位置连续执行 | continue |
finish | 执行到当前函数返回 | finish |
| 断点管理 | ||
break/b [文件名:]行号 | 设置断点 | break 10 |
info break | 查看断点信息 | info breakpoints |
delete/d breakpoints | 删除断点 | delete breakpoints |
| 变量操作 | ||
print/p 表达式 | 打印值 | p x |
set var 变量=值 | 修改变量 | set var i=10 |
display 变量名 | 跟踪显示变量 | display x |
| 堆栈和局部变量 | ||
backtrace/bt | 查看调用栈 | bt |
info/i locals | 查看局部变量 | info locals |
GDB 是命令行界面,cgdb 提供半图形化界面,一半代码一半调试信息。
# CentOS
sudo yum install -y cgdb
# Ubuntu
sudo apt-get install -y cgdb
gdb cmd.exe
l 8 # 查看代码
r # 运行
b 20 # 在 20 行打断点
info b # 查看断点
s # 单步进入
n # 单步跳过
p result # 打印变量
quit # 退出
通过图形界面直接查看代码和调试信息。
Linux 下:
gdb ./process_bar
b mycmd.c:20 # 打断点
d 1 # 删除断点
直接删除断点不是好习惯,建议禁用(disable)而非删除,以便后续启用(enable)。
disable 3 # 禁用第 3 个断点
enable 3 # 启用第 3 个断点
在一个测试周期内,断点编号线性连续。如果删除了第三个断点,新建断点编号会从 4 开始。退出调试后重新进入,编号重置。
b:打断点。c:继续运行。n/s:单步调试(逐过程/逐语句)。p:打印变量。until:跳转到指定行。finish:执行完当前函数。bt:查看调用栈。使用 p 或 display 查看变量值。取消常显示也需通过编号操作。
执行时监视表达式值,变化时暂停。
watch result
常用于监视指针。
调试期间可直接修改变量。
set var flag=1
只在满足条件时停止。
b 9 if i == 30 # 新增条件断点
condition 2 i == 30 # 给已有断点 2 新增条件
注意语法区别,新增用 if,追加用 condition。
cgdb 分屏操作:ESC 进入代码屏,按 i 回到 gdb 屏。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online