strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
1. 常见参数:
-e 用来指定要追踪的系统调用,信号,或者跟踪过滤条件。
-e trace=all 跟踪所有系统调用并显示时间戳
-e trace=file 跟踪与文件访问相关的系统调用
open, openat:打开文件。
close:关闭文件描述符。
read, pread64:从文件描述符读取数据。
write, pwrite64:向文件描述符写入数据。
lseek:修改文件指针的位置。
fstat, newfstatat:获取文件状态。
stat, lstat:获取文件属性。
mmap:内存映射文件。
fsync:将内存中的数据同步到磁盘。
unlink, unlinkat:删除文件或目录。
rename, renameat:重命名文件或目录。
chmod, fchmod:改变文件权限。
chown, fchown:改变文件所有者和组。
statfs, fstatfs:获取文件系统信息。
-e trace=process 跟踪和进程管理相关的系统调用,涉及创建、终止、退出、等待等操作。
fork:创建子进程。
vfork:创建子进程(不复制父进程的地址空间)。
clone:创建新进程。
execve:执行一个新程序。
exit, exit_group:退出进程。
waitpid:等待进程终止。
setpgid, getpgid:设置和获取进程组ID。
setsid:创建新的会话。
kill:发送信号给进程。
sigaction:设置信号处理器。
-e trace=network 跟踪与网络通信相关的系统调用,通常包括套接字的创建、连接、数据发送和接收等操作。
socket:创建套接字。
socketpair:创建一对无名套接字。
bind:绑定套接字到指定地址。
listen:监听套接字上的连接请求。
accept:接受一个连接。
connect:连接到远程套接字。
sendto,recvfrom:发送和接收数据。
sendmsg, recvmsg:发送和接收消息。
setsockopt, getsockopt:设置和获取套接字选项。
shutdown:关闭套接字的一部分或全部。
-e trace=signal 跟踪信号的发送、接收和处理,常用于调试进程之间的信号交互
kill:发送信号。
sigaction:设置信号处理程序。
sigprocmask:修改进程的信号掩码。
rt_sigprocmask:操作实时信号掩码。
sigsuspend:挂起进程,等待信号。
sigpending:获取待处理的信号。
sigwait:等待特定信号的到来。
-e trace=desc 跟踪与文件描述符相关的操作,常见于涉及输入输出的操作,比如文件读取、写入、事件通知等。
read, write:读写文件描述符。
select,pselect:等待文件描述符就绪。
poll,epoll_wait:等待文件描述符的事件。
ioctl:操作设备或文件描述符的行为。
fcntl:修改文件描述符的属性。
dup, dup2, dup3:复制文件描述符。
-e trace=ipc 跟踪进程间通信的系统调用,通常涉及共享内存、信号量、消息队列等
pipe,pipe2:创建管道。
shmget,shmat,shmdt,shmctl:操作共享内存。
semget,semop,semctl:操作信号量。
msgget,msgsnd,msgrcv,msgctl:操作消息队列。
mmap:内存映射区域。
-e trace=time 跟踪与时间相关的系统调用,通常包括获取和设置时间。
gettimeofday:获取当前时间。
clock_gettime:获取时钟时间。
nanosleep:休眠一段时间。
settimeofday:设置当前时间。
timer_create, timer_settime, timer_gettime:定时器操作
-e trace=memory 跟踪与内存管理相关的系统调用。
brk,sbrk:调整进程的堆内存大小。
mmap, munmap:内存映射和解除映射。
mprotect:修改内存保护属性。
msync:同步内存映射的内容到磁盘。
-e trace=security 跟踪和用户、权限相关的系统调用。
getuid, geteuid:获取用户ID和有效用户ID。
setuid, setgid:设置用户ID和组ID。
setresuid, setresgid:设置真实、有效、保存的用户/组ID。
getgroups,setgroups:获取和设置进程的组信息。
-e trace=mount 跟踪与挂载相关的系统调用,涉及文件系统挂载、卸载等操作。
mount:挂载文件系统。
umount:卸载文件系统。
-e trace=debug 跟踪与调试和诊断相关的系统调用。
ptrace:调试进程。
sysctl:系统控制(读取/设置系统参数)。
-f 跟踪由当前进程创建的子进程。即,跟踪 fork()
、clone()
、vfork()
等创建的进程。
-tt 输出时在每一行前面添加精确到微秒的时间戳
-T 显示每个系统调用的执行时间。
-p 附加到已经存在的进程(通过其进程ID)进行跟踪。 示例:strace -p 1234
-c 打印每个系统调用的统计信息,如调用次数、错误次数、总时间等。
-v 输出更多的详细信息,尤其是关于系统调用的错误和返回值。
-o 重定向到文件当中
2. 示例命令:
strace -f -tt -T -v -e trace=all -o /tmp/strace.log ls
使用了 strace
命令来追踪 l
s程序的系统调用
strace -f -tt -T -v -e trace=all -o /tmp/strace.log -p 1
使用的 strace
命令用来跟踪 24298程序及其子进程的系统调用
3. 部分字段详解
点击展开
execve 是一个系统调用,用于启动一个新程序
brk 是用来调整进程的数据段大小的
mmap 是 Linux 和类 Unix 系统中的一个系统调用,用于将文件或设备映射到进程的内存地址空间。它允许程序直接在内存中访问文件内容,而无需使用传统的 read 和 write 系统调用。除此之外,mmap 还可以用于匿名内存映射,用于动态分配内存。
access() 是一个用于检查文件访问权限的系统调用。它检查文件是否存在,或者文件是否可读、可写等。
statfs 系统调用用于获取指定路径的文件系统信息。
openat() 是一个系统调用,用于打开文件。与 open() 系统调用不同,openat() 可以指定一个目录描述符来作为基准路径,便于相对路径的解析。
read(3, …):这是一个 read() 系统调用,文件描述符为 3,该调用尝试从文件中读取数据。
newfstatat() 获取文件的状态信息(如文件的大小、权限等),这对进一步处理文件非常重要。
access():这个系统调用用于检查文件是否存在,或者判断当前进程是否有访问该文件的权限。它有不同的模式,可以检查文件是否存在、是否可读、可写或可执行。
readlink():该系统调用用于读取符号链接(symlink)所指向的目标路径。在 Linux 系统中,文件描述符(file descriptor)对应的文件可以是符号链接,readlink() 用来获取这个符号链接的目标路径。
uname 是一个用来获取系统信息的系统调用,它返回当前操作系统的相关信息,如系统名称、主机名称、内核版本等。你看到的这一行是 uname 系统调用的返回结果。
ioctl 是一个用来控制设备的系统调用。这里 0 表示标准输入(stdin)。TCGETS 表示获取终端的当前设置。
process 表示只跟踪和进程管理相关的系统调用
write写入
socket()创建一个 Unix 域套接字
connect() 调用尝试连接到指定的 Unix 域套接字路径
readlink 来读取符号链接 /proc/self/exe,该链接指向当前进程的可执行文件。
rt_sigaction 是一个用于设置实时信号处理程序的系统调用。
rt_sigprocmask(SIG_BLOCK, [TSTP], [], 8) = 0
这是在阻塞 TSTP 信号,TSTP 信号通常用于暂停进程(如按下 Ctrl+Z)。这意味着进程暂时不会处理 TSTP 信号。
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
这是恢复信号屏蔽,移除了之前的信号屏蔽。