引言
在Linux环境下进行C/C++开发,掌握vi/vim编辑器的配置和GDB调试工具的使用是两项必备技能。配置一个舒适的编辑环境可以大幅提升编码效率,而熟练使用调试工具则是解决程序逻辑问题的关键。
今天,我将从vi配置文件修改、主函数参数解析、环境变量获取,到GDB调试的完整流程,全面讲解Linux下C程序开发的核心技能。
第一部分:vi/vim 配置文件
一、配置文件的位置与权限
vi/vim的全局配置文件位于 /etc/vim/vimrc,该文件存储了VI编辑器的全局设置。
# 配置文件位置
/etc/vim/vimrc
# 查看配置文件(需要管理员权限)
sudo cat /etc/vim/vimrc
# 编辑配置文件(需要管理员权限)
sudo vi /etc/vim/vimrc
权限说明:
-
普通用户只有读取权限,没有修改权限
-
修改全局配置需要使用
sudo提权 -
用户个人配置可放在
~/.vimrc(无需管理员权限)
二、常用配置项
cpp
" 显示行号
set nu
set number
" 设置Tab缩进为4个空格
set tabstop=4
set shiftwidth=4
set expandtab
" 自动缩进
set autoindent
set smartindent
" 高亮搜索
set hlsearch
" 显示当前行
set cursorline
" 语法高亮
syntax on
三、配置文件的修改方法
cpp
# 1. 使用管理员权限打开配置文件
sudo vi /etc/vim/vimrc
# 2. 进入插入模式(按 i 键)
# 3. 在文件末尾粘贴或输入配置内容
set nu
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
# 4. 保存并退出(按 ESC → 输入 :wq → 回车)
四、配置后的效果
配置完成后,vi/vim将具备以下功能:
-
行号显示:每行开头显示行号,方便定位
-
自动缩进:敲回车后自动对齐到正确缩进位置
-
Tab键展开:Tab键自动转换为4个空格
-
语法高亮 :不同类型代码显示不同颜色

