调试神器strace的使用

1、strace命令简介

strace 是一个 Linux 系统下的强大调试工具,用于跟踪系统调用(system calls)及其接收的信号(signals)。通过使用 strace,开发者可以观察和调试进程在运行时与操作系统内核之间的交互,这在分析应用程序的性能、调试错误以及理解程序行为时非常有用。

2、strace命令基本用法

在命令行中输入 strace -h 就能看到 strace 命令的基本用法。基本格式就是 strace [options] command [args…],command 是想要跟踪的程序,args 是要传递给程序的参数。

[root@localhost ~]# strace -h
Usage: strace [-ACdffhikqqrtttTvVwxxyyzZ] [-I N] [-b execve] [-e EXPR]...
              [-a COLUMN] [-o FILE] [-s STRSIZE] [-X FORMAT] [-O OVERHEAD]
              [-S SORTBY] [-P PATH]... [-p PID]... [-U COLUMNS] [--seccomp-bpf]
              { -p PID | [-DDD] [-E VAR=VAL]... [-u USERNAME] PROG [ARGS] }
   or: strace -c[dfwzZ] [-I N] [-b execve] [-e EXPR]... [-O OVERHEAD]
              [-S SORTBY] [-P PATH]... [-p PID]... [-U COLUMNS] [--seccomp-bpf]
              { -p PID | [-DDD] [-E VAR=VAL]... [-u USERNAME] PROG [ARGS] }

3、strace命令各个参数的含义

参数含义
-c统计系统调用的数量、执行时间和错误次数
-d显示 strace 调试信息
-D将跟踪进程置于后台(与 -o 选项一同使用时)
-e expr表达式,控制跟踪的事件(如 trace=%file,signal=!SIGIO)
-f跟踪由 fork 系统调用创建的子进程
-ff为每个进程创建独立的输出文件,并添加 PID 后缀
-h显示此帮助信息
-i在每个系统调用之前打印系统调用的指令指针
-q禁止打印关于已分离进程的消息
-r显示相对时间戳,显示时间间隔
-s strsize设置显示的字符串的最大长度(默认值为 32)
-t在每一行的开头显示时间戳
-tt在每一行的开头显示微秒级精度的时间戳
-ttt在每一行的开头显示自 Epoch 以来的时间(以毫秒为单位)
-T在每一行的末尾显示每个系统调用的执行时间
-v显示更多的系统调用详情(默认隐藏的结构体字段)
-x显示非 ASCII 字符(以十六进制显示)
-yy显示从路径名读取的文件内容,最多 256 字节
–syscall-limit <num>设置最大系统调用跟踪数(默认无限制)
-p pid附加到指定的进程 ID 上,并跟踪它
-o file将输出写入指定文件而不是 stderr
-0使用 NUL(\0)字符而不是换行符分隔行
-1单独输出文件描述符为 1(stdout)的数据
-a column指定返回值对齐的列号(默认值为 40)
-e trace=set指定要跟踪的系统调用(如 trace=open,close,read,write)
-e signal=set指定要跟踪的信号(如 signal=SIGIO,SIGKILL)
-e status=set指定要跟踪的错误类型(如 status=successful,failed)
-e abort=set在特定事件时中止(如 abort=exit,group_exit,error)
-e inject=set注入故障、延迟或修改(如 inject=open,openat+fail=ENOENT)
-e trace/过滤系统调用以跟踪特定路径(如 trace=/dev,trace=/tmp)
-e read=set读取数据(如 read=3,5)
-e write=set写入数据(如 write=3,5)
-e fault=set注入系统调用故障(如 fault=open,error=EPERM)
-e fault=set随机性(如 fault=read:0.1)
–seccomp启用 SECCOMP 模式
–seccomp-bpf使用SECCOMP-BPF过滤
–seccomp-filter <filter>使用特定的SECCOMP-BPF过滤器
-I interrupt控制如何中断(abort(默认),ignore,no_attach)
-I restart在 SECCOMP 环境下重启系统调用(如 restart=all,error,signal)
–trace=from,设置从某个位置开始跟踪
–trace=to,设置到某个位置结束跟踪
–follow-fork自动跟踪 fork 系统调用
–pid-syscall=输出特定进程的系统调用(每个进程一个文件)
–buffer-size=<kbytes>设置内存中缓冲区的大小
–max-dump=<bytes>设置最大转储大小
–max-decoded-instrs=<instrs>设置最大解码的指令数

4、strace命令使用示例

// 跟踪 ls -l 命令的所有系统调用。
strace ls -l

// 统计系统调用的数量、执行时间和错误次数,并生成报告。
strace -c ls -l

// 设置表达式来过滤跟踪的系统调用、信号或错误。只跟踪 open 和 close 系统调用。
strace -e trace=open,close ls -l

// 将输出保存到指定文件中。
strace -o output.txt ls -l

// 指定显示的字符串的最大长度。默认是 32 字节。
strace -s 100 ls -l

// 显示每个系统调用的执行时间,从而帮助识别性能瓶颈。
strace -T -o trace_output.txt ./myapp

// 附加到一个正在运行的进程,通过进程 ID (PID) 进行跟踪。可以用来调试程序崩溃的原因。
strace -p 1234

// 了解第三方程序和系统是怎么交互的,比如运行时和哪些文件及网络资源进行交互。
strace -f -e trace=file,network -o trace_output.txt ./thirdpartyapp

5、总结

strace 是一个非常灵活和强大的工具,熟练掌握它可以大大提高我们在 Linux 系统上的调试能力。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不适合写代码的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值