文章目录
1 基本命令
缩写含义
-e filename 如果filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
-r dictory 递归目录下的文件
-f dictory 不询问执行操作
参考链接:Linux:-e、-d、-f、-L、-r、-w、-x、-s、-h、
1.1 关机和重启
-h:停止服务并关机
-r:停止服务后重启
关机
shutdown -h now 立刻关机
shutdown -h 5 5分钟后关机
poweroff 立刻关机
重启
shutdown -r now 立刻重启
shutdown -r 5 5分钟后重启
reboot 立刻重启
1.2 帮助
--help命令
shutdown --help:
ifconfig --help:查看网卡信息
man命令(命令说明书)
man shutdown
注意:man shutdown打开命令说明书之后,使用按键q退出
1.3 查看资源占用情况
查看资源占用情况
ps(process status)
ps -au 占用的资源是从进程启动开始,计算的平均占用资源,比如cpu等,要杀死某个进程,可使用kill [pid]
top 实时占用的资源;
查看进程:
命令:ps -ef 查看所有正在运行的进程
ps -ef | grep nginx 查看nginx相关的进程,grep命令是查找
ps aux 是用标准格式显示进程
查看目录所占存储情况
du(disk usage)
du -lh 查看当前文件下各文件夹占用存储空间
du -sh 查看当前文件夹所占存储空间
du -h 目录路径 查看指定目录的存储情况
du --max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
du --max-depth=1 只查看当前目录下文件占用的存储空间
查看Linux 系统上的文件系统磁盘使用情况统计查看:df -h
查看CPU核:
cat /proc/cpuinfo
参考链接:【Linux】ps -ef|grep详解
1.4 SSH远程登录命令
SSH
1.ssh 192.168.1.100 默认利用当前宿主用户的用户名登录
2.ssh root@192.168.1.100 利用远程机的用户登录
3.ssh root@192.168.1.100 -o stricthostkeychecking=no 首次登陆免输yes登录
4.ssh root@192.168.1.100 "ls /home/root" 当前服务器A远程登录服务器B后执行某个命令
5.ssh root@192.168.1.100 -t "sh /home/root/ftl.sh" 当前服务器A远程登录服务器B后执行某个脚本
1.5 export
export命令用于设置或显示环境变量。
export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。
语法:
export [-fnp] [变量名称]=[变量设置值]
参数说明:
-f 代表[变量名称]为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
export MYENV //定义环境变量
export MYENV=7 //定义环境变量并赋值
export LD_LIBRARY_PATH = `pwb` // 程序运行依赖库的位置,通过此命令可以将 当前目录 追加到用户库文件路径。
export SIG_ADDR = 192.168.10.100 //定义当前信令地址
参考链接:Linux export命令
1.7 其他命令
查看历史使用命令:history
过滤与es相关命令:history | grep es
查看当前目录:pwd
查看机器间是否网络连通:ping 192.168.xx.xx
ping6 2408:80e3:c000:8::11
查看IP信息:ifconfig 或 ifconfig | more或ip addr
查看当前系统端口:
命令:netstat -an 查看全部端口
命令:netstat -an | grep 8080 搜索指定端口
结束进程:kill
命令:kill pid 或者 kill -9 pid(强制杀死进程)
pid:进程号
重启网络
命令:service network restart
清屏
命令:ctrl + l
查看linux版本:cat /etc/redhat-release
查看LINUX是多少位:getconf LONG_BIT
关闭防火墙
service iptables stop 临时关闭防火墙
chkconfig iptables off 防火墙开启不启动
service iptables status 查看防火墙状态
开机启动选项
msconfig 查看开机启动选项
chkconfig 查看开机启动服务列表
2 目录操作命令
2.1 目录切换 cd (change directory)
命令:cd 目录
cd / 切换到根目录
cd /usr 切换到根目录下的usr目录
cd ../ 切换到上一级目录 或者 cd ..
cd ~ 切换到home目录
cd - 切换到上次访问的目录
2.2 目录查看 ls (list)
命令:ls [-al]
ls 查看当前目录下的所有目录和文件
ls -a 查看当前目录下的所有目录和文件(包括隐藏的文件)
ls -l 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls /dir 查看指定目录下的所有目录和文件 如:ls /usr
2.3 创建目录 mkdir (make)
命令:mkdir 目录
mkdir aaa 在当前目录下创建一个名为aaa的目录
mkdir /usr/aaa 在指定目录下创建一个名为aaa的目录
2.4 删除目录或文件 rm(remove)
命令:rm [-rf] 目录
删除文件:
rm 文件 删除当前目录下的文件
rm -f 文件 删除当前目录的的文件(不询问)
删除目录:
rm -r aaa 递归删除当前目录下的aaa目录
rm -rf aaa 递归删除当前目录下的aaa目录(不询问)
全部删除:
rm -rf * 将当前目录下的所有目录和文件全部删除
rm -rf /* 【自杀命令!慎用!慎用!慎用!】将根目录下的所有文件全部删除
注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了方便大家的记忆,无论删除任何目录或文件,都直接使用 rm -rf 目录/文件/压缩包
2.5 目录修改 mv和cp (move、copy)
一、重命名目录
命令:mv 当前目录 新目录
例如:mv aaa bbb 将目录aaa改为bbb
注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行重命名的操作
二、剪切目录
命令:mv 目录名称 目录的新位置
示例:将/usr/tmp目录下的aaa目录剪切到 /usr目录下面 mv /usr/tmp/aaa /usr
注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作
三、拷贝目录
命令:cp -r 目录名称 目录拷贝的目标位置 -r代表递归
示例:将/usr/tmp目录下的aaa目录复制到 /usr目录下面 cp /usr/tmp/aaa /usr
1. 将/data/a目录下的aaa目录复制到/user目录下
cp -r /data/a/aaa /user
2. 将/data/a目录下的aaa.txt目录复制到/user目录下
cp -r /data/a/aaa.txt /user
3. 将/data/a目录下的aaa.txt目录备份到/data/a目录下面bbb.txt
cp -r /data/a/aaa.txt /data/a/bbb.txt
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不用写-r递归
2.6 搜索目录【查】find
命令:find 目录 参数 文件名称
示例:
which ls 查找可执行的命令
find /usr/tmp -name ‘a*’ 查找/usr/tmp目录下的所有以a开头的目录或文件
find -name ‘a*’ 查找当前目录下所有以a开头的目录或文件
find / -name “zwh*” -ls 从某个文件夹开始查找
3 文件操作命令
3.1 新建文件touch
命令:touch 文件名
示例:在当前目录创建一个名为aa.txt的文件 touch aa.txt
3.2 删除文件 rm
命令:rm -rf 文件名
3.3 修改文件 vi或vim
【vi编辑器的3种模式】
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
-
命令行模式command mode)
控制屏幕光标的移动,字符、字或行的删除,查找,移动复制某区段及进入Insert mode下,或者到 last line mode。
命令行模式下的常用命令:
【1】控制光标移动:↑,↓,j
【2】删除当前行:dd
【3】查找:/字符
【4】进入编辑模式:i o a
【5】进入底行模式:: -
编辑模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
编辑模式下常用命令:
【1】ESC 退出编辑模式到命令行模式;
【2】编辑文件,使用vi编辑器打开文件后点击按键:i ,a或者o即可进入编辑模式。 -
底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
底行模式下常用命令:
【1】退出编辑: :q
【2】强制退出: :q!
【3】保存并退出: :wq
打开文件
命令:vi 文件名
示例:打开当前目录下的aa.txt文件 vi aa.txt 或者 vim aa.txt
注意:使用vi编辑器打开文件后,并不能编辑,因为此时处于命令模式,点击键盘i/a/o进入编辑模式。
编辑文件
使用vi编辑器打开文件后点击按键:i ,a或者o即可进入编辑模式。
i:在光标所在字符前开始插入
a:在光标所在字符后开始插入
o:在光标所在行的下面另起一新行插入
保存或者取消编辑
保存文件:
第一步:ESC 进入命令行模式
第二步::
进入底行模式
第三步:wq 保存并退出编辑
wq! 强制保存并退出
取消编辑:
第一步:ESC 进入命令行模式
第二步:: 进入底行模式
第三步:q! 撤销本次修改并退出编辑
q 如果内容修改会提示是否保存
vi模式下快捷键
esc后:
保存并退出快捷键:shift+z+z
光标跳到最后一行快捷键:shift+g
删除一行:dd
复制一行内容:y+y
粘贴复制的内容:p
3.4 文件的查看【查】
文件的查看命令:cat/more/less/tail
cat:看最后一屏
示例:使用cat查看/etc/sudo.conf文件,只能显示最后一屏内容
cat sudo.conf
cat /data/aaa.txt
more:百分比显示
示例:使用more查看/etc/sudo.conf文件,可以显示百分比,回车可以向下一行,空格可以向下一页,q可以退出查看
more sudo.conf
less:翻页查看
示例:使用less查看/etc/sudo.conf文件,可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
less sudo.conf
tail:指定行数或者动态查看(实时查看日志)
示例:Ctrl+C结束
tail -10 sudo.conf 使用tail -10 查看/etc/sudo.conf文件的后10行
tail -f /data/aa.log 查看aa.log的后10行内容
tail -n 7 /data/aa.log 查看aa.log的后7行内容
head /data/aa.log 查看aa.log的前10行内容
head -n 7 /data/aa.log 查看aa.log的前7行内容
3.5 权限修改chmod(change mode)
rwx:r代表可读,w代表可写,x代表该文件是一个可执行文件,如果rwx任意位置变为-则代表不可读或不可写或不可执行文件。
示例:给aaa.txt文件权限改为不可执行文件权限,aaa.txt文件的权限是-rw-------
第一位:-就代表是文件,d代表是文件夹
第一段(3位):代表拥有者的权限
第二段(3位):代表拥有者所在的组,组员的权限
第三段(最后3位):代表的是其他用户的权限
421 421 421
- rw- --- ---
代表拥有者可读可写,不可执行,组员和其他用户没有任何权限
chmod -rw-r--r-- test.txt
前三位代表当前用户对文件权限:可以读/可以写/不能执行
中间三位代表当前组的其他用户对当前文件的操作权限:可以读/不能写/不能执行
后三位其他用户对当前文件权限:可以读/不能写/不能执行
修改文件权限
命令:chmod 777 /home/dd 把目录的权限修改为777。
chmod [who] [+|-|=] [mode] 文件名
who可以是: u、g、o、a(all)。
操作符号可以是:
+ 添加某个权限
- 取消某个权限
= 赋予某个权限并取消其他所有权限
mode可以是所有权限的组合:
r 可读
w 可写
x 可执行
t 保存程序的文本到交换设备上
u 和文件属主拥有一样的权限
o 和其他用户拥有一样的权限
3.6 终止当前操作
ctrl+c和ctrl+z都是中断命令,作用不一样。
ctrl+z是将任务中断,在进程中维持挂起的状态,可使用fg/bg操作前台和后台的任务,bg把被中断的任务放到后台执行,fg重新启动被中断的任务。
4. 压缩文件操作
4.1 打包和压缩
Windows的压缩文件的扩展名 .zip/.rar
linux中的打包文件:aa.tar
linux中的压缩文件:bb.gz
linux中打包并压缩的文件:.tar.gz
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。
命令:tar -zcvf 打包压缩后的文件名 要打包的文件
其中:
-z:调用gzip压缩命令进行压缩
-c:建立新的压缩文件
-v:显示操作过程
-f:指定压缩文件名
示例:打包并压缩/usr/tmp 下的所有文件 压缩后的压缩包指定名称为xxx.tar
tar -zcvf ab.tar aa.txt bb.txt 或:tar -zcvf ab.tar *
另一种压缩(zip/unzip)
- zip a.zip 1.txt 将1.txt压缩到a.zip
- zip -r a.zip a/ 将目录进行压缩
- zip -r a.zip 1.txt 2.txt 将多个文件压缩为zip文件
4.2 解压
命令:tar [-zxvf] 压缩文件
其中:
-x:代表解压
-z:支持gzip解压文件
-f:指定压缩文件
示例:将/usr/tmp 下的ab.tar解压到当前目录下
tar -zxvf ab.tar
示例:将/usr/tmp 下的ab.tar解压到根目录/usr下
tar -xvf ab.tar -C /usr------C代表指定解压的位置
tar -zxvf ab.tar -C /user/
unzip a.zip 解压
unzip -d /data/a.zip 将a.zip解压到指定/data/app/目录下
4.3 常见包的解压与压缩
.tar文件
解包:tar zvxf FileName.tar
打包:tar cvzf FileName.tar DirName
(注:tar是打包,不是压缩)
.gz文件
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz文件
解压:tar zvxf FileName.tar.gz
压缩:tar cvzf FileName.tar.gz DirName
.bz2文件
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩:bzip2 -z FileName
.tar.bz2文件
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 Dirname
.zip文件
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar文件
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
4.4 scp命令
(1) 从远处复制文件到本地目录
scp 文件名 @root/ip:路径
scp wutbio002@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
【说明:从192.168.120.204机器上的/opt/soft/的目录中下载nginx-0.5.38.tar.gz 文件到本地/opt/soft/ 目录中】
(2)上传本地文件到远程机器指定目录
scp 文件名 root@ip:/路径
scp /opt/soft/nginx-0.5.38.tar.gz wutbio002@192.168.120.204:/opt/soft/scptest
【说明:复制本地opt/soft/目录下的文件nginx-0.5.38.tar.gz 到远程机器192.168.120.204的opt/soft/scptest 目录中】
参考链接:Linux中的tar命令和scp命令
5 查找命令
5.1 grep
grep命令是一种强大的文本搜索工具
使用实例:
grep abc test.txt 在test.txt中搜索abc字符串,大小写敏感且显示行号
grep -n abc test.txt 在test.txt文件中搜索abc字符串,大小写敏感且显示行及行号;
grep -v abc test.txt 在test.txt文件中搜索abc字符串,大小写敏感且显示没搜索到的行;
grep -i abc test.txt 在test.txt文件中搜索abc字符串,大小写敏感且显示行;
grep -ni abc test.txt 在test.txt文件中搜索abc字符串,大小写敏感且显示行及行号;
ps -ef | grep sshd 查找指定ssh服务进程
ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp本身
ps -ef | grep sshd -c 查找指定进程个数
5.2 find
find命令在目录结构中搜索文件,并对搜索结果执行指定的操作。
find 默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
find . -name "*.log" -ls 在当前目录查找以.log结尾的文件,并显示详细信息。
find /root/ -perm 600 查找/root/目录下权限为600的文件
find . -type f -name "*.log" 查找当目录,以.log结尾的普通文件
find . -type d | sort 查找当前所有目录并排序
find . -size +100M 查找当前目录大于100M的文件
5.3 locate
locate 让使用者可以很快速的搜寻某个路径。默认每天自动更新一次,所以使用locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。如果数据库中没有查询的数据,则会报出locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory该错误!updatedb即可!
yum -y install mlocate 如果是精简版CentOS系统需要安装locate命令
updatedb
locate /etc/sh 搜索etc目录下所有以sh开头的文件
locate pwd 查找和pwd相关的所有文件
5.4 whereis
whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。
使用实例:
whereis ls 将和ls文件相关的文件都查找出来
5.5 which
which命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
使用实例:
which pwd 查找pwd命令所在路径
which java 查找path中java的路径
6 su(switch user)、sudo(super user do)
Ubuntu刚安装后,不能在terminal运行su命令,因为root没有默认密码,需要手动设定。
6.1 给root用户设置密码
sudo passwd root
回车会让输入密码
这样密码就设置好了。
6.2 su和sudo的区别
- su的密码是root的密码,而sudo是用户的密码
- su直接将身份变成root,而sudo是以用户登录之后以root的身份运行命令,不需要知道root密码。
6.3 su 切换登录用户
su用于用户之间的切换。但是切换前的用户依然保持登录状态。如果是root 向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证。
su test:切换到test用户,但是路径还是/root目录
su - test : 切换到test用户,路径变成了/home/test
su : 切换到root用户,但是路径还是原来的路径
su - : 切换到root用户,并且路径是/root
exit: 退出返回之前的用户
su不足:如果某个用户需要使用root权限、则必须要把root密码告诉此用户。
退出返回之前的用户:exit
6.4 sudo 权限赋予
sudo是为所有想使用root权限的普通用户设计的。可以让普通用户具有临时使用root权限的权利。只需输入自己账户的密码即可。
进入sudo配置文件命令:
vi /etc/sudoer或者visudo
案例:
允许hadoop用户以root身份执行各种应用命令,需要输入hadoop用户的密码。
hadoop ALL=(ALL) ALL
案例:
只允许hadoop用户以root身份执行ls 、cat命令,并且执行时候免输入密码。
配置文件中:
hadoop ALL=NOPASSWD: /bin/ls, /bin/cat
6.5 用户及权限操作命令
创建用户
useradd 或adduser
useradd [参数] 用户名
修改密码:
passwd 参数 用户名
删除用户
userdel 参数 用户名
参考链接:Linux常用操作命令大全
7 代码运行
7.1 查看是否安装gcc
gcc -v
如果显示gcc没有找到,则是没有gcc。
7.2 安装gcc
sudo apt install gcc
或apt-get install gcc
出现了这种错误
将网络连接模式修改为桥连模式,然后 sudo apt-get update,然后又出现这种错误
查看网络连接,如果网络显示小问号,把网络关闭再重新开启。
命令行
重启网络命令:service networking restart
重启网卡命令:ifconfig eth0 up
然后执行 sudo apt install gcc
折腾了好久,哭了-_-
7.3 gcc基础操作
GCC编译分为四步:1. 预处理,2.预编译,3.编译,4.链接
-
预处理:gcc -E可对原文件进行预处理并输出.i文件。
gcc -E hello.c -o hello.i
-
预编译:gcc -S 对源文件进行汇编输出.s文件,,可通过ls查看
gcc -S hello.i
-
编译:输入gcc -c就可对源文件进行汇编并输出.o文件
gcc -c hello.s -o hello.o
-
gcc hello.o -o hello 对原文件进行链接并生成可执行文件,ls查看生成了绿色的可执行文件
上面四个步骤可通过一个命令直接执行。
gcc hello.c -o hello
最后执行文件
./ hello
7.4 make命令
make在linux中是一个非常重要的编译命令,利用make可以将大型的开发项目分解为多个更容易管理的模块。
有如下工程文件:
下面是makefile的内容:
为了编译整个工程,可以使用make或在make后面带上目标 all
再次查看目录内容,多了一些o文件和执行文件:
假设对test.c做了一些修改,重新make编译:
可以看到只有test.o重新编译了,现在清理所有目标文件和可执行文件,可使用 make clean,会将所有.o文件和执行文件删除。
8 gdb调试
8.1 简介
程序员在编译程序时发现的问题是语法或链接问题,能编译通过只能说明我们的程序在语法和链接时未产生错误,但不能说明我们程序就是完全正确的,因为程序的业务逻辑问题是在执行时才会发现的。而调试的目的就在于发现程序中的业务逻辑问题,一般使用IDE的可以直接使用自带的调试工具进行程序运行调试,那如果我们是在没有IDE的linux环境下又该如何对程序进行调试呢?最简单的方式就是调用打印函数(C语言中就是printf函数)进行程序语句运行的跟踪,找出问题所在,这种方式的缺点就是需要不停添加printf修改源码,重新编译运行,最后还得删除这些调试信息;gdb就是一个功能强大的调试工具。
调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。
当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。
在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。
设置断点(breakpoint)
break +offset / break -offset :在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum :在源文件filename的linenum行处停住。
break filename:function :在源文件filename的function函数的入口处停住。
break *address :在程序运行的内存地址处停住。
查看断点时,可使用info命令,如下所示:(注:n表示断点号)
info breakpoints [n]
info break [n]
设置观察点(watchpoint)
观察点一般来观察某个表达式(变量也是一种表达式)或内存的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch 变量名或内存的地址
watch i // 整型变量
watch p 或 watch *p //前者是查看*(&p),是p变量本身,后者是p指向内存的内容。
rwatch
awatch
info watchpoints :列出当前所设置了的所有观察点。
设置捕捉点(catchpoint)
维护停止点
上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。
clear : 清除所有的已定义的停止点。
delete [breakpoints] [range…] : 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。
disable [breakpoints] [range…] :disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.disalbe不会删除,就像回收站一样。
enable [breakpoints] [range…] :enable所指定的停止点,breakpoints为停止点号。
enable [breakpoints] once [range…] :enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。
enable [breakpoints] delete [range…] :enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。
停止条件维护
信号
线程
结构体
线程
8.3 gdb调试代码
-
启动gdb
使用vim编辑器编写一个简单的代码并保存vim hello.c
然后使用gcc将其编译为可执行文件,调试使用
-g
表示该程序可调试,代表添加DEBUG信息。gcc -g hello.c -o hello
接下来输入 gdb -q + 可执行文件,启动gdb调试。
gdb hello
或
gdb -q hello
-q可以屏蔽一些gdb版本相关的信息,页面看起来干净些。
-
启动源码
输入 list (简写为l) 即可查看程序源码:list:显示源码,默认显示10行 list 行号:显示当前文件以行号为中心的前后10行代码 list 函数名:显示函数名所在函数的代码 list:接着上次list命令,输出下边的内容
进入TUI模式也可以查看源码。
gdb --tui ./hello --tui告诉gdb启动终端界面模式。
或gdb hello之后,执行tui enable,或组合键ctrl+x+a
退出tui,组合键ctrl+x+a 或者命令行 tui disable
-
运行程序
run (r) 直到遇到“断点”或者“结束”。
start
开始执行程序,程序会从main函数开始,停在第一个断点的位置。
-
设置断点
输入break (b) + 数字就可对程序进行断点操作,数字是设置断点的代码行数。
b pkt.c:22 在pkt.c文件的22行打断点
b func 在函数func入口打断点
输入info breakpoint(info b) 即可查看断点信息。
Num: 断点编号
Disp:断点执行一次之后是否有效(keep:有效 dis:无效)
Enb: 当前断点是否有效 (y:有效 n:无效)
Address:内存地址
What:位置
运行一下 r
-
单步执行
next (n):单步执行程序,但是遇到函数时会直接跳过函数,不进入函数 n num:向后执行num步 step (s):单步执行程序,但遇到函数会进入函数 continue (c):继续执行程序,直到遇到断点或结束
-
查看变量
print 变量:查看变量值 print ++i:将i中的值加1显示 print gdb(22):将22作为参数调用gdb()函数 whatis 变量:查看变量数据类型 ptype var 显示var类型结构体的成员 what 表达式:设置一个监视点,一旦监视点的值改变,gdb将强行终止正在被调试的程序。 display 变量:每次程序暂停会自动显示变量的值,如果跟多个变量名,需要类型相同。 info display:可查看已经设置的自动显示的变量信息。 undisplay 编号:取消自动变量的显示。 bt 显示当前函数的调用过程
打印变量显示格式
p temp;默认十进制打印
p /x temp;按十六进制打印
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
参考链接:gdb attach使用
- 修改变量的值
print 变量名=值 可以给变量赋值,查看变量值不同时的结果
p x=2 //给变量x赋值2
p test->x = 30 //给结构体的成员赋值
p node.ID=100 // 给类对象赋值
-
退出
输入q即可退出gdb -
断点设置
-
运行命令
-
运行信息
info function:查询函数
where/bt:当前运行的堆栈列表
bt (backtrace): 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数:指定运行时的参数
show args:查看设置好的参数
info program: 来查看程序的是否在运行,进程号,被暂停的原因。
info proc 显示当前程序可执行文件相关信息
info frame 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句
info args 打印出当前函数的参数名及其值。
info locals 打印出当前函数中所有局部变量及其值。
info function: 查询函数
info catch 打印出当前的函数中的异常处理信息
查看当前main局部变量的值,可以使用frame(f)命令查看main的栈帧,然后选择一号栈帧,查看局部变量。
修改某个变量的初值:set var sum=0 -
使用gdb内嵌函数
在使用p
命令时,可以直接使用gdb内嵌的一些函数,也可以使用常用表达式。
p sizeof(int) //4
p 12==12 // true
- 查看结构体、类的值
结构体成员较多,一个一个查看不方便,p *new_node
可以显示整个结构体的信息。
不显示空字符:
set print null-stop
show print null-stop
再次执行时不显示空字符
但结构体成员显示杂乱无章,可以
set print pretty
show print pretty
- 查看数组的值
同样数组显示也不美观。可以使用set print array on
,查看更方便。
查看数组长度:p *array@len @左边是第一个内存的地址的值,@右边是想查看内存的长度。
- 查看内存
使用x
命令查看各个变量的内存信息
x /选项 地址
x /x 以十六进制输出
x /d 以十进制输出
x /c 以单字符输出
x /i 反汇编 – 通常,我们会使用 x/10i ip−20来查看当前的汇编(ip是指令寄存器)
x /s 以字符串输出
定义了字符串类型、int变量和结构体,在test_memory()处设置断点,断点命中后,查看变量的内存信息
字符串类型:
x str
默认十六进制 或 x /s str
会直接显示字符串的内容。
int型:
int型不是指针,所以首先要找到它的地址。使用p &number
查看地址,再使用地址查看内存,也可以直接使用x &number
查看内存
查看结构体在内存中是如何存储的,x /16s node
node在内存中的存储顺序与结构体中声明成员的顺序一致。
- call 调试函数
gdb设置参数
set args 可指定运行时的参数
show args 查看设置好的运行参数
- 分割窗口
layout :分割窗口,一边看代码,一边调试。
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口
参考链接:
查看结构体、类的值
gdb 笔记(07)— 自动显示变量值、显示源代码、监视变量或内存、查看内存
8.4 多线程调试
查看线程:
shell命令:
(1)查看当前正在运行的进程:ps aux | grep [要查询的进程]
(2)查看进程id:ps
gdb命令:
(1) 调试正在运行的程序 :gdb attach pid
(2)查看可切换调试的线程:info threads,每next两步都可以查看一下,可能会新增或减少线程;
(3)切换调试的线程:thread 线程id,可通过info threads 查看,*标记的为当前所在的线程。
(4)只运行当前线程: set scheduler-locking on
在切换到要调试的线程后可运行此命令只执行当前线程。
(5)运行全部线程:set sheduler-locking off
不只运行单个线程时可执行此命令,执行所有线程。
(6) 指定某线程执行某gdb命令:thread apply 线程id gdb_cmd
thread apply 2 n
让子线程2执行gdb命令next
(7) 全部线程执行某gdb命令:thread apply all gdb_cmd
参考链接:GDB多线程调试(调试命令+调试演示)
8.5 多进程调试
gdb命令:
(1) 调试父进程:set follow-fork-mode parent(缺省值,默认)
(2)调试子进程:set follow-fork-mode child
(3)设置调试模式:set detach-on-fork [on|off] (缺省值on)
on:调试当前进程的时候,其他进程继续运行
off:调试当前进程的时候,其他进程被gdb挂起
(4) 查看可调试的进程: info inferiors
(5)切换调试的进程:inferior 进程id
通过命令查看main进程(pid),ps -aux | grep main
,启动gdb attach pid 即可调试正在运行的程序,也可以执行gdb main pid
,与gdb attach pid相同。
参考链接:GDB多进程调试(调试命令+调试演示)
8.6 常用命令
8.7 实例
参考连接:GDB调试操作
Linux下gdb调试工具的使用
Linux下gdb调试
Linux下的GDB调试工具
9. apt指令
9.1 简介
apt是Advanced Package Tool的简写,是linux软件管理包。
apt整合了apt-get和apt-cache——这两个命令功能很多但一般往往用不到,因此apt保留了常用和重要的功能。
一些apt命令需要对/etc/apt, /etc/cache, /var/cache/apt, /var/lib/apt进行读写操作,这些命令需要sudo权限。
而对于下载包、显示包信息、检索包等,则无需sudo权限。
9.2 需要sudo权限的命令
更新软件包索引 sudo apt update
升级所有可更新的包 sudo apt upgrade
升级单个程序包 sudo apt upgrade package_name
安装软件包 sudo apt install package_name
可以安装多个包 sudo apt install package1 package2
可以安装已经下载好的deb包 sudo apt install /path_to_deb/file.deb/
移除软件包sudo apt remove package_name
使用remove会保留配置文件,使用purge可以完全移除软件包:sudo apt purge package_name
9.3 无需sudo权限的命令
下载软件包 apt download package_name
显示可用软件包 sudo apt list
查看某个包是否可用:使用grep命令 sudo apt list | grep package_name
查看已安装包 apt list --installed
搜索包 apt search package_name
查看包信息apt show package_name
10. apt-get指令
apt-get是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。常用格式为apt-get [选项] 命令
运用apt-get进行本地数据库更新,使用命令:sudo apt-get update
查看依赖关系,依赖关系即A软件依赖于B软件,使用命令:sudo apt-get check
软件安装,使用指令:sudo apt-get install software-name
软件更新,使用指令:sudo apt-get upgrade ipmitool
软件卸载,使用指令:sudo apt-get remove ipmitool
参考链接:Linux apt下载指令
11. 通信中使用
灌包命令ipef
下行灌包: 目标地址 + 本地地址
iperf -u –c 192.168.116.5 –t 300 -i 1 –b 300m –B 10.10.2.12
上行灌包: 目标地址 + 本地地址
iperf -u –c 192.169.0.67 –t 300 -i 1 –b 15m –B 192.168.116.5
接收:
iperf -s -u -i 1
192.168.116.5 ----- UE_IP地址
10.10.2.12 -------DN地址
-c 表示客户端
-s 表示服务器
-u udp通信
-I 每次发包时间间隔
-t 每次测试一共多少s
-b 传输包的速率,单位bps
-B 表示绑定的IP或端口。
-p 端口号
抓包
tcpdump –i 网口 –w BBU_LOG.pcap
查看该网口的抓包,抓包log会放在当前目录的BBU_LOG.pcap文件中。
添加路由
route -n 查看路由
route add –net ip地址 netmask 掩码 dev 网口 如果没有路由,需要添加路由
查看接口处流量
sar –n DEV 1 2 | grep enp61s0f1 每隔1秒,写入两次
-n 查看流量
-r 查看内存利用率
-p CPU利用率