文章目录
一、基础命令补充:
1.man命令
man命令用于帮助手册,用来查看命令、系统调用,库函数等帮助信息
其中命令后括号里的数字还有不同的代表意义:
(1)->代表命令
(2)->代表系统调用
(3)->代表库函数
2.find命令
find命令用于在目录树中搜索指定的文件,具体用法为:
find 路径 -name 文件名:
例如:
3.tar命令
tar命令用于将文件打包,打包文件是创建压缩文件的第一步,tar命令的具体用法为:
c 创建包文件
f 指定目标为文件而不是设备
v 显示详细过程
t 显示包中的内容而不释放
x 释放包中的内容
z GNU 版本新加的,使得 tar 有压缩和解压的功能
例如:要打包main.c add.c mul.c这三个文件,输入命令:
tar cvf tar.tar add.c mul.c main.c
第二步,生成打包后的压缩文件,输入命令
gzip tar.tar
同样我们也可以将这两个步骤合为一步:
tar zcvf file.tar.gz add.c mul.c main.c
如此便得到了一个压缩文件,当我们需要解压时输入命令
gzip -d tar.tar.gz即可
二、Linux 系统上 C 程序的编译与调试
1.gcc 分步编译链接
(1) 预编译 :
gcc -E main.c -o main.i
(2) 编译:
gcc -S main.i -o main.s
(3) 汇编:
gcc -c main.s -o main.o
(4) 链接:
gcc main.o -o main
2.编译链接过程
2.1 预编译阶段
a) 删除所有的“#define”,并且展开所有的宏定义;
b) 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
c) 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
d) 删除所有的注释;
e) 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
f) 保留所有的#pragma 编译器指令,因为编译器需要使用它们。
2.2 编译阶段
词法分析、语法分析、语义分析,代码优化,汇总符号。
2.3 汇编阶段
将汇编指令翻译成二进制格式,生成各个 section,生成符号表
2.4 链接阶段
a) 合并各个 section,调整 section 的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址
b) 符号重定位
3.实例演示
创建一个普通文件main.c,对其编辑。
对其进行预编译操作得:
对main.i文件进行编译得:
再对main.s文件进行汇编操作得:
最后对其进行链接操作得:
程序执行成功,其实上述过程也可以用命令:gcc -o main main.c一步完成。
4.Make命令及makefile文件
管理工程 实现自动化编译 (和 vs 比较)示例:
对 main.c add.c max.c 三个文件进行编译(注意: gcc 前面必须是 table 建缩进)
利用add.c mul.c main .c并用make命令执行Makefile文件的指令集执行的结果如下所示:
三、gdb 调试
3.1单进程、单线程基础调试命令
- l //显示 main 函数所在的文件的源代码
- list 文件名:num //显示 filename 文件 num 行上下的源代码
- b 行号 //给指定行添加断点
- b 函数名 //给指点函数的第一有效行添加一个断点
- info break //显示断点信息
- delete 断点号 //删除指定断点
- disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效
- enable 断点号 //将断点设定为有效的,不加断点号,将所有断点设置为有效
- r(run) //运行程序
- n(next) //单步执行
- c (continue) //继续执行,直接执行到下一个断点处
- s //进入将要被调用的函数中执行
- finish //跳出函数
- q //退出调试
- p val //打印变量 val 的值
- p &val //打印变量 val 的地址
- p a+b //打印表达式的值
- p arr(数组名) //打印数组所有元素的值
- p *parr@len //用指向数组的指针打印数组所有元素的值
- display //自动显示,参数和 p 命令一样
- info display //显示自动显示信息
- undisplay + 编号 //删除指定的自动显示
- ptype val //显示变量类型
- bt //显示函数调用栈
3.2 多进程调试命令
(gdb)set follow-fork-mode mode
mode 可以选择 parent 或者 child,即:选择调试那个进程。
注意:未被跟踪调试的进程会直接执行结束。
3.3 多线程调试命令
a) 利用 info threads 查看线程信息;
b) thread id 调试目标 id 指定的线程;
c) set scheduler-locking off | on | step;
“off”表示不锁定任何线程;
“on”只有当前被调试的线程继续运行;
“step”在单步执行的时候,只有当前线程会执行;