1 基本命令
1.1 awk命令
1.2 环境变量
export命令显示当前系统定义的所有环境变量
echo $PATH命令输出当前的PATH环境变量的值
使用export命令直接修改PATH的值
如:export PATH=$PATH:/home/uusama/mysql/bin
# env # 查看环境变量
echo 与 env的区别:
(1)查询指定环境变量
echo $PATH
(2)查看当前会话中预设的环境变量
env
(3)既查看当前会话中预设的环境变量,也想查看用户自定义的变量
set
1.3 系统命令
cat /etc/redhat-release # 系统版本
free –h #剩余内存使用情况 或 free -m
uname –a #系统位数
lscpu #cpu型号
dmidecode -s system-product-name #虚拟机物理机判断
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况 ,磁盘使用情况 du -h --max-depth=1
# du -sh <目录名> # 查看指定目录的大小
iotop -P #查看各个进程IO使用
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息
iostat -d -k 2 #显示磁盘的使用情况
ps -eo pid,tty,user,comm,lstart,etime | grep 进程名 #查看进程启动的时间和运行时间
1.4 文件目录查找
方一:
grep –rn 名称 路径
grep -rn test12 /opt/
方二:
find 路径 -name 名称
1.5 查询库文件位置 whereis
whereis libcrypto.so.10
1.6 查看库文件中是否某个函数
nm test.so | grep main
1.7 查看目录结构
tree -L 3
1.8 查看文件类型
file 文件名
三种类型
1.9 解压压缩命令
(1)tar.gz 格式
tar在Linux上是常用的打包、压缩、加压缩工具
参数:
-c :create 建立压缩档案的参数;
-x : 解压缩压缩档案的参数;
-z : 是否需要用gzip压缩,--gzip, --gunzip, --ungzip 通过 gzip 过滤归档
-v: 压缩的过程中显示档案;
-f: 置顶文档名,在f后面立即接文件名,不能再加参数
-J:--xz 通过 xz 过滤归档
-C, --directory=DIR 改变至目录 DIR
解压:tar zxvf /source/test.tar.gz -C /source/ test2
压缩:tar -zcvf /home/sw/test.tar.gz /home/sw/test
(2)gz格式
gunzip test.gz
(3)解压 zip文件
unzip xxx.zip
1.20 sed命令
linux系统中sed 是一种在线编辑器,它一次处理一行内容。
2 问题定位调试命令
2.1 GDB调试命令
GDB(GNU Debugger)是GCC的调试工具。
2.1.1 编译源程序
调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数
-
gcc -g hello.c -o hello
-
g++ -g hello.cpp -o hello
2.1.2 启动GDB方法
1、gdb program
program 也就是你的执行文件,一般在当前目录下。
2、gdb program core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb program pid
或 切到正在运行的进程
gdb -p `pidof 进程名`
2.1.3 常用命令
(1)启动程序:run
r
(2)设置断点:b 行号|函数名
根据行号设置断点
break test.c:23 if b==0 #当在b等于0时,程序将会在第23行断
tbreak test.c:10 #在第10行设置临时断点
根据函数名设置断点
reak filename:function
在源文件filename的function函数的入口处停住
break class::function或function(type,type)
在类class的function函数的入口处停住
break namespace::class::function
在名称空间为namespace的类class的function函数的入口处停住
(3) 删除断点:delete 断点编号
delete [breakpoints num] [range...]
delete #删除所有断点
delete 5 #删除第5个断点
delete 1-10
clear #删除当前行所有breakpoints
clear function #删除函数名为function处的断点
(4) 禁用断点:disable 断点编号
disable #禁用所有断点
disable bnum #禁用标号为bnum的断点
(5) 启用断点:enable 断点编号
enable #启用所有断点
enable bnum #启用标号为bnum的断点
enable delete bnum #启动标号为bnum的断点,并且在此之后删除该断点
(6)查看信息
info break 或info b 查看断点 info thread,info break,info reg等
(7)单步跟踪:next (简写 n)
(8)单步跟踪:step (简写 s)
(9)打印变量:print 变量名字 (简写p)
(gdb) p num <--输出 num 的值
$1 = 3
(gdb) p num=4 <-- 修改 num 的值为 4
$2 = 4
(10)设置变量:set var=value
(11)查看变量类型:ptype var
(12)顺序执行到结束:cont
(13) 顺序执行到某一行: util lineno
(14)打印堆栈信息:bt
backtrace n
bt n
n是一个正整数,表示只打印栈顶上n层的栈信息。
where
和 bt
是完全同义词并产生完全相同的输出。
bt full 相比bt能显示更详细的局部变量信息。
backtrace 命令用于打印当前调试环境中所有栈帧的信息
参数:
- n:一个整数值,当为正整数时,表示打印最里层的 n 个栈帧的信息;n 为负整数时,那么表示打印最外层 n 个栈帧的信息;
- -full:打印栈帧信息的同时,打印出局部变量的值。
(15)退出调试:quit(简写 q)
(16)显示源程序代码的内容,包括各行代码所在的行号:list(简写 l)
显示源代码
(gdb)list linenum
Print lines centered around line number linenum in the current source file.
(gdb)list function #显示函数名为function的函数的源程序
(17) 查看栈某一层的详细信息
frame n
frame 8 or f8 查看第8层栈帧的函数调用,包括其中的局部变量
C++ 程序而言,异常往往出现在某个函数体内,例如 main() 主函数、调用的系统库函数或者自定义的函数等。要知道,程序中每个被调用的函数在执行时,都会生成一些必要的信息,包括:
- 函数调用发生在程序中的具体位置;
- 调用函数时的参数;
- 函数体内部各局部变量的值等等。
这些信息会集中存储在一块称为“栈帧”的内存空间中。也就是说,程序执行时调用了多少个函数,就会相应产生多少个栈帧,其中每个栈帧自函数调用时生成,函数调用结束后自动销毁。
main() 主函数对应的栈帧,又称为初始帧或者最外层的帧。每当程序中多调用一个函数,执行过程中就会生成一个新的栈帧。更甚者,如果该函数是一个递归函数,则会生成多个栈帧。
当前正被调用函数对应的栈帧的编号为 0,调用它的函数对应栈帧的编号为 1,以此类推。
(gdb) info frame
- 当前栈帧的编号,以及栈帧的地址;
- 当前栈帧对应函数的存储地址,以及该函数被调用时的代码存储的地址
- 当前函数的调用者,对应的栈帧的地址;
- 编写此栈帧所用的编程语言;
- 函数参数的存储地址以及值;
- 函数中局部变量的存储地址;
- 栈帧中存储的寄存器变量,例如指令寄存器(64位环境中用 rip 表示,32为环境中用 eip 表示)、堆栈基指针寄存器(64位环境用 rbp 表示,32位环境用 ebp 表示)等。)
(18)线程
thread apply all bt #打印所有线程堆栈
info thread #显示当前可调试的所有线程
thread pid #切换当前调试的线程为指定ID的线程
综合应用:
#include <stdio.h>
int func(int num){if(num==1){return 1;}else{return num*func(num-1);}
}
int main ()
{int n = 5;int result = func(n);printf("%d! = %d",n,result);return 0;
}
(1)设置断点,并运行,打印变量值:
(gdb) b 3 #设置断点
Breakpoint 1 at 0x4004cf: file main.c, line 3.
(gdb) r
Starting program: ~/demo/main.exe
Breakpoint 1, func (num=5) at main.c:3
3 if(num==1){
(gdb) c
Continuing.
Breakpoint 1, func (num=4) at main.c:3
3 if(num==1){
(gdb) p num #打印变量值
$1 = 4
(2)backtrace查看栈信息
(gdb) backtrace <-- 打印所有的栈帧信息
#0 func (num=4) at main.c:3
#1 0x00000000004004e9 in func (num=5) at main.c:6
#2 0x0000000000400508 in main () at main.c:12
(gdb) info frame <-- 打印当前栈帧的详细信息
Stack level 0, frame at 0x7fffffffe240: <-- 栈帧编号 0,地址 0x7fffffffe240
rip = 0x4004cf in func (main.c:3); saved rip 0x4004e9 <-- 函数的存储地址 0x4004cf,调用它的函数地址为 0x4004e9
called by frame at 0x7fffffffe260 <-- 当前栈帧的上一级栈帧(编号 1 的栈帧)的地址为 0x7fffffffe260
source language c.
Arglist at 0x7fffffffe230, args: num=4 <-- 函数参数的地址和值
Locals at 0x7fffffffe230, Previous frame's sp is 0x7fffffffe240 <--函数内部局部变量的存储地址
Saved registers: <-- 栈帧内部存储的寄存器
rbp at 0x7fffffffe230, rip at 0x7fffffffe238
(3)frame查看
(gdb) info args <-- 打印当前函数参数的值
num = 4
(gdb) info locals <-- 打印当前函数内部局部变量的信息(这里没有)
No locals.
(gdb) up <-- 查看编号为 1 的栈帧
#1 0x00000000004004e9 in func (num=5) at main.c:6
6 return num*func(num-1);
(gdb) frame 1 <-- 当编号为 1 的栈帧作为当前栈帧
#1 0x00000000004004e9 in func (num=5) at main.c:6
6 return num*func(num-1);
(gdb) info frame <-- 打印 1 号栈帧的详细信息
Stack level 1, frame at 0x7fffffffe260:
rip = 0x4004e9 in func (main.c:6); saved rip 0x400508
called by frame at 0x7fffffffe280, caller of frame at 0x7fffffffe240 <--上一级栈帧地址为 0x7fffffffe280,下一级栈帧地址为 0x7fffffffe240
source language c.
Arglist at 0x7fffffffe250, args: num=5
Locals at 0x7fffffffe250, Previous frame's sp is 0x7fffffffe260
Saved registers:
rbp at 0x7fffffffe250, rip at 0x7fffffffe258
(18)display命令
display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。
(gdb) display expr
(gdb) display/fmt expr
其中,expr 表示要查看的目标变量或表达式;参数 fmt 用于指定输出变量或表达式的格式
2.2 网络抓包
2.2.1 tcpdump
tcpdump -i eth0 # 抓包网卡
tcpdump src host 192.168.1.1 #按照源ip抓包
tcpdump dst host 192.168.1.1 #按照目的ip抓包
tcpdump -i any host 192.168.10.1 and port 8080 -w test.pcap -v
2.2.2 wireshark
(1)按照ip过滤
IP源地址:ip.src ==192.168.1.1
IP目的地址:ip.dst== 192.168.1.1
IP地址(包括源和目的):ip.addr== 192.168.1.1
(2)按照端口过滤
TCP端口:tcp.port==8080
TCP目的端口:tcp.dstport == 8080
TCP源端口:tcp.srcport == 8080
UDP端口:udp.port ==8080
(3)按照协议过滤
过滤协议:http , tcp , thrift,http
thrift contains "send" #过滤thrift中包含 "send"
(4)按照mac过滤
源MAC地址:eth.src==A0:00:00:C5:89:23
目的MAC地址:eth.dst==A56:10:00:94:g5:89
MAC地址(包括源和目的):eth.addr==A56:10:00:94:g5:89
2.3 coredump开启关闭
Linux coredump功能是当Linux下应用程序异常时,Linux内核默认的一种异常信号处理机制,内核会把异常信息与进程内存转储成coredump文件,程序员通过gdb工具可以离线分析应用程序异常时的情况。Core的意思是内存, Dump的意思是扔出来, 堆出来.
又称为“核心转储”,是该进程实际使用的物理内存的“快照”。分析core dump文件可以获取应用程序崩溃时的现场信息,如程序运行时的CPU寄存器值、堆栈指针、栈数据、函数调用栈等信息。
产生coredump的情况:
- 内存访问越界 (数组越界、字符串无\n结束符、字符串读写越界)
- 多线程程序中使用了线程不安全的函数,如不可重入函数
- 多线程读写的数据未加锁保护(临界区资源需要互斥访问)
- 非法指针(如空指针异常或者非法地址访问)
- 堆栈溢出
ulimit –c # 设置core 文件的最大值,单位为区块
ulimit -c unlimited # 开启coredump
core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号
ulimit –c 0 #关闭coredump
给
gcore pid (进程号)
命令:
gcore [-o filename] pid
gcore -o /xxx/xxx/filename pid
2.4 rpm包查询和安装
rpm -aq | grep expect #查看expect是否安装
#安装某个rpm包:
rpm -Uvh pcre-devel-8.32-15.el7_2.1.x86_64.rpm --nodeps –force
2.5 端口映射关系查看
iptables -t nat -L –n
2.6 ldd查看进程依赖的库路径库名
ldd 进程名
2.7 查看库依赖的库
readelf -d 库名.so
readelf -d 动态库文件
2.8 pstack查看进程栈信息
pstack是一个shell脚本,用于打印正在运行的进程的栈跟踪信息。获取进程ID,通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析多组数据就可以获得哪些线程里有慢操作影响了服务器的性能,从而得到解决方案
格式:pstack pid
如:查看bash程序进程栈
ps -fe| grep bash
pstack 7013
栈信息写入文本
pstack 7013 > pstack_test.txt
2.9 跟踪进程的系统调用
strace常用来跟踪进程执行时的系统调用和所接收的信号
strace –p ‘pidof 进程名’
2.10 ps显示进程状态和线程
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构
常用参数:
a:显示当前终端下的所有进程信息,包括其他用户的进程。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程。
-e:显示系统内的所有进程信息。
-l:使用长(long)格式显示进程信息。
-f:使用完整的(full)格式显示进程信息。
-T:查看进程下面的子线程
方一:top -p pid
方二:ps -aux | grep process_name
ps -elf | grep tomcat #结合管道操作和grep命令进行过滤,用于查询某一个进程的信息
ps -T -p pid #查看进程下面的子线程可以使用命令
2.12 nm命令查看文件中的符号信息
nm命令nm命令是Linux下自带的强大的文本分析工具,是命令来源于name的简写。该命令用来列出指定文件中的符号(如常用的函数名、变量等,以及这些符号存储的区域)。
file.o即为二进制文件,liba.a库文件,可执行程序等。
$ nm [options(s)] [file(s)]
2.13 pmap
确定系统是如何为服务器上的进程分配内存的.
pmap –d pid
Mapped : 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小
writeable/private: 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
shared: 表示进程和其他进程共享的内存大小
2.14 top命令
top -H -p `pidof 进程名` #查看某进程各个线程的使用情况
如分析哪个地方占用内存高
(1)top 和top -H -p `pidof 进程名` 找占用高的进程和线程
(2)pstack `pidof 进程名` 获取线程id和地址;
(3)使用gperftools工具分析;
2.15 lsof 命令
显示系统打开的文件
lsof -c 进程名 #查看某个进程打开的文件
lfof -p pid #某个PID对应的进程打开的文件
3 网络相关命令
3.1 netstat 命令
netstat 命令用于显示各种网络相关信息(显示网络状态)
netstat –antp(显示网络状态)
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息
3.2 防火墙
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
firewall-cmd --state #查看运行状态
firewall-cmd --list-all #查看规则
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
firewall-cmd --permanent --zone=public --list-ports
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
3.3 curl命令
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具。
# curl [option] [url]curl
http://www.1236545.com
3.4 测试端口联通 telnet
telnet ip地址+空格+端口号
4 数据库相关命令
4.1 sqlite3命令
(1) 打开某个数据库文件中
sqlite3 test.db
(2) 退出当前数据库系统
.quit
(3) 显示当前打开的数据库文的位置
.database
(4) 在当前的数据库文件中创建一张新表
create table people(NAME,SEX,AGE);
(5) 显示数据库中所有的表名
sqlite>.tables
(6) 查看表中表头的信息
.schema
(7) 自动按行展示
.mode line
(8)查询某个表
select * from table_test;
(9)查询某个表有什么字段
PRAGMA table_info([table_test]);
(10)给某个表增加属性
alter table table_test add column name Text ;
(11)修改表的属性
UPDATE table_test SET name=' xiaoming' WHERE name=' xiaohong';
过滤:
UPDATE table_test SET name=' xiaoming' WHERE name like ' xiao%';
5 服务器
5.1 虚拟机管理
virsh 是kvm一个管理工具包。
5.2 查看路由配置
(1) 查看路由配置
Windows :route print
Linux : route
(2) 查看网络
Windows: ipconfig
Linux :ifconfig
(3)windows添加路由
route add 路由地址 mask 子网掩码 网关地址 –p
删除路由
route delete 网络地址
参考文献:
【1】awk命令简介_divlee130的博客-CSDN博客_awk命令功能
【2】linux下nm命令的基本使用以及输出符号类型详解_小卷不卷0099的博客-CSDN博客_linux nm参数
【3】 C++ gdb调试_mumu_wangwei的博客-CSDN博客_c++ gdb
【4】GDB frame和backtrace命令:查看栈信息
【5】Linux 服务器故障排除的前五分钟 (First 5 Minutes Troubleshooting A Linux Server)_51CTO博客_linux服务器故障排查思路
【6】Linux系列之查看进程线程的方法_smileNicky的博客-CSDN博客_linux查看进程和线程