strace是一款强大的Linux命令行工具,用于跟踪进程执行过程中的系统调用和接收到的信号。它主要用于调试应用程序和内核中的问题,也被广泛用于性能分析。
Linux strace命令介绍
strace(system trace的缩写)是Linux和类Unix操作系统中的一个调试工具,它可以帮助用户分析程序在运行时与Linux内核的交互情况。通过监控与跟踪系统调用、信号传递及输出这些信息,开发者可以了解程序的行为,诊断问题和进行性能分析。
Linux strace命令适用的Linux版本
strace几乎适用于所有Linux版本,但是如果在某些特定的Linux发行版中未预装此工具,可以使用以下命令进行安装:
# 基于apt的发行版(如Debian、Ubuntu、Raspbian、Kali Linux等)
sudo apt-get update && sudo apt-get install strace
# 基于yum的发行版(如RedHat,CentOS 7等)
sudo yum update && sudo yum install strace
# 基于dnf的发行版(如Fedora,CentOS 8等)
sudo dnf update && sudo dnf install strace
# 基于apk的发行版(如Alpine Linux)
sudo apk add --update strace
# 基于pacman的发行版(如Arch Linux)
sudo pacman -Syu && sudo pacman -S strace
# 基于zypper的发行版(如openSUSE)
sudo zypper ref && sudo zypper in strace
# 基于pkg的FreeBSD发行版
sudo pkg update && sudo pkg install strace
# 基于pkg的OS X/macOS发行版
brew update && brew install strace
Linux strace命令的基本语法
语法格式:
strace [选项] 命令 [命令选项和参数]
strace [选项] -p 进程ID
Linux strace命令的常用选项或参数说明
选项 | 描述 |
---|---|
-c | 统计每一系统调用的时间、调用次数和错误等信息 |
-f | 跟踪由fork调用所产生的子进程 |
-p | 跟踪指定的进程ID |
-e trace=系统调用 | 只跟踪指定的系统调用 |
-o 文件名 | 将strace的输出写入指定的文件中 |
-t | 在输出的每一行前加上时间信息 |
-s strsize | 指定输出的字符串最大长度 |
-v | 输出更详细的信息 |
Linux strace命令实例详解
实例1:跟踪程序中的系统调用
跟踪一个简单程序如ls
的系统调用。
[linux@bashcommandnotfound.cn ~]$ strace ls
实例2:跟踪程序并输出到文件
将跟踪信息输出到文件trace.txt
中。
[linux@bashcommandnotfound.cn ~]$ strace -o trace.txt ls
实例3:跟踪特定系统调用
只跟踪open
和close
系统调用。
[linux@bashcommandnotfound.cn ~]$ strace -e trace=open,close ls
实例4:跟踪子进程的系统调用
跟踪ls
命令,包括它创建的所有子进程。
[linux@bashcommandnotfound.cn ~]$ strace -f ls
实例5:跟踪特定进程
跟踪进程ID为1234的进程。
[linux@bashcommandnotfound.cn ~]$strace -p 1234
当然可以,下面是一些额外的strace命令实例,它们展示了strace在不同场景下的应用:
实例6:统计系统调用信息
打印一个程序的系统调用统计信息,例如ls
:
strace -c ls
这会在程序执行完毕后,输出每个系统调用的次数、错误次数、时间消耗等统计信息。
实例7:限制输出的字符串长度
限制输出的字符串参数的最大长度:
strace -s 100 ls
这会将strace输出中的字符串长度限制为最多100个字符,这有助于防止输出过于冗长。
实例8:跟踪网络相关的系统调用
只跟踪与网络通信相关的系统调用,例如使用wget
下载文件:
strace -e trace=network wget http://example.com
这将会输出所有与网络通信相关的系统调用,如socket
、connect
、recv
和send
等。
实例9:跟踪文件I/O相关的系统调用
只跟踪与文件I/O操作相关的系统调用:
strace -e trace=file ls /tmp
这将会输出所有与文件操作相关的系统调用,如open
、read
、write
和close
等。
实例10:跟踪信号交互
跟踪程序接收和发送的信号:
strace -e trace=signal kill -USR1 `pidof myprocess`
这将会输出所有与信号处理相关的系统调用,如rt_sigaction
、rt_sigprocmask
和kill
等。
实例11:实时显示时间戳
在输出中添加时间戳,以便知道每个系统调用发生的具体时间:
strace -tt ls
这会在每行输出前添加微秒级的时间戳。
实例12:跟踪内存相关的系统调用
只跟踪与内存管理相关的系统调用:
strace -e trace=memory ls
这将会输出所有与内存分配和释放相关的系统调用,如mmap
、munmap
、brk
等。
实例13:以图形化方式显示跟踪信息
虽然strace本身不提供图形化界面,但你可以使用其他工具来处理strace的输出,例如使用strace-log-merge
将多个strace日志合并,或者用strace-graph
来生成调用图:
strace -o output.txt -ttT -ff myprogram
strace-graph < output.txt > graph.txt
这将生成一个图表,展现函数调用的层次关系。
注意事项和提示
- 在使用
-f
或-ff
跟踪多线程程序时,输出可能会很快填满屏幕或文件,因此最好使用-o
将输出重定向到文件中。 - 使用
-e
选项可以更精细地控制哪些类型的系统调用被跟踪,这样可以减少不必要的输出并专注于特定的调试任务。 - 跟踪生产环境中的进程可能会带来性能损失,因此在生产环境中使用strace时应谨慎,并确保了解潜在的影响。
- 有些程序可能对strace的使用具有检测机制,会因为安全原因而改变它们的行为或直接退出。这种情况下,可能需要寻找其他调试手段。
评论区