网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
readelf -S hello
注意:使用C99的标准通过gcc对程序进行编译:
gcc hello.c -o hello -std=c99
2. 开始使用
gdb binFile
退出: ctrl + d
或 quit
调试命令:
- list/l 行号:显示binFile源代码,从行号位置处开始显示,按回车之后接着上次的位置往下列,每次列10行。
例如:l 0
:从第0行开始显示,l main
:显示main函数的代码- list/l 函数名:列出某个函数的源代码。
- r或run:运行程序。
- n 或 next:单条执行即逐过程进行执行。
- s或step:进入函数调用,或者逐语句逐语句进行执行
- break(b) 行号:在某一行设置断点
- break 函数名:在某个函数开头设置断点
- info break/info b :查看断点信息。
- finish:执行到当前函数返回,然后挺下来等待命令
- print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值。
- set var:修改变量的值
- continue(或c):从当前位置开始连续而非单步执行程序,即从一个断点跳转到另一个断点的位置处
- run(或r):从开始连续而非单步执行程序
- delete breakpoints:删除所有断点
- delete breakpoints n:删除序号为n的断点
d 断点序号
删除相应的断点。
- disable breakpoints:禁用断点
- enable breakpoints:启用断点
- info(或i) breakpoints(b):参看当前设置了哪些断点
例如:
info b
查看当前设置了哪些断点
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay 变量序号:取消对先前设置的那些变量的跟踪
- until X行号:跳至X行
- breaktrace(或bt):查看各级函数调用及参数
- info(i) locals:查看当前栈帧局部变量的值
- quit:退出gdb
- bt:查看调用的堆栈
Linux项目自动化构建工具-make/Makefile
背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
具体使用
makefile/Makefile:在当前路径下的一个普通文件。包含:
- 依赖关系
- 依赖方法
举例:
现有一个源文件,hello.c
依赖关系:
hello.c -> hello
clean
依赖方法:
gcc hello.c -o hello
rm -rf hello
Makefile图示:
使用方法:
make
:执行gcc hello.c -o hello
make clean
:执行rm -rf hello
问:为什么每次使用make指令只执行
gcc hello.c -o hello
?答:因为它写在makefile的前面。默认只会形成第一个目标文件,执行该依赖关系的依赖方法。
.PHONY
:Makefile语法格式中的一个关键字,伪目标,被.PHONY修饰的标签总是被执行的。问:总是被执行是什么意思?
答:
我们可以看到当我们第二次第三次执行make指令时会显示Test可执行文件已经是最新形成的可执行程序了。
假如我们用
.PHONY
来修饰hello
问:makefile是怎么识别我的exe/bin是新的还是旧的呢?
答:
文件 = 内容 + 属性
Access:读取或者进入的时间。
Modify:内容发生改变。
Change:属性发生改变。(例如:权限)
注意:属性的改变并非真正发生了改变,比如文件hello.c已经拥有了r权限,我们再执行指令
chmod u+r
这也算对权限进行改变。我们使用vim hello.c
之后,hello.c
的Modify时间就会发生改变。注意:内容的改变必然会引起Change也会发生改变,因为内容的改变往往会改变文件的大小,而文件的大小属于文件的属性。
注意:有时候打开文件并不一定会引起Access时间的改变。只有当累计到一定次数之后才会发生改变。
从上图可以看出:对比hello.c的时间和hello即可得知hello是否改变过,即根据对比源文件和可执行程序的最近修改时间,评估要不要重新生成。
问:如果我们有多个源文件,我们该如何使用makefile对文件进行编译呢?
答:以下面的例子为例:
test.c
文件:
test.h
文件:
main.c
文件:
makefile
文件:
Linux第一个小程序-进度条
\r&&\n
- 回车概念(\r):将光标回到当前行的最开始。如图所示:
- 换行概念:从一行的某个位置换到下一行的同一个位置,新起一行。如图所示:
我们通常所使用的换行或者键盘中的回车,其实是回车+换行。
下面有两段程序:
程序一:
程序二:
编译运行后,两段程序出现了不一样的现象:
程序一:先输出了
hello world
,然后在当前屏幕下停顿了2秒,然后程序退出。程序二:先停顿了2秒,然后打印出了
hello world
,然后程序退出。
问:在程序二停顿2s的这段时间,
hello world
这些字符在哪呢?答:是存在与缓冲区中。我们可以理解为是在一段内存空间中,一般的刷新策略为行刷新,即满一行即刷新,我们常用的
\n
的意思就是包括\n
和之前的字符形成一行,此时满足了刷新策略,即刻对缓冲区中的字符进行输出。当然,我们也可以使用
fflush()
函数强制对缓冲区进行刷新。
进度条代码:
git
git是什么
git是一个版本控制器。
安装 git
sudo yum install -y git
将仓库克隆到本地
git clone Http网址
查看本地仓库和远端仓库文件的关系
git status
git三板斧
git add 文件名或者文件夹名 //*是当前目录下的所有文件 .是当前目录下未提交的文件
git commit -m "" //添加已经被修改的文件到本地的仓库,”“内的是提交日志,-m选项就是为了提交提交日志
![](https://img-blog.csdnimg.cn/img_convert/9a8cb5f8c0ec69e6499adead0da6e95b.png)
最全的Linux教程,Linux从入门到精通
======================
1. **linux从入门到精通(第2版)**
2. **Linux系统移植**
3. **Linux驱动开发入门与实战**
4. **LINUX 系统移植 第2版**
5. **Linux开源网络全栈详解 从DPDK到OpenFlow**
![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/59742364bb1338737fe2d315a9e2ec54.png)
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)
**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**
> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**