Makefile(四)--gcc 和gdb

文章目录

  • [`**` 意思就是:](#** 意思就是:)
  • 一、gcc
  • 超通俗比喻
  • [gcc 具体干 3 件事](#gcc 具体干 3 件事)
  • 你平时敲的命令是什么意思?
  • [没有 gcc 会怎样?](#没有 gcc 会怎样?)
  • 总结(最关键)
  • 二、**gdb(调试器)**
  • [**GDB 到底是啥?和 GCC 是什么关系?**](#GDB 到底是啥?和 GCC 是什么关系?)
  • [一句话讲清 GDB](#一句话讲清 GDB)
  • 用生活比喻最清楚
  • [GCC 和 GDB 的关系(黄金搭档)](#GCC 和 GDB 的关系(黄金搭档))
  • 举个超级简单的例子你就懂
    • [直接运行(只用 GCC)](#直接运行(只用 GCC))
    • [用 GDB 调试](#用 GDB 调试)
  • [GDB 最常用的 4 个功能(你必须知道)](#GDB 最常用的 4 个功能(你必须知道))
  • [你在 VS Code 里看到的那一大段东西](#你在 VS Code 里看到的那一大段东西)
  • 最终总结(超级好记)
  • [三、**怎么在 VS Code 里用 GDB 断点调试?(超级简单,30 秒学会)**](#三、怎么在 VS Code 里用 GDB 断点调试?(超级简单,30 秒学会))
  • [VS Code GDB 断点调试 超傻瓜教程(一看就会)](#VS Code GDB 断点调试 超傻瓜教程(一看就会))
    • [1. 编译必须加 -g(最重要!)](#1. 编译必须加 -g(最重要!))
    • [2. VS Code 打断点](#2. VS Code 打断点)
    • [3. 开始调试](#3. 开始调试)
    • [4. 调试面板 4 个按钮(背下来就行)](#4. 调试面板 4 个按钮(背下来就行))
    • [5. 看变量值](#5. 看变量值)
  • [GCC ↔ GDB 关系一句话终极版](#GCC ↔ GDB 关系一句话终极版)
  • 你刚才那段日志翻译

C:\mingw64\include\c++\15.2.0**

这个后面的**啥意思

** 意思就是:

包含当前文件夹 + 所有子文件夹

(递归包含、全部包含、无限层级包含)


#举个超级简单的例子

你有这个路径:

复制代码
C:\mingw64\include\c++\15.2.0\

里面有:

复制代码
15.2.0/
├─ iostream
├─ vector
├─ algorithm
└─ bits/
   └─ stdc++.h
  • 如果只写 15.2.0

    只会找直接放在里面 的文件:
    iostreamvector...

  • 如果写 15.2.0\**

    会找:

    • 直接文件
    • bits 文件夹里的所有文件
    • 所有子文件夹、孙子文件夹......全部一起找

用一句话总结
` = 全部、所有、递归、连子子孙孙文件夹都算上**


你在哪里会看到它?

通常在这两个地方:

  1. VS Code 的 include 路径配置
  2. Makefile 里的头文件搜索路径

作用:
让编译器能找到所有 C++ 标准库头文件

比如 #include <iostream>#include <vector>


超级好记版

  • * = 所有文件
  • ** = 所有文件 + 所有子文件夹

一、gcc

一句话核心
gcc = 把你写的 C 语言代码,翻译成电脑能看懂的程序(exe)

你写的代码是人看的,电脑看不懂。
gcc 就是中间的翻译官 + 生成器。


超通俗比喻

你写的代码:

c 复制代码
printf("Hello");

这是中文

电脑只懂:

复制代码
01010100 11010011 ...

这是机器语言

gcc 就是把中文 → 翻译成机器语言的工具。


gcc 具体干 3 件事

  1. 检查你代码有没有写错

    少个分号、括号不匹配,它直接报错。

  2. 把代码编译成二进制文件

    电脑只认识二进制,不认识你写的英文。

  3. 生成 exe 可运行文件

    你双击就能跑的程序,就是 gcc 做出来的。


你平时敲的命令是什么意思?

bash 复制代码
gcc main.c -o main

翻译成人话:

喂,gcc!把 main.c 这个代码,编译成 main.exe 这个可执行程序!


没有 gcc 会怎样?

你写的代码永远只是文本文件
不能运行、不能生成程序、电脑完全不认。


总结(最关键)

  • 你写代码
  • gcc 编译代码
  • 生成 exe 运行

gcc 就是 C 语言的编译器 ,是写 C 语言必须有的工具

你现在已经装好了,完全能用 ✅

二、gdb(调试器)

好!我继续用最简单、最白话的方式,给你讲清楚:

GDB 到底是啥?和 GCC 是什么关系?

你现在已经知道:

  • GCC = 把代码变成 exe(翻译官)
  • GDB = 帮你找代码里的 bug(侦探/医生)

一句话讲清 GDB

GDB 是调试器,专门用来:
找错、排查崩溃、看程序内部到底在干嘛。


用生活比喻最清楚

你写代码 → 相当于 做菜

GCC 编译 → 相当于 把菜做好端上桌
GDB 调试 → 相当于 菜坏了/不好吃,拆开看哪一步做错了


GCC 和 GDB 的关系(黄金搭档)

GCC:负责「生成程序」

  • .c 变成 .exe
  • 只管编译、运行
  • 错了就报错,不告诉你错在哪

GDB:负责「检查程序」

  • 让程序停下来
  • 一行一行看执行过程
  • 看变量值、看哪里崩溃
  • 精准找到 bug 位置

举个超级简单的例子你就懂

你写代码:

c 复制代码
int a = 10;
int b = 0;
int c = a / b;   // 这里会崩溃!除以0

直接运行(只用 GCC)

程序直接闪退/崩溃
你根本不知道为什么!

用 GDB 调试

它会告诉你:

  • 程序停在第几行
  • 是因为 除以 0 了
  • 变量 b 现在的值是 0

直接定位错误!


GDB 最常用的 4 个功能(你必须知道)

  1. 断点(Breakpoint)

    让程序运行到某一行自动停下来

    你就能看里面发生了什么

  2. 单步执行(Step)

    一行一行跑代码

    像看慢动作一样

  3. 查看变量

    a 等于几?b 等于几?

  4. 找到崩溃位置

    程序崩了,直接告诉你哪行炸的


你在 VS Code 里看到的那一大段东西

就是 GDB 在工作

  • 程序停下来了
  • 加载系统库
  • 准备让你检查代码

不是报错!是调试功能正常!


最终总结(超级好记)

  • GCC = 编译 → 生成 exe
  • GDB = 调试 → 找 bug
  • 写代码必须用 GCC
  • 代码出错必须用 GDB

它们俩就是 C 语言的 左膀右臂


你现在的环境:

✅ GCC 正常

✅ GDB 正常

✅ VS Code 调试正常

✅ 全套 C 语言开发环境完美


三、怎么在 VS Code 里用 GDB 断点调试?(超级简单,30 秒学会)

VS Code GDB 断点调试 超傻瓜教程(一看就会)

结合你WinLibs+MinGW环境,完全通用

1. 编译必须加 -g(最重要!)

gcc 默认编译出来不能调试

你要用这条命令编译:

bash 复制代码
gcc main.c -o main.exe -g

-g = 给程序加上调试信息,GDB 才能看懂代码


2. VS Code 打断点

点击代码行号左边空白处

出现红色圆点 = 断点成功

程序运行到这里自动停下


3. 开始调试

直接按 F5

就是你刚才看到一大堆 GDB 日志的界面

4. 调试面板 4 个按钮(背下来就行)

  1. 继续 F5:跑到下一个断点
  2. 单步跳过 F10:一行一行往下走,不进入函数
  3. 单步进入 F11:进入函数内部细看
  4. 跳出 Shift+F11:退出当前函数

5. 看变量值

左边侧边栏「运行和调试」

自动显示:

  • 所有变量当前是多少
  • 程序走到第几行

GCC ↔ GDB 关系一句话终极版

  1. gcc -g :打包一个带病历的程序
  2. gdb:医生,看病、查bug、看运行全过程
  3. 不加 -g → GDB 啥也看不到

你刚才那段日志翻译

复制代码
Thread 1 hit Breakpoint 1

程序碰到你断点,停住了

复制代码
exited normally 代码0

程序跑完,没bug,正常结束

相关推荐
white-persist1 小时前
逆向入门经典题:从 IDA 反编译坑点到 Python 解题详细分析解释
c语言·开发语言·数据结构·python·算法·逆向·安全架构
01二进制代码漫游日记2 小时前
【C语言数据结构】之解锁双向链表(指定位置插入、删除节点、查找、销毁链表等操作)
c语言·数据结构·链表
代码中介商3 小时前
C语言进程管理与内存管理深度解析
c语言·开发语言
Severus_black3 小时前
算法题C——用队列实现栈/用栈实现队列
c语言·数据结构·算法·链表
叶子野格3 小时前
《C语言学习:数组》11
c语言·开发语言·c++·学习·visual studio
程序员zgh3 小时前
C++ decltype 关键字 详解
c语言·开发语言·c++
孬甭_4 小时前
自定义类型:结构体
c语言·开发语言
我不是懒洋洋4 小时前
【数据结构】二叉树-堆(树的概念、二叉树的概念、顺序结构的结构及实现、堆的实现、堆排序、TopK问题)
c语言·数据结构·c++·经验分享·算法·青少年编程
叼烟扛炮4 小时前
【C 语言系统入门教程】第 19 讲:数据在内存中的存储 | 零基础学习笔记
c语言·学习·数据存储·原码反码补码·大小端字节序·浮点数存储