Linux笔记(4)编译与调试

安装gcc

1、gcc分布编译:

(1)预编译:gcc -E main.c main.i

(2)编译:gcc -S main.i main.s

(3)汇编:gcc -C main.s main.o

(4)链接:gcc main.o -o main

2、编译链接过程:

源文件(main.c)

->预编译阶段:处理预编译指令,删除注释

->编译阶段:语法、词法分,代码优化,汇总符号

->汇编阶段:翻译成二进制,生成各个段,生成符号表(可重定位二进制目标文件 main.obj、main.o、*.o、*.obj、*.a、*.lib)

->链接阶段:合并各个段,符号解析,符号重定位

->*.exe、a.out

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、makefile和make

makefile:内容描述如何编译整个工程。

make:读取makefile文件的内容,按照makefile文件编译代码。

例如:

对main.c,add.c,max.c三个文件进行编译(main.c 主函数,add.c:求和,max.c 求两个数中更大的数)其makefile文件编写如下:

all:main

main:add.o max.o main.o

        gcc -o main add.p mac.o main.o

add.o:add.c

        gcc -c add.c

max.o:max.c

        gcc -c max.c

main.o:main.c

        gcc -c main.c

clean:

        rm -rf *.o main

make命令根据makefile文件的规则生成可执行程序。

4、gdb调试(在Debug版本中)

4.1 单进程、单线程调试命令

1. l //显示 main 函数所在的文件的源代码
2. list 文件名:num //显示 filename 文件 num 行上下的源代码
3. b 行号 //给指定行添加断点
4. b 函数名 //给指点函数的第一有效行添加一个断点
5. info break //显示断点信息
6. delete 断点号 //删除指定断点
7. disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效
8. enable 断点号 //将断点设定为有效的,不加断点号,将所有断点设置为有效
9. r(run) //运行程序
10. n(next) //单步执行
11. c ( continue //继续执行,直接执行到下一个断点处
12. s //进入将要被调用的函数中执行
13. finish //跳出函数
14. q //退出调试
15. p val //打印变量 val 的值
16. p &val //打印变量 val 的地址
17. p a+b //打印表达式的值
18. p arr(数组名) //打印数组所有元素的值
19. p *parr@len //用指向数组的指针打印数组所有元素的值
20. display //自动显示,参数和 p 命令一样
21. info display //显示自动显示信息
22. undisplay + 编号 //删除指定的自动显示
23. ptype val //显示变量类型
24. bt //显示函数调用栈

4.2 多进程调试命令

(gdb)set follow-fork-mode mode

mode 可以选择 parent 或者 child,即:选择调试那个进程。
注意:未被跟踪调试的进程会直接执行结束。

4.3 多线程调试命令

 a) 利用 info threads 查看线程信息;

b) thread id 调试目标 id 指定的线程;
c) set scheduler-locking off | on | step;
“off”表示不锁定任何线程;
“on”只有当前被调试的线程继续运行;
“step”在单步执行的时候,只有当前线程会执行;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值