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 系统上的调试能力。