strace工作原理及其知识点其延伸
1.strace命令介绍
strace是Linux下一个非常实用的系统调用跟踪工具。它可以跟踪一个进程执行的所有系统调用,并输出它们的参数、返回值等详细信息。
使用strace命令可以深入了解一个程序的运行过程,包括程序对文件、网络、进程、信号等系统资源的操作。strace所跟踪的系统调用包括了所有标准C库函数和Linux系统调用。这些系统调用是构成Linux操作系统的基础,通过了解它们的使用情况,可以更好地理解程序的行为。
- strace命令的安装
yum install starace
- strace命令的使用
strace的使用方法非常简单,只需要在命令行中输入"strace"命令以及需要跟踪的程序的命令即可。例如:
strace ls -l
上述命令将会跟踪"ls -l"命令的运行过程,并输出所有的系统调用信息。
通过strace的输出,可以清楚地看到程序的调用过程,包括入参、返回值、错误码等。这对于排查程序的bug和优化程序的性能都非常有用。同时,对于分析程序的安全性和漏洞也有很大帮助。
- strace命令的常用参数
-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
- strace命令实现原理
strace是一个可以跟踪系统调用和信号的Linux命令行工具。它通过利用内核的ptrace系统调用来实现对进程的监控,每当被跟踪的进程执行系统调用时,系统会发送一个信号通知strace进行处理并打印出系统调用的详细信息。
strace的实现过程大致如下:
1. strace通过命令行参数指定要跟踪的命令和参数。它首先调用fork()来创建一个子进程,然后使用exec()运行要跟踪的命令。
2. 在子进程中,strace使用ptrace()系统调用来追踪进程的执行。ptrace()会让strace成为一个进程的父进程,可以监视和控制该进程的执行。
3. strace在子进程中循环等待信号,每当被跟踪的进程执行系统调用时,内核会发送SIGTRAP信号通知strace处理该事件。
4. strace捕获SIGTRAP信号后,它会调用ptrace()来获取进程的当前状态和寄存器信息,并解析系统调用的参数和返回值等信息。
5. strace将解析出来的信息打印到标准输出,并回到步骤3等待下一个信号。
6. 当被跟踪的进程结束或收到信号时,strace会调用ptrace()来结束跟踪进程并退出。
总的来说,strace的实现利用了ptrace()系统调用来监控和控制进程的执行,并通过解析系统调用信息来打印出调试信息,从而实现了跟踪系统调用和信号的功能。
- fork()函数及父进程与子进程
fork()函数用于创建一个新的进程。新的进程是子进程,它是父进程的副本,但是它有自己的地址空间和进程标识符。
在 Linux 中,父进程和子进程是两个相互关联的进程。父进程是创建子进程的进程,子进程是由父进程创建的进程。
当父进程调用 fork 函数时,系统会创建一个与父进程完全相同的子进程。子进程从父进程那里继承了所有的资源,包括内存、文件描述符、信号处理函数等。但是,子进程是一个独立的进程,它有自己的地址空间和进程标识符,可以独立地执行代码。
父进程和子进程之间的关系是相互独立的,但它们也可以相互通信和协作。父进程可以通过信号、管道、共享内存等方式与子进程进行通信。同时,子进程也可以通过信号、管道、共享内存等方式与父进程进行通信。
父进程还可以使用 ptrace 函数来跟踪和调试子进程。
但是,需要注意的是,子进程是一个独立的进程,它有自己的地址空间和进程标识符,父进程不能直接修改子进程的内存或寄存器。父进程只能通过系统调用来与子进程进行通信和协作。
总的来说,父进程可以通过系统调用来管理子进程,但不能直接控制子进程的执行。
- exec函数
用于在进程中执行新的程序。
- Sigtrap信号
在 Linux 中,Sigtrap 信号是一种软件产生的信号,通常用于调试目的。当进程接收到 Sigtrap 信号时,它会停止执行,并将控制转移到一个指定的信号处理函数。这个信号处理函数可以用于检查程序的状态,或者进行其他调试操作。Sigtrap 信号通常由调试器或其他调试工具发送,以帮助开发人员调试程序。
- ptrace()函数
Ptrace 是 Linux 中的一个系统调用,用于跟踪和调试进程。它允许一个进程查看和修改另一个进程的内存和寄存器,以及控制另一个进程的执行。Ptrace 通常用于调试器,以帮助开发人员调试程序。