一、程序的编译
1.1 gcc
GCC (GNU Compiler Collection)是 GNU 编译器套件,它支持多种编程语言的编译,包括 C、C++、Objective-C、Fortran、Ada 等。当你直接使用 GCC 命令时,你通常是对单个文件进行编译。基本的使用方式如下:
gcc [选项] 源文件 [-o 目标文件]
- 选项:可以指定编译器的行为,比如
-c
只编译不链接,-o
指定输出文件名,-g
为调试生成信息等。 - 源文件:需要被编译的源代码文件。
- 目标文件:可执行文件或对象文件的名称,默认是
a.out
。
例如,如果你有一个名为 hello.c
的 C 程序,你可以这样编译它:
默认情况:
GCC 在不指定特定优化或调试选项时,默认倾向于一个比较平衡的编译设置,既不开启高阶优化也不特别包含调试信息。
gcc -o hello hello.c
Debug 版本:
要编译一个便于调试的版本,通常会加上
-g
选项来包含调试信息,这样可以在调试器中查看变量值、步进执行等。示例命令如下:
gcc -g -o debug hello.c
Release 版本:
为了编译一个优化过的、用于发布的 "Release" 版本,可以使用
-O
系列的优化级别,其中-O2
或-O3
是常用的优化等级,同时一般不加-g
以减小最终二进制的体积并提高运行效率。示例命令如下:
gcc -O2 -o release hello.c
这将生成一个名为 hello
的可执行文件。
1.2 make
Make 是一个更高级的构建工具,它通过读取名为 Makefile
的特殊文件来自动构建项目。Makefile
中定义了一系列规则,说明了如何从源代码文件构建最终的可执行文件或其他目标文件。这些规则包括依赖关系(哪些文件依赖于其他文件)、编译命令等。使用 Make 的主要优势在于自动化和管理大型项目中的编译过程。
基本的 Make 使用方法很简单,只需在命令行输入 make
即可。Make 会查找当前目录下的 Makefile
,并根据其中的规则自动编译需要更新的文件。
Makefile文件:
hello: hello.o gcc -o
hello hello.o
hello.o: hello.c
gcc -c hello.c
在这个例子中,hello
是最终的目标,它依赖于 hello.o
。而 hello.o
则依赖于 hello.c
。当运行 make
时,Make 会检查依赖关系,如果有需要重新编译的文件,它会自动调用相应的 GCC 命令来完成编译。
二、指令集汇总
命令名称 | 命令缩写 | 命令说明 | 示范 | |
按键enter | 上一次的命令 | |||
启动与退出 | run | r | 若是将断点删除掉,使用【r】指令运行的话就会直接运行到程序结束, 再加上断点去运行的话就会在打的断点处停下来 | |
quit | q | 退出GDB | ||
断点管理 | break | b | 设置断点,如 b 行号 、b 函数名 或 b 文件名:行号 | 1、b 20 2、b code.c:func 3、b code.c:20 |
info breakpoints | info b | 查看所有 断点信息 | 1、info 2、info b | |
delete | d + 编号 | 删除指定断点,d + 当前要删除断点的编号 —— 删除一个断点【不可以d + 行号】 | d 2 | |
delete breakpoints | d breakpoints | 删除所有断点 | ||
disable breakpoints | disable b | 禁用所有断点 | ||
enable breakpoints | enable b | 启用所有断点 | ||
disable breakpoint | disable b + 编号 | 禁用指定断点 | disable b 2 | |
enable breakpoint | enable b + 编号 | 启用指定断点 | enable b 2 | |
执行控制 | next | n | 单步执行,跳过函数 | |
step | s | 逐语句执行,进入函数 | ||
continue | c | 继续执行至下一断点或程序结束 | ||
until | u 行号 | 执行到指定行,忽略中间函数调用 | ||
finish | 执行到当前函数返回 | |||
查看信息 | list | l | 显示源代码,每次10行, l 行号 /函数名 |
|
p 变量名 | 打印变量值 | |||
backtrace | bt | 查看函数调用栈 | 当你在调试一个程序,尤其是当程序崩溃或者出现段错误等情况时,使用 bt 命令可以帮你了解程序在崩溃那一刻的函数调用序列。例如 bt 10 将只显示最近的10个堆栈帧。 | |
变量与状态 | set var | set var | 修改变量值,如 set var 变量名 = 新值 | |
display | 跟踪显示变量,每次停下时显示其值 | |||
undisplay | undisplay + 编号 | 取消追踪 | ||
高级功能 | attach | 连接到正在运行的进程 | ||
detach | 从进程脱离,让其继续运行 |