在 Linux 开发环境中,熟练掌握常用命令与 GDB 调试工具是每一个 C/C++ 开发者的基础能力。本文将结合实际代码案例,介绍 Linux 常见命令的使用,以及如何利用 GDB 对程序进行调试。

一、Linux 简介

什么是 Linux?

Linux 是一种开源操作系统,广泛应用于:

  • 服务器
  • 云计算
  • 嵌入式开发
  • 后端开发
  • 高性能计算

目前绝大多数互联网服务器都运行在 Linux 系统之上。


二、Linux 文件系统结构

Linux 的目录结构采用树形结构,一切皆文件。

Linux 目录结构示意图

/
├── home        用户目录
├── root        管理员目录
├── etc         配置文件
├── usr         用户程序
├── bin         常用命令
├── dev         设备文件
├── tmp         临时文件
└── var         日志文件

三、Linux 常用命令

1. pwd —— 查看当前路径

功能

显示当前所在目录。

命令格式

pwd

输出:

/home/user/project

图文理解

当前所在位置
↓
/home/user/project

2. ls —— 查看目录内容

功能

查看当前目录下的文件。

常用参数

参数 作用
-l 显示详细信息
-a 显示隐藏文件
-h 人性化显示大小

示例

ls
ls -l
ls -la

输出理解

-rw-r--r--  1 root root  1200 test.cpp

含义:

字段 说明
rw- 文件拥有者权限
r-- 用户组权限
r-- 其他用户权限

3. cd —— 切换目录

功能

进入指定目录。

示例

cd /home

返回上一级:

cd ..

进入用户主目录:

cd ~

目录切换流程图

/home
   ↓ cd user
/home/user
   ↓ cd project
/home/user/project

4. mkdir —— 创建目录

示例

mkdir test

递归创建:

mkdir -p a/b/c

5. touch —— 创建文件

touch main.cpp

6. rm —— 删除文件

删除文件

rm test.txt

删除目录

rm -r dir

强制删除

rm -rf dir

⚠️ 注意:

rm -rf /

属于危险命令,会删除系统文件。


四、文件查看命令

1. cat —— 查看文件内容

示例

cat test.txt

2. less —— 分页查看

示例

less log.txt

适合查看大型日志文件。


3. tail —— 查看日志尾部

示例

tail -f log.txt

日志实时查看流程

程序运行
   ↓
日志写入 log.txt
   ↓
tail -f 实时刷新输出

五、Linux 权限管理

1. chmod —— 修改权限

示例

chmod 755 app

权限数字含义

数字 权限
4
2
1 执行

755 权限理解

7 = 4+2+1 = rwx
5 = 4+1   = r-x
5 = 4+1   = r-x

即:

拥有者:可读可写可执行
用户组:可读可执行
其他人:可读可执行

六、进程管理命令

1. ps —— 查看进程

示例

ps aux

查找指定进程:

ps aux | grep nginx

2. top —— 动态查看系统状态

top

类似 Windows 任务管理器。


3. kill —— 结束进程

kill 1234

强制结束:

kill -9 1234

七、GCC 编译工具

编写测试代码

// main.cpp

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello Linux!" << endl;
    return 0;
}

编译程序

g++ main.cpp -o app

运行程序

./app

输出:

Hello Linux!

GCC 编译流程图

main.cpp
   ↓
g++
   ↓
app 可执行文件
   ↓
运行程序

八、GDB 调试工具

什么是 GDB?

GDB 是 Linux 下常用的程序调试工具。

它可以帮助开发者:

  • 设置断点
  • 单步调试
  • 查看变量
  • 分析崩溃原因
  • 查看函数调用栈

九、GDB 调试案例

1. 编写测试程序

#include <iostream>
using namespace std;

int add(int a, int b)
{
    int c = a + b;
    return c;
}

int main()
{
    int x = 10;
    int y = 20;

    int result = add(x, y);

    cout << result << endl;

    return 0;
}

2. 添加调试信息编译

g++ test.cpp -g -o test

⚠️ -g 参数用于生成调试信息。


3. 启动 GDB

gdb ./test

十、GDB 常用命令

命令 作用
break / b 设置断点
run / r 运行程序
next / n 单步执行
step / s 进入函数
print / p 查看变量
continue / c 继续运行
list / l 查看源码
quit / q 退出

十一、GDB 调试流程

1. 设置断点

(gdb) b main

2. 运行程序

(gdb) r

程序停在断点:

Breakpoint 1, main ()

3. 单步执行

(gdb) n

4. 查看变量

(gdb) p x

输出:

$1 = 10

5. 进入函数

(gdb) s

进入:

int add(int a, int b)

GDB 调试流程图

启动 GDB
   ↓
设置断点
   ↓
运行程序
   ↓
程序停在断点
   ↓
单步调试
   ↓
查看变量
   ↓
定位 Bug

十二、程序崩溃调试案例


空指针错误代码

#include <iostream>
using namespace std;

int main()
{
    int *p = NULL;

    cout << *p << endl;

    return 0;
}

运行结果

Segmentation fault

使用 GDB 分析

启动:

gdb ./test

运行:

(gdb) r

程序崩溃:

Program received signal SIGSEGV

查看调用栈

(gdb) bt

崩溃分析流程图

程序运行
   ↓
访问空指针
   ↓
发生段错误
   ↓
GDB 捕获异常
   ↓
定位崩溃代码

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