测试工具
Linux三剑客
grep
用法:grep [OPTION...] PATTERN [FILE...]
选项:
- -b:每一行打印字符偏移量
- -c:统计符合要求的行数
- -E:使用egrep
- -f:从文件中取匹配模板
- -F:不使用正则快速搜索
- -h:不显示文件名
- -H:显式
- -i:忽略大小写
- -l:仅列出符合要求的文件,不列出具体行
- -L:与-l相反
- -n:显示符合要求的行及行号
- -p:silence模式
- -v:取反
- -r:遍历子目录
- -s:no-message
- -w:匹配完整的词
- -x:匹配完整的行
- -An:
- -Bn:
- -Cn:
- 正则规则:
[]
:表示集合中的内容,如[abc]
匹配a
或b
或c
。[^]
:取反[a-z]
:小写字母[A-Z]
:大写字母[0-9]
:数字
^
和$
:表示行首和行位,^$
表示空行*
:通配符,表示多个重复.
:单个。.*
表示0个或多个{n, m}
:个数范围,n个到m个之间,需要用/
转义,egrep下不需要转义egrep
:+
:类似.
,1个或多个?
:表示0个或多个|
:表示关系,如'ab|cd|def'
表示ab
、cd
或def
的串()
:将部分内容合成单元
sed
用法:sed [OPTION]... [SCRIPTorCOMMAND] [FILE]...
选项:
- -e:执行多条命令
- -f:引导sed脚本
- -i:直接修改文件
- -n:silent,搭配s替换p可以打印修改过的行
- -h:帮助
- -V:版本信息
- action:
a
:后插,sed '/text/a\newline'
ORsed '/text/a newline'
c
:取代,sed '3,4c\replaceline'
d
:删除,sed '2,4d'
ORsed '/text/'d
g
:获取缓冲区内容替换文本G
:获取缓冲区内容追加文本h
:拷贝文本到缓冲区H
:追加文本到缓冲区,保持和获取:sed -e '/text/h' -e '$G' file
i
:前插,sed '/text/i\newthing'
l
:列表不打印字符清单n
:读取下一个命令,用新命令处理新行p
:打印,sed '1p;3,4p'
q
:打印到第n行退出r
:从file读内容,sed '/text/r file'
s
:取代(正则)^
、$
、.
、*
、[]
、[^]
(..)
:匹配子串,保存字符如s/(love)able/\1rs
:loveable
->lovers
&
:拼接,s/love/sb&
->love
->sblove
<
:匹配单词开始,如/<love/
表示love开头的单词的行>
:匹配单词结束,如/love>/
x{m}
:重复x有m次,/0{5}
x{m,}
:重复x至少m次x{m, n}
:重复x至少m到n次
t
:if分支g
:全面替换w
:把行写入file,sed '/text/w file'
x
:y
:把字符翻译为另外的字符,不做正则!
:后续命令作用于没有选中的行#
:注释扩展到下个换行符前
awk
用法:
awk [-F SEPSTRING] [-v ASSIGNMENT]... program [ARGUMENT...]
awk [-F SEPSTRING] -f PROFILE [-f]... [-v ASSIGNMENT]... [ARGUMENT...]
选项:
- -F fs:指定文件分隔符,fs是字符串或正则,如
-F:
- -v var=value:定义变量
- -f scripfile:从脚本中读取awk
- -W:
compact
ortraditional
:兼容模式运行awk,gawk将同awk,忽略扩展copyleft
orcopyright
:版权信息help
orusage
:选项简短说明lint
orlint-old
:向传统unix移植结构警告posix
:兼容模式不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替^和^=;fflush无效re-interval
:允许间隔正则使用,POSIX字符类,括号表达式[[:alpha:]]source PROG
:使用PROG作为源码,可搭配-f
环境变量
变量 描述 $n 记录的第n个字段,由FS分隔 $0 完整的输入记录 ARGC 命令行参数数量 ARGIND 命令行中当前文件位置 ARGV 命令行参数数组 CONVFMT 数字转换格式(%.6g) ENVIRON 环境变量关联数组 ERRNO 系统错误 FIELDWIDTHS 字段宽度列表 FILENAME 当前文件名 ENR 同NR FS 字段分隔符 IGNORECASE 为真则忽略大小写匹配 NF 记录中的字段数 OFMT 数字输出格式 OFS 输出字段分隔符(默认空格) ORS 输出记录分隔符(默认换行) RLENGTH match函数匹配的字符串长度 RS 记录分隔符(默认换行) RSTART match函数匹配的第一个位置 SUBSEP 数组下标分隔符(默认\034) 通用正则表达式元字符
符号 描述 \Y 匹配单词开头或末尾的空字符串 \B 匹配单词内空字符串 < 匹配单词开头 > 匹配单词末尾 \w 匹配字母数字组成的单词 \W 匹配非字母数字组成的单词 ' 字符串开头空字符串 ‘ 字符换末尾空字符串
tcpdump
其他一些工具
strace
perf性能分析工具
调试关注点
- 基于性能分析:可以算法优化、代码优化
- 硬件资源使用:如cache访问次数、cache丢失次数、流水线停顿周期、前端总线访问次数等
- 操作系统资源:如系统调用次数、上下文切换次数、任务迁移次数
- 事件以下几种:
- The most commonly used perf commands are:
annotate
Read perf.data (created by perf record) and display annotated codearchive
Create archive with object files with build-ids found in perf.data filebench
General framework for benchmark suitesbuildid-cache
Manage build-id cache.buildid-list
List the buildids in a perf.data filec2c
Shared Data C2C/HITM Analyzer.config
Get and set variables in a configuration file.data
Data file related processingdiff
Read perf.data files and display the differential profileevlist
List the event names in a perf.data fileftrace
simple wrapper for kernel’s ftrace functionalityinject
Filter to augment the events stream with additional informationkallsyms
Searches running kernel for symbolskmem
Tool to trace/measure kernel memory propertieskvm
Tool to trace/measure kvm guest oslist
List all symbolic event typeslock
Analyze lock eventsmem
Profile memory accessesrecord
Run a command and record its profile into perf.datareport
Read perf.data (created by perf record) and display the profilesched
Tool to trace/measure scheduler properties (latencies)script
Read perf.data (created by perf record) and display trace outputstat
Run a command and gather performance counter statisticstest
Runs sanity tests.timechart
Tool to visualize total system behavior during a workloadtop
System profiling tool.version
display the version of perf binaryprobe
Define new dynamic tracepointstrace
strace inspired tool功能分类
全局性概况
list
:查看系统支持的性能事件bench
:对系统性能摸底test
:对系统健全性测试stat
:对全局性能进行统计全局细节
top
:实时查看系统进程函数占用率情况probe
:自定义动态事件特定功能分析
kmem
:支队slab子系统性能分析kvm
:针对kvm虚拟化分析lock
:分析锁性能mem
:分析内核调度器性能trace
:记录系统调用轨迹记录与分析
record
:记录信息到perf.data
(FrameGraph)[https://gitee.com/mirrors/FlameGraph.git]1
2
3
4
5
6
7# 使用perf录制数据并使用FrameGraph查看火焰图
# 录制程序十秒
$ perf record -F 99 -a -g -- sleep 10
# 数据展开
$ perf script | ../stackcollapse-perf.pl > out.perf-folded
# 生成svg矢量图
$ ../flamegraph.pl out.perf-folded > perf-kernel.svgreport
:生成报告diff
:对两个记录进行diffevlist
:列出记录的性能事件annotate
:显式perf.data函数代码archive
:将相关符号打包,方便其他机器进行分析script
:将perf.data输出可读性文本可视化工具
timechart record
:记录事件timechart
:生成output.svg文档
一些技巧
1 | # 查看程序的pid、ppid、pgid、sid、comm信息 |
valgrind
用法:valgrind [VALGRIND_OPTIONS] programing [PROG_OPTIONS]
基本选项
-h
:帮助-q
:静默模式-v
:输出额外的信息,如加载的共享对象,检测和执行引擎进度,和异常行为警告,重复选项会增加详细程序要点
开始编译
使用
-g
有助于获得直接指向源代码行的消息如果使用C++,使用
-fno-inline
可以轻松看到函数调用链,或者使用valgrind选项--read-inline-info=yes
让valgrind读取内联信息开启
-O1
以上程序优化会导致memcheck误报未定义等错误,尽量不优化,且开启-Wall
注释输出
默认valgrind将消息输出文件描述符2(stderr),如果要写入其他文件描述符,可以使用
--log-fd=<n>
来指定fd减少干扰项为了减少干扰项,最好通过
-log-file=<filename>
将调试日志写到指定文件最少干扰是通过
--log-socket=<ip:port>
指定网络套接字进行输出,可以省略端口号,将默认使用端口1500,默认值由VG_CLO_DEFAULT_LOGPORT
定义。而valgrind监听端则使用valgrind-listener
来进行监听,连接的切断listener并不会杀死valgrind,而是会自动切换回写入stderrvalgrind-listener
接受多大50个valgrinded进程同时连接,它接收三个选项:-e --exit-at-zero
:当连接进程数为0时退出,否则将永远运行--max-connect=<n>
:进程上限,默认50,可以自动设限portnumber
:更改默认端口(1500)
检测重复错误会有大量开销,valgrind会在发现1000个不同的错误或总共发现10000000个错误后停止错误收集,为了避免中断,可以使用
--error-limit=no
选项错误检查工具会检测系统中预装系统库的很多问题,如果不想看到这些错误,可以使用
--gen-suppressions=yes
选项进行消除。如果使用了-v
选项,则在程序结束时打印已使用抑制行--tool=<toolname>
:可以决定运行哪个valgrind工具。默认为memcheck
,除此之外还有cachegrind
、callgrind
、helgrind
、drd
、massif
、dhat
、bouchey
、none
、exp-sgcheck
、exp-bbv
等
一些技巧记录
- 显式本地IP:
curl myip.ipip.net
- 查找结构体:
grep -Rn --include="*.h" --include="*.c" 'struct ether_header' /usr
- 查找宏定义:
grep -Rn --include="*.h" --include="*.c" '#define PCAP_ERRBUF_SIZE' /usr