strace 是一个用于诊断、调试和教学的 Linux 用户空间工具。它能够跟踪进程所接收的系统调用和发送的信号,帮助开发者了解程序在操作系统层面的行为。通过使用 strace,可以分析程序性能问题、定位错误以及学习程序的运行机制。
strace 的主要功能包括:
系统调用是用户空间程序与操作系统内核交互的主要方式。常见的系统调用包括:
open, read, write, closefork, execve, exitmmap, brksocket, 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 聚焦于内核交互。