strace
是一个用于诊断、调试和教学的 Linux 用户空间工具。它能够跟踪进程所接收的系统调用和发送的信号,帮助开发者了解程序在操作系统层面的行为。通过使用 strace
,可以分析程序性能问题、定位错误以及学习程序的运行机制。
strace
的主要功能包括:
系统调用是用户空间程序与操作系统内核交互的主要方式。常见的系统调用包括:
open
, read
, write
, close
fork
, execve
, exit
mmap
, brk
socket
, connect
, sendto
, recvfrom
每个系统调用都有特定的功能和参数,strace
可以捕获这些调用并显示其详细信息。
信号是操作系统向进程发送的通知或中断事件。常见的信号包括:
SIGINT
(2):由 Ctrl+C 触发,通常用于终止程序。SIGKILL
(9):强制终止进程。SIGTERM
(15):请求程序正常退出。SIGSEGV
(11):段错误,通常表示程序尝试访问非法内存。通过 strace
,可以观察到进程接收到的信号及其处理方式。
要跟踪某个程序的系统调用和信号,可以使用以下命令:
strace <command>
例如,跟踪 ls
命令的系统调用:
strace ls
输出示例:
execve("/bin/ls", ["ls"], 0x7fffbf8b9c60 /* 64 vars */) = 0
brk(NULL) = 0x563d2e6d4000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
...
上述输出中,execve
表示程序启动,brk
和 access
是其他系统调用。
如果只想跟踪某些特定的系统调用,可以使用 -e
参数。例如,仅跟踪文件相关的系统调用:
strace -e trace=file ls
输出示例:
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
...
使用 -e signal
参数可以跟踪信号。例如,跟踪所有信号:
strace -e signal=all sleep 5
或者只跟踪特定信号(如 SIGINT
):
strace -e signal=SIGINT sleep 5
使用 -p
参数可以附加到一个正在运行的进程,并开始跟踪其系统调用和信号。例如:
strace -p <PID>
要同时附加多个进程,可以多次指定 -p
参数:
strace -p <PID1> -p <PID2>
使用 -T
参数可以显示每个系统调用的耗时。这对于性能分析非常有用:
strace -T ls
如果需要将 strace
的输出保存到文件中,可以使用 -o
参数:
strace -o output.txt ls
curl
命令的网络行为确保系统已安装 strace
和 curl
工具。
使用 strace
跟踪 curl
的系统调用和信号:
strace curl http://example.com
在输出中查找与网络相关的系统调用,例如:
socket
: 创建套接字。connect
: 连接到服务器。sendto
/recvfrom
: 发送和接收数据。如果只想查看网络相关的系统调用,可以使用:
strace -e trace=network curl http://example.com
通过结合 -c
参数统计系统调用的频率和耗时:
strace -c ls
输出示例:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
80.00 0.001200 0 10000 read
20.00 0.000300 0 2000 write
------ ----------- ----------- --------- --------- ----------------
100.00 0.001500 12000 total
strace
专注于系统调用和信号。strace
聚焦于内核交互。