Linux开发工具使用(gdb, makefile)

 一.Linux调试器-gdb使用

1.前提补充

①程序的发布方式有两种,debug模式和release模式
②Linux gcc/g++出来的二进制程序,默认是release模式
③要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
④debug版本程序本身会被加入更多的调试信息,以便以调试

Linux开发工具使用(gdb, makefile)_第1张图片

                

⑤readlef指令,读取一个可执行程序的段构成 

Linux开发工具使用(gdb, makefile)_第2张图片

                        

2.gdb调试

【调试】
①「run/r」:运行代码(启动调试)。

Linux开发工具使用(gdb, makefile)_第3张图片

                         

②「next/n」:逐过程调试。
③「step/s」:逐语句调试(进入函数)。


④「until 行号」:跳转至指定行。
⑤「finish」:执行完当前正在调用的函数后停下来(不能是主函数)。
⑥「continue/c」:运行到下一个断点处。

Linux开发工具使用(gdb, makefile)_第4张图片

                        

⑦「set var 变量=x」:修改变量的值为x。

⑧「quit/q」:退出gdb。

                                 

【显示】
①「list/l n」:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。

Linux开发工具使用(gdb, makefile)_第5张图片

                        

②「list/l 函数名」:显示该函数的源代码。

Linux开发工具使用(gdb, makefile)_第6张图片

                        

③「print/p 变量」:打印变量的值。


④「print/p &变量」:打印变量的地址。

                        
⑤「print/p 表达式」:打印表达式的值,通过表达式可以修改变量的值。
⑥「display 变量」:将变量加入常显示(每次停下来都显示它的值)。

Linux开发工具使用(gdb, makefile)_第7张图片

                

⑦「display &变量」:将变量的地址加入常显示。
⑧「undisplay 编号」:取消指定编号变量的常显示。

                
⑨「bt」:查看各级函数调用及参数。


⑩「info/i locals」:查看当前栈帧当中局部变量的值。

 

                         

【断点】
①「break/b n」:在第n行设置断点。


②「break/b 函数名」:在某函数体内第一行设置断点。
③「info breakpoint/b」:查看已打断点信息。

                

④「delete/d 编号」:删除指定编号的断点。
⑤「disable 编号」:禁用指定编号的断点。
⑥「enable 编号」:启用指定编号的断点。

Linux开发工具使用(gdb, makefile)_第8张图片

                

二.Linux项目自动化构建工具-make/Makefifile

1.make/Makefile的重要性

  • 会不会写Makefile,从侧面说明了一个人是否具备完成大型工程的能力。
  • 一个工程的源文件不计其数,按照其类型、功能、模块分别放在若干个目录当中,Makefile定义了一系列的规则来指定:哪些文件需要先编译,哪些文件需要后编译,甚至于进行更复杂的功能操作。
  • Makefile带来的好处就是“自动化编译”,一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • mak是一个命令工具,是一个解释Makefile当中指令的命令工具,一般来说,大多数的IDE都有这个命令,例如:Delphi的make,VisualC++的nmake,Linux下GNU的make。可见,Makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefifile是一个文件 ,两个搭配使用,完成项目自动化构建。

(1)为什么要存在make、makefile ?
在vs当中,项目管理(多文件管理),vs帮我们自动管理的!
在Linux中,维护项目文件关系的工作。需要让make、makefile来完成

(2)什么是make,makefile ?
make是执行依赖关系和依赖方法的命令,makefile是维护该机制的文件,makefile里面保存的是项目的依赖结构!

(3) 怎么用make,makefile ?        
依赖关系:决定了能不能这样做.

依赖方法:决定了如何做,我要干什么.

                

2.关于依赖关系和依赖方法 

①两种编译思想

Linux开发工具使用(gdb, makefile)_第9张图片

比较推荐先形成.o再进行链接,原因:
①直接gcc编译把源文件形成可执行没有问题,只是维护成本高一些(当头文件包含源文件有上百条,你只改了一个文件的内容那么剩下的99个文件就要重新编译从预处理开始,当文件多的时候,重新编译耗费的时间很多)
②当我形成 .o 文件,一个文件改了,我只需要重新生成那一个.o 目标文件,再链接起来就可以,剩下的99个文件就没有被重新编译,这样的话编译的效率比较高。

                        

②引入makefile/Makefile

 (1)单文件

Linux开发工具使用(gdb, makefile)_第10张图片

 Linux开发工具使用(gdb, makefile)_第11张图片

                 

(2)通过仔细步骤更好理解依赖关系和依赖方法

Linux开发工具使用(gdb, makefile)_第12张图片

                

(3)多文件

Linux开发工具使用(gdb, makefile)_第13张图片

                         

(4)Makefile文件的高效写法

Linux开发工具使用(gdb, makefile)_第14张图片

  •  左边为依赖关系,以 : 为分隔,右边是依赖文件列表
  • $@:代表依赖关系中的目标文件(冒号左侧)
  • $^:依赖关系中的依赖文件列表(冒号右侧全部)
  • $<:依赖关系中的第一个依赖文件 (冒号右侧第一个)
  • gcc/g++携带-c选项时,若不指定输出文件的文件名,则默认输出文件名为xxx.o,所以这里也可以不用指定输出文件名

                

(5)编译文件,编译器是如何知道我的生成可执行程序需要被重新编译了?

根据文件的修改时间来的,因为用户不可能同时修改多个文件,所以文件修改总是有先后顺序的。又因为,源文件和可执行程序时间总是交叉。

                        

3. make原理

  • make会在当前目录下找名字为“Makefile”或“makefile”的文件。
  • 如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件作为最终的目标文件。
  • 如果mytest文件不存在,或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新,那么它就会执行后面的依赖方法来生成mytest文件。
  • 如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)。
  • 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。
  • make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出,并报错
     

                         

4. 项目清理(make clean)

 

                 

(1) 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

Linux开发工具使用(gdb, makefile)_第15张图片

(2)  .PHONY后面接伪目标,clean就是伪目标,伪目标:依赖方法总是被执行。

Linux开发工具使用(gdb, makefile)_第16张图片

                         

                

三.Linux小程序(进度条)

1.关于缓冲区 

(1)先打印,后sleep等待2s。

Linux开发工具使用(gdb, makefile)_第17张图片

(2)没有\n,先sleep等待2s,再打印。 

 Linux开发工具使用(gdb, makefile)_第18张图片

(3)通过(1)(2)的对比,发现缓冲区的存在

缓冲策略:

1.无缓冲 : (直接输出)也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

2.行缓冲: 在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行(\n)时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。

3.全缓冲 : 在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写

刷新策略

1.行刷新(\n)          2.程序结束(return)      3.强制刷新(fflush)

显示器对应的是行缓冲,行刷新,即当缓冲区当中遇到’\n’或是缓冲区被写满才会被打印出来,而在(2)当中并没有’\n’,所以字符串先被写到缓冲区当中去了,然后sleep2秒后,程序运行结束时才将打印到显示器当中。

2.\r和\n

\r: 回车,使光标回到本行行首。
\n: 换行,使光标下移一格。

Linux开发工具使用(gdb, makefile)_第19张图片

                        

3.程序

Linux开发工具使用(gdb, makefile)_第20张图片 结果:

你可能感兴趣的:(Linux系统,linux,运维)