Linux系统开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}
Posted 芥末虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}相关的知识,希望对你有一定的参考价值。
【Linux系统】开发工具(上) 软件包管理器yum,更新yum源,文本编辑器vim,vim的三种基本模式,vim指令集,代码编译器gcc/g++
四、Linux调试器:gdb
4.1 debug模式
- 程序的编译模式有两种,debug模式和release模式
- debug模式:加入了调试信息,使程序可已被调试。但体量较大,运行较慢。
- release模式:可执行程序中没有调试信息,不可被调试。但程序体量小;且编译器对程序做相关优化,运行速度快。
- Linux gcc/g++编译出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
4.2 如何使用?
-
debug模式编译
-
gcc -g test.c -o test.out
-
-
进入gdb模式
-
gdb test.out
-
-
基本操作
- 运行程序:r或run
- 逐过程:n或next
- 逐语句:s或step
- 执行完成当前函数:finish
- 执行到下一个断点处:c或continue
- 执行到指定行:until 行号
-
显示源代码:l或list
- 显示指定行的源代码(每次10行):l/list 行号
- 从上次的位置开始显示:l/list
- 显示指定函数的源代码:l/list 函数名
-
断点相关
-
设置断点
-
在指定行设置断点:b/break 行号
-
在指定函数的入口处设置断点:b/break 函数名
-
-
查看断点信息: i b/info b
-
删除断点:d 断点号
-
删除所有断点:delete breakpoints
-
禁用断点:disable 断点号
-
启用断点:enable 断点号
-
-
监视器
- 临时显示变量或表达式的值:p/print 表达式
- 监视变量或表达式的值:display 表达式
- 取消监视变量或表达式的值:undisplay 表达式编号
- 显示当前栈帧局部变量的值:i/info locals
- 调试时修改变量的值:set var 变量=#
-
调用堆栈
- 查看各级函数调用及参数:bt/breaktrace
-
退出gdb:quit 或 ctrl + d
五、Linux项目自动化构建工具:make/Makefile
5.1 什么是make/Makefile?
-
make/Makefile用于维护文件和文件之间的相互依赖关系,由多文件形成可执行程序。简单来说,make/Makefile用于进行多文件编译
-
makefile文件
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
- makefile是一个文件,记录了文件间的依赖关系和依赖方法。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
-
make命令
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目的自动化构建。
5.2 如何写Makefile文件?
1. 规则模板
2. 写明依赖关系和依赖方法
-
一般写法
-
依赖关系:上图中可执行程序mycode的生成依赖于mycode.c源文件
-
依赖方法:gcc -o mycode mycode.c就是对应的依赖关系
注意:写依赖方法前要加Tab进行缩进
-
-
特殊符号简写
- $@:表示目标文件(图中的mycode文件)
- $^:表示所依赖的文件列表(图中的mycode.c文件)
3. 写明项目清理方法
- 有时工程是需要被清理的,以便重新编译。
- make扫描Makefile文件的时候,默认会形成一个目标依赖关系,一般是第一个!在执行make空命令时,会自动执行目标依赖关系。
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式的要求make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。
- .PHONY:用于修饰对应的符号,表示伪目标。被修饰的符号总是可以被执行。
5.3 多文件编译
- 多文件编译的框架:
-
编写src目录下的makefile文件
生成目标文件:将各源文件编译成目标文件,并将生成的目标文件移动到obj目录下。
-
编写obj目录下的makefile文件
生成可执行程序:将所有目标文件与库文件进行链接,形成可执行程序。并将生成的可执行程序移动到bin目录下
-
编写项目主目录下的Makefile文件
总控:全局:先后到src和obj目录下生成目标文件和可执行程序。还可以进行项目清理,以便重新生成。
-
为什么要分两步编译?
-
程序编译一般分两步:.c->.o,.o->.out
-
分两步两步编译是因为:如果其中某个源文件存在问题,调试修改后只需要将这个存在问题的源文件重新编译成目标文件即可。其他h的目标文件直接链接,不用再次编译
-
如果一步直接.c->.out其中的.o文件没有保存,则若每次修改其中某个.c文件都需要把所有文件都重新编译一次浪费时间。
-
六、Linux小程序:进度条
6.1 行缓冲区
#include <stdio.h>
int main()
printf("hello Makefile!");
sleep(3);
return 0;
-
printf已经执行,但是数据没有被立即刷新到显示器上。
-
显示器设备的刷新策略是行刷新,即遇到\\n进行刷新。
-
使用printf输出的字符串只有遇到换行符\\n才会刷新到显示器。在此之前字符串会被暂存在此C程序的行缓冲区中。
-
当然,我们也可以使用fflush函数将缓冲区中的数据立即刷新到标准输出(显示器)。
6.2 进度条代码
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
char bar[101];
char *label="|/-\\\\";
memset(bar,0,sizeof(bar));
for(int i = 0; i <= 100; i++)
printf("[%c][%-100s][%-3d%%]\\r",label[i%4],bar,i);
fflush(stdout);
bar[i]='#';
usleep(50000);
printf("\\n");
return 0;
七、代码管理平台:git
-
常用命令
-
git clone:将gitee云中的仓库拷贝到本地
-
git status:查看当前仓库的状态包括:待添加的文件,待提交的文件等
-
git log:显示当前仓库的提交记录和日志信息
-
git add:添加文件到待提交文件列表
-
git reset HEAD:取消设置待提交文件
-
git commit:将待提交文件提交到本地仓库
- git commit -m “日志信息” //提交必须填写日志信息
- git commit -a -m “日志信息” //未添加文件而只是删除文件
-
git push:将本地仓库中的内容上传到gitee云
-
linux工具pstack
1.gdb 调试利器
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c++程序员,gdb是必不可少的工具;
1.1. 启动gdb
对C/C++程序的调试,需要在编译前就加上-g选项:
$g++ -g hello.cpp -o hello
调试可执行文件:
$gdb
program也就是你的执行文件,一般在当前目录下。
调试core文件(core是程序非法执行后core dump后产生的文件):
$gdb
$gdb program core.11127
调试服务程序:
$gdb
$gdb hello 11127
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
1.2. gdb交互命令
启动gdb后,进入到交互模式,通过以下命令完成对程序的调试;注意高频使用的命令一般都会有缩写,熟练使用这些缩写命令能提高调试的效率;
运行
run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
continue (简写c ):继续执行,到下一个断点处(或运行结束)
next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区
以上是关于Linux系统开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}的主要内容,如果未能解决你的问题,请参考以下文章