扩展建议:
-
可以安装额外插件(如Vundle、Pathogen)增强功能
-
使用vim-plug管理插件,获得类似IDE的体验
第二部分:主函数的参数
一、主函数参数的三种形式
C语言的主函数一般有三种参数形式:
cpp
// 形式1:无参数(最常用)
int main(void) {
return 0;
}
// 形式2:两个参数(命令行参数)
int main(int argc, char* argv[]) {
return 0;
}
// 形式3:三个参数(命令行参数 + 环境变量)
int main(int argc, char* argv[], char* envp[]) {
return 0;
}
参数说明:
| 参数 | 类型 | 作用 |
|---|---|---|
argc |
int | 参数个数(包含程序名) |
argv[] |
char*[] | 参数字符串数组 |
envp[] |
char*[] | 环境变量数组 |
命名规则: 形参名可自定义,但习惯上使用 argc/argv/envp。
二、命令行参数的获取与输出
cpp
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("参数个数: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
参数传递规则:
-
argc = 1时,默认只传入程序名作为参数 -
argv[0]固定为程序路径和名称 -
后续参数依次存入
argv[1]~argv[argc-1] -
所有参数以字符串形式 存储在字符指针数组
argv中
三、命令行执行程序的方法
cpp
# 1. 编译程序
gcc -o test test.c
# 2. 运行程序并传递参数
./test hello world 123
# 输出:
# 参数个数: 4
# argv[0] = ./test
# argv[1] = hello
# argv[2] = world
# argv[3] = 123
路径操作技巧:
-
使用
cd命令进入目标文件夹 -
Windows中可使用盘符加冒号(如
d:)快速切换磁盘 -
右键复制文件绝对路径,再粘贴到终端
第三部分:环境变量
一、环境变量的概念
环境变量是存储系统或用户定义的配置信息,如 PATH 指定操作系统查找可执行文件的目录顺序。
cpp
# 查看所有环境变量
env
# 查看单个环境变量
echo $PATH
printenv PATH
# 设置临时环境变量
export MY_VAR="hello"
# 查看设置结果
echo $MY_VAR
二、环境变量的获取
cpp
#include <stdio.h>
// 方法1:通过主函数的第三个参数获取
int main(int argc, char* argv[], char* envp[]) {
int i = 0;
while (envp[i] != NULL) {
printf("%s\n", envp[i]);
i++;
}
return 0;
}
// 方法2:通过 extern 声明获取
#include <stdio.h>
extern char** environ;
int main() {
int i = 0;
while (environ[i] != NULL) {
printf("%s\n", environ[i]);
i++;
}
return 0;
}
// 方法3:通过 getenv 函数获取特定环境变量
#include <stdio.h>
#include <stdlib.h>
int main() {
char* path = getenv("PATH");
printf("PATH = %s\n", path);
return 0;
}
三、环境变量与主函数参数的区别
| 特性 | 环境变量 | 主函数参数 |
|---|---|---|
| 来源 | 从父进程继承 | 终端运行时传递 |
| 获取方式 | envp[] 或 getenv() |
argc/argv[] |
| 本质 | 字符串形式 | 字符串形式 |
| 使用等效性 | 功能完全一致 | 功能完全一致 |
| 继承性 | 子进程继承父进程 | 不继承 |
类比说明: 就像100元来源不同(工资或红包),但使用价值相同。
第四部分:GDB调试
一、调试版本与Release版本的区别
| 特性 | Debug版本 | Release版本 |
|---|---|---|
| 调试信息 | 包含(-g参数) | 不包含 |
| 代码优化 | 不优化 | 高度优化 |
| 断点调试 | 支持 | 不支持 |
| 适用场景 | 开发调试 | 正式发布 |
编译Debug版本(包含调试信息)
gcc -g test.c -o test_debug
编译Release版本(优化,无调试信息)
gcc -O2 test.c -o test_release
二、语法错误与调试的区别
| 错误类型 | 定义 | 解决方法 |
|---|---|---|
| 语法错误 | 代码不符合语言规范 | 直接查看报错信息,修改代码 |
| 逻辑错误 | 程序能运行但结果不对 | 需要调试定位 |
| 运行时错误 | 程序崩溃 | 需要调试定位 |
调试的适用条件:
-
程序必须能通过编译,生成可执行文件
-
语法错误无法通过调试解决,必须先修正代码
-
调试的核心目的是定位运行时错误 和逻辑错误
gdb安装 
三、GDB基本命令
启动GDB(编译时必须加-g参数)
gdb ./program
常用命令
l [行号] # 显示代码(list)
b [行号/函数名] # 设置断点(break)
info break # 查看所有断点
delete [编号] # 删除断点
r [参数] # 运行程序(run)
n # 单步执行(next,不进入函数)
s # 单步执行(step,进入函数)
c # 继续执行(continue)
p [变量名] # 打印变量值(print)
bt # 查看函数调用栈(backtrace)
finish # 跳出当前函数
q # 退出GDB
四、GDB调试流程
cpp
# 1. 编译带调试信息的程序
gcc -g test.c -o test
# 2. 启动GDB
gdb ./test
# 3. 设置断点
(gdb) b main # 在main函数设置断点
(gdb) b 10 # 在第10行设置断点
(gdb) info break # 查看断点
# 4. 运行程序
(gdb) r # 运行到第一个断点
# 5. 单步调试
(gdb) n # 单步执行
(gdb) s # 进入函数
(gdb) p sum # 打印变量sum的值
# 6. 继续执行
(gdb) c # 继续执行到下一个断点
# 7. 查看调用栈
(gdb) bt # 查看函数调用链
# 8. 退出
(gdb) q
五、调试示例:字符串比较问题
cpp
#include <stdio.h>
#include <string.h>
int main() {
char input[100];
printf("请输入命令: ");
fgets(input, sizeof(input), stdin);
// 问题:fgets会读取换行符,导致比较失败
if (strcmp(input, "quit") == 0) {
printf("退出程序\n");
} else {
printf("执行命令: %s", input);
}
return 0;
}
调试过程:
cpp
# 编译
gcc -g test.c -o test
# 启动GDB
gdb ./test
# 设置断点
(gdb) b main
# 运行
(gdb) r
# 输入命令
(gdb) n # 多次单步执行到strcmp
# 查看变量
(gdb) p input
# 输出:$1 = "quit\n"(包含换行符)
# 发现问题:strcmp比较时"quit" != "quit\n"


解决方案:
cpp
// 去除末尾换行符
input[strcspn(input, "\n")] = '\0';
六、GDB命令速查表
| 命令 | 简写 | 作用 |
|---|---|---|
list |
l |
显示代码 |
break |
b |
设置断点 |
info break |
i b |
查看断点 |
delete |
d |
删除断点 |
run |
r |
运行程序 |
next |
n |
单步执行(不进入函数) |
step |
s |
单步执行(进入函数) |
continue |
c |
继续执行 |
print |
p |
打印变量值 |
backtrace |
bt |
查看调用栈 |
finish |
- | 跳出当前函数 |
quit |
q |
退出GDB |
总结
一、vi/vim配置核心要点
| 配置项 | 作用 | 命令 |
|---|---|---|
| 显示行号 | 便于定位 | set nu |
| Tab缩进 | 统一缩进风格 | set tabstop=4 |
| 自动缩进 | 提升编码效率 | set autoindent |
| 语法高亮 | 增强可读性 | syntax on |
二、主函数参数核心要点
| 参数 | 含义 | 示例 |
|---|---|---|
argc |
参数个数 | ./test hello → 2 |
argv[0] |
程序名 | ./test |
argv[1] |
第一个参数 | hello |
envp[] |
环境变量 | PATH=/usr/bin |
三、GDB调试核心要点
| 阶段 | 操作 | 命令 |
|---|---|---|
| 编译 | 生成调试信息 | gcc -g |
| 启动 | 进入GDB | gdb ./program |
| 断点 | 设置/查看 | b, info break |
| 运行 | 开始调试 | r |
| 单步 | 逐行执行 | n, s |
| 观察 | 查看变量 | p |
| 退出 | 退出GDB | q |
掌握vi/vim配置和GDB调试是Linux下C/C++开发的重要技能。
学习建议:
-
配置个性化的vi/vim环境,提高编码效率
-
理解主函数参数和环境变量的作用
-
熟练使用GDB常用命令
-
调试时先确认程序能编译通过
-
通过断点、单步执行、打印变量定位问题