Linux调试器-gdb使用、makefile、进度条及yum

news/2024/7/7 9:02:10

一:gdb
-g 向可执行程序中添加调试信息:
这里写图片描述
然后用gdp调试:gdb ./test -->run ->start
run:运行程序
start:开始逐步调试;
n 进行下一步调试(不进入函数);
s 进行下一步调试(进入函数);
b:添加断点(b filename:line 向指定文件指定行添加断点或者 b line 向指定行添加断点);
i :查看断点信息;
d num 删除断点序号为num的断点;
d 删除所有断点;
l :查看当前行附近的代码
l n 查看第n行附近的代码
c 继续运行(有多个断点,调试到一个断点,可以c后运行到下一个断点);
在14行添加断点,并且查看断点,删除断点,如果有多个文件需要添加断点,可以b filename:line
这里写图片描述
watch var 监控变量var的改变;
p var 打印var变量的值;
bt 打印函数调用栈;
ctrl+d 或者q退出gdb
这里写图片描述
注:如果run 后发现有错误,可以不用一步一步调试,可以借助bt(会打印出哪里有错误)
这里写图片描述
可以看出在main函数18行有错,那么就可以list 18,查看18行附近代码,并且b test.c:18在18行添加断点,然后再重新run,运行到18后,再查看变量的变化:
这里写图片描述
二:Makefile
makefile是一个文件,自动化编译,一旦写好,就需要一个make命令,整个工程就自动编译,极大的提高了软件开发的效率;
make是一个解释makefile中指令的命令工具。
原理:make会在当前目录下找名字为Makefile或makefile的文件,如果找到,它会找文件中第一个目标文件,并把这个文件作为最终的目标文件(test),如果这个目标文件依赖的文件(test.o mytmp.o)不存在,那么make 会在当前文件找test.o文件的依赖性,如果找到再根据规则生成test.o,依次类推,直至编译出第一个目标文件。
如果需要同时编辑两个文件可以在底行模式写入:vnew fileneme
这里写图片描述
用ctrl+w进行两个文件的切换。
test.c
这里写图片描述
这时我们需要gcc test.c tmp.c -o test来进行编译,但如果文件很多,就会很繁琐,那么我们就可以写一个makefile来对进行
这里写图片描述
然后用make
这里写图片描述
但是这样有一个问题,假如只修改了tmp.c,gcc test.c tmp.c -o test,就会把test.c再编译一遍,可是test.c就没有修改呀即没有编译的必要,那么这种操作就不合适;
将makefile 修改为:
这里写图片描述
make:
这里写图片描述
这样如果只修改了mytmp.c,就只会编译mytmp.c,然后再将mytmp.o和test.o链接一起。
这里写图片描述
但是这样还存在一个问题即存在若干文件,就要手动输入若干文件,如果不想手动输入每个文件,可以将makefile修改为:

  1 SRC=$(wildcard ./*.c)    #tets.c  tmp.c   
  2 # 代表当前目录全部.c文件赋值给$(SRC) (./指当前目录,*.c指所有.c文件)
  3 
  4 OBJ=$(patsubst %.c,%.o,$(SRC))  #test.o tmp.o
  5 #代表将$(SRC)中全部.c文件替换为.o文件赋值给$(OBJ)
  6 
  7 BIN=./tmp  #BIN代表可执行程序
  8 
  9 $(BIN):$(OBJ)
 10         gcc $^ -o $@  # $^指所有冒号右边所有依赖文件 $@指冒号左边要生成的目标对象
 11 %.o:%.c
 12         gcc -c  $< -o $@   
 13 # $< 指冒号右边所有依赖对象的第一个文件;
 14 # 当用test.c生成test.o后,操作系统会自动将tmp.c变成第一个依赖文件生成tmp.o,依次循环直至所有.o文件全部生成
 15 
 16 clean:
 17         rm -f $(OBJ)  $(BIN)  #完成清理

如果目标文件是最新即没有重新生成的必要,make后会有文件是最新的警告,如果想要每次都生成目标文件,可以用.PHONY声明一个伪对象:
这里写图片描述
make:
这里写图片描述
三:进度条
1.fflush(stdout):刷新缓冲区,因为系统认为当缓冲区数据满后才会将缓冲区内容输出到显示器上,当刷新缓冲区后当有数据就会输出到显示器;
2.回车符\r与换行符\n
\r是回车符,即光标回到首字符

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {
  5         printf("hello,world!\r"); //光标回到字符h
  6         fflush(stdout);
  7         sleep(1);
  8         printf("hello,sun!\n"); //会将hello,world!覆盖  有\n  
  9         fflush(stdout);
 10         sleep(1);
 11         return 0;
 12 }

这里写图片描述
另一个\r实例:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6         int i=0;
  7         char buff[10]={0};
  8         for(i=0;i<10;i++)
  9         {
 10                 buff[i]='#';
 11                 printf("[%-15s][%d%%]\r",buff,i);
 12                 fflush(stdout);
 13                 sleep(1);
 14         }
 15         printf("\n");
 16         return 0;
 17 }

这里写图片描述
回车后后面打印内容将前面内容覆盖。
四:yum
yum是linux软件包管理器。
列举安装包信息:
通过yum list 命令可以罗列出当前一共有那些安装包,但是由于包的数量多,可以用grep只筛选出需要了解的包。
|是管道符;
这里写图片描述
以上就是gcc安装包的具体信息。
但是如何安装软件
这里写图片描述
然后输入用户密码;
这里写图片描述
yum会自动找到都有那些软件包需要下载,输入y确认安装即可。
当出现Complete!即安装完成。
注意:安装软件时由于需要向系统目录中写入内容,一般需要sudo(临时赋予管理员权限)或者切换root账号才可以完成;
yum安装软件只能将一个安装完成才能安装另一个,正在安装一个软件的过程中,如果再安装另一个软件,yum会报错。
卸载软件
这里写图片描述
同样需要sudo或者切换root账号用yum remove进行卸载。
总结:yum list 或者yum list | grep 软件名称:列举软件包名称;
sudo yum install 软件包:进行安装软件;
sudo yum remove 软件包:进行卸载软件;


http://www.niftyadmin.cn/n/2559821.html

相关文章

Intent中的各种FLAG

Task Task就是一个任务栈&#xff0c;里面用来存放Activity&#xff0c;第一个进去的&#xff08;Activity&#xff09;处于栈的最下面&#xff0c;而最后创建的&#xff08;Activity&#xff09;则处于栈的最上面。从Task中取出&#xff08;Activity&#xff09;是从最顶端取…

冯诺依曼体系、操作系统、进程(PCB,getpid(),fork)

首先&#xff0c;简画下各进程间关系&#xff1a; 一&#xff1a;冯诺依曼体系 硬件结构决定软件行为----数据信号流向&#xff0c;控制信号的流向。 当然对冯诺依曼体系的理解不能停留在概念上&#xff0c;需要深入对软件数据流的理解&#xff0c;接下里将会解释从我登上qq开…

LinearLayout 与RelativeLayout的区别

LinearLayout:是线性布局控件&#xff0c;它包含的子控件以横向或纵向的方式排列&#xff0c;超过边界时&#xff0c;某些控件将缺失或消失。 RelativeLayout:是相对布局&#xff0c;允许子元素指定以相对于父元素或兄弟元素的位置&#xff0c;这是实际布局中最常用的方式之一…

x86机器码识别及其反汇编算法

x86机器码识别及其反汇编算法x86体系结构CPU的每条指令都可能由以下六个域组成&#xff0c;并且它们在指令中的排列顺序是不能改变的。这六个域分别是&#xff1a;prefixescodeModR/MSIBdisplacementimmediate在任何一条指令中code域是必须出现的&#xff0c;其他的域都是可选的…

进程优先级、环境变量、虚拟地址空间

一&#xff1a;进程优先级 cpu分配资源的先后顺序即为进程的优先级&#xff1b; 优先级高的进程有优先执行权利。配置进程优先级对多任务环境的linux很有用&#xff0c;可以改善系统性能&#xff1b; 可以把进程运行到指定的cpu上&#xff0c;把不重要的进程安排到某个CPU&…

改造PE中的函数为导出函数

改造PE中的函数为导出函数 1、前言&#xff1a;为什么要这么做 很多时候&#xff0c;我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx)&#xff0c;并且已经知道了这个函数的各个入口参数的类型和具体含义&#xff0c;我们想在其他的软件中使用这个函数。于…

如何控制控件的可见性

在xml布局文件中 android:visibility"visible" android:visibility"invisible" android:visibility"gone" 在代码中 view.setVisibility(View.VISIBLE); view.setVisibility(View.INVISIBLE);//view不可见&#xff0c;占用空间 view.setVisib…

Linux下根目录

在linux下我们一直使用很多命令&#xff0c;比如ls,cd,mkdir等等&#xff0c;那这些命令是在哪个目录里呢?我们可以先看看根目录&#xff0c;所有目录都挂在根目录下&#xff0c;有且只有一个根目录&#xff0c;所有东西都从根目录开始&#xff0c;如果在终端输入/home,其实是…