🌈 4.2 gdb指令集
为了演示各种指令
🥑显示代码:要打断点,要先知道行号
l/list 显示源代码
gdb会记录最近一条命令,如果命令无变化可以直接回车
🥑断点:breakpoint
b 行号 在某一行设置断点
d(delete) n 删除序号为n的断点(注:删除时不以行号标定)
info b 查看断点信息
disable n 禁用断点
enable n 启用断点
相当于vs下的——
r/run 运行程序 - 相当于F5
———————————记得打断点——————————
n/next 逐过程 - 相当于F10
s/step 逐语句 - 相当于F11
调试前要先run起来
🥑快速确定代码中是哪一行出错了
finish 结束当前函数
c/continue 直接到下一个断点
until 行号 跳转到指定行 不建议
🥑监视
display 变量名 常显示
p/P 变量名 打印一次
undisplay 数字 取消对变量的常显示
bt 查看当前的调用堆栈
quit 退出
🌍五. make & makefile
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
make是一条命令,makefile是一个文件
编写makefile包含:依赖关系&依赖方法,两者搭配,可以达到形成可执行程序的目的
🥑理解:爸我是你儿子,使用你给我发生活费
🔥 touch一个Makefile来表明依赖关系和依赖方法
touch makefile
.PHONY:修饰对应符号,让符号变成伪目标(伪目标:总是被执行的)也确实观察到如果没有对文件进行修改,执行make命令是没有效果的(底层是通过对比修改时间和可执行时间实现的),然而make clean 即便刚刚执行过,也可以随便执行。
🔥也可以这样写——
$@:目标文件
$^:文件列表
🎶总是被执行的:总是会根据依赖关系,执行依赖方法,我们习惯给clean设置.PHONY,可执行程序不带
makefile是如何得知,我的可执行文件是最新的?
根据文件最近的更改时间来判断(比较源文件和生成文件时间)
ps:当我们修改内容的时候,有时候change时间也可能会变化
🥑生成项目&清理项目
make 生成解决方案
make clean 清理解决方案
相当于vs下——
ps:❗有些时候我们代码编译不过,就是忘记了保存,所以写入磁盘的时间没有变,系统认为你没有修改,没有编译失败,这时候就要清理一下解决方案,重新生成
🥑make会根据你编写的依赖关系,从上往下自动推导程序的执行
make会在当前目录下找名字叫Makefile或makefile的文件。然后它会默认找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件。
.PHONY:clean
clean:
rm -f mytest
mytest:test.c
gcc test.c -o mytest
在如下代码中,mytest所依赖的mytest.o不存在或是被修改,就会执行对应的依赖方法,依赖方法中mytest.o又不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件,以此类推。(类似于堆栈的过程)。
总之,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。当然依赖后仍然找不到那就只能报错了
🌍 六.Linux第一个小程序-进度条
首先我们得知道两个概念:
回车\r:回到当前行的最开始
换行\n:列不变,新起一行
🌈行缓冲区
// 1. #include <stdio.h> int main() { printf("hello Makefile!\n"); sleep(3); return 0; } // 2. 发现sleep的过程中,并没有打印。 #include <stdio.h> #include <unistd.h> int main() { printf("hello Makefile!"); sleep(3); return 0; }
这意味着sleep先于printf执行吗?肯定不是❗
只是printf不带\n在向显示器打印时,数据不会立即刷新,而是会暂时保存在用户C语言级别的缓冲区中(c语言给我们提供的一块内存),显示器的刷新策略就是行刷新,遇到\n即把之前的字符串全部显示出来。
🥑那如果我们即不想换行,又想刷新咋办?可以调用这个函数来刷新显示器
fflush(stdout);
🌈进度条
思路:不换行,从左至右变长,走完再换行
#include<stdio.h> #include<unistd.h> #include<string.h> #define NUM 102 int main() { char bar[NUM]; memset(bar,0,sizeof(bar)); const char *lable="|/-\\";//4 int cut = 0; while(cut <= 100) { printf("[%-100s][%d%%] %c\r", bar, cut, lable[cut%4]); fflush(stdout); usleep(200000); bar[cut++] = '#'; } printf("\n"); return 0; }
🥑下面一一讲解一下小细节:
进度条[0 ~ 100]:不换行且能刷新,需要\r配合fflush库函数
sleep太慢了,我们设置成休眠usleep,单位是微秒
我们设置bar数组长度为102,因为字符串结束的\0我们也算上,然后用menset全部置为0
[%-100]来打印百分比,然后预留100个字符的空间,并且是从左向右打印
label旋转光标,表示当前进度条处于工作状态,注意\为特殊字符需要转义\\
同样我们也给此进度条编写makefile,一步到位make
可以在测试代码时候,写之前就把makefile写好
ps:注意字体不能调节太小,亲身尽力过,代码代码没做结果是字体太大一行打不完自动换行了
🌍 七.git
🌈创建仓库和git clone
创建仓库这个不多说了
🥑创建本地的代码仓库
git clone [url] url就是刚刚复制的仓库链接
接下来是简单的三板斧
🌈git add
🔥
将代码放到本地的目录中
git add [文件名]
🌈git commit
🔥提交改动到本地
git commit -m "日志信息"
日志信息必须写,否则无法提交,且不能乱写,可以写修改了啥
🌈git push
🔥同步到远端服务器上
git push
上传成功,嘿嘿还得多练习啊!
📢写在最后
能看到这里的都是棒棒哒🙌!
想必权限也算是Linux中重要🔥的部分了,如果认真看完以上部分,肯定有所收获。
接下来我还会继续写关于📚《gdb》等…
💯如有错误可以尽管指出💯
🥇想学吗?我教你啊🥇
🎉🎉觉得博主写的还不错的可以一键三连撒🎉🎉