0%

一些调试工具命令

测试工具

  • 三剑客grepsedawk的使用
  • 网络分析工具tcpdump的使用
  • 内存分析:valgrind
  • 其他:netstat、lsof、nc、tcpcopy、prerf、sysctl、strace、prove等
  • 性能检测工具:perf、ftrace、vmstat

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]匹配abc
      • [^]:取反
      • [a-z]:小写字母
      • [A-Z]:大写字母
      • [0-9]:数字
    • ^$:表示行首和行位,^$表示空行
    • *:通配符,表示多个重复
    • .:单个。.*表示0个或多个
    • {n, m}:个数范围,n个到m个之间,需要用/转义,egrep下不需要转义
    • egrep
      • +:类似.,1个或多个
      • ?:表示0个或多个
      • |:表示关系,如'ab|cd|def'表示abcddef的串
      • ():将部分内容合成单元

sed

用法:sed [OPTION]... [SCRIPTorCOMMAND] [FILE]...
选项:
  • -e:执行多条命令
  • -f:引导sed脚本
  • -i:直接修改文件
  • -n:silent,搭配s替换p可以打印修改过的行
  • -h:帮助
  • -V:版本信息
  • action:
    • a:后插,sed '/text/a\newline' OR sed '/text/a newline'
    • c:取代,sed '3,4c\replaceline'
    • d:删除,sed '2,4d' OR sed '/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/\1rsloveable -> 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简明教程

用法:
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 or traditional:兼容模式运行awk,gawk将同awk,忽略扩展
    • copyleft or copyright:版权信息
    • help or usage:选项简短说明
    • lint or lint-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丢失次数、流水线停顿周期、前端总线访问次数等
  • 操作系统资源:如系统调用次数、上下文切换次数、任务迁移次数
  • 事件以下几种:
    • Hardware Event:由PMU部件产生,特定条件下探测性能事件是否发生以及发生次数,如cache命中
    • Software Event:由内核产生的事件,分布各个功能模块,统计与操作系统相关的事件,如进程切换,tick数等
    • Tracepoint Event:由内核中静态tracepoint所触发的事件,tracepoint用来判断程序运行期间内核的行为细节,如slab分配器分配次数等
    • Tool Event:duration_time

      用法:perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

  • The most commonly used perf commands are:
    • annotate Read perf.data (created by perf record) and display annotated code
    • archive Create archive with object files with build-ids found in perf.data file
    • bench General framework for benchmark suites
    • buildid-cache Manage build-id cache.
    • buildid-list List the buildids in a perf.data file
    • c2c Shared Data C2C/HITM Analyzer.
    • config Get and set variables in a configuration file.
    • data Data file related processing
    • diff Read perf.data files and display the differential profile
    • evlist List the event names in a perf.data file
    • ftrace simple wrapper for kernel’s ftrace functionality
    • inject Filter to augment the events stream with additional information
    • kallsyms Searches running kernel for symbols
    • kmem Tool to trace/measure kernel memory properties
    • kvm Tool to trace/measure kvm guest os
    • list List all symbolic event types
    • lock Analyze lock events
    • mem Profile memory accesses
    • record Run a command and record its profile into perf.data
    • report Read perf.data (created by perf record) and display the profile
    • sched Tool to trace/measure scheduler properties (latencies)
    • script Read perf.data (created by perf record) and display trace output
    • stat Run a command and gather performance counter statistics
    • test Runs sanity tests.
    • timechart Tool to visualize total system behavior during a workload
    • top System profiling tool.
    • version display the version of perf binary
    • probe Define new dynamic tracepoints
    • trace 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.svg
  • report:生成报告
  • diff:对两个记录进行diff
  • evlist:列出记录的性能事件
  • annotate:显式perf.data函数代码
  • archive:将相关符号打包,方便其他机器进行分析
  • script:将perf.data输出可读性文本
    可视化工具
  • timechart record:记录事件
  • timechart:生成output.svg文档

一些技巧

1
2
3
4
5
# 查看程序的pid、ppid、pgid、sid、comm信息
$ ps -C program o pid,ppid,pgid,sid,comm
# 查看进程层次关系
$ ps -ejH
$ ps axjf

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,而是会自动切换回写入stderr

    • valgrind-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,除此之外还有cachegrindcallgrindhelgrinddrdmassifdhatboucheynoneexp-sgcheckexp-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