strace使用
在 Linux 上,strace
是一个强大的调试工具,用于追踪进程执行期间的 系统调用(system calls)和 信号(signals)。通过 strace
,你可以观察程序与操作系统交互的细节,尤其是在处理文件操作、网络通信、内存分配、进程间通信等方面。使用 strace
跟踪二进制程序的系统调用,可以帮助你定位和诊断问题,如崩溃、卡住、权限问题、文件未找到等。
使用 strace
的常见场景
- 程序崩溃:例如,你的程序在某个系统调用(如
open
、read
、write
等)失败后崩溃,strace
可以帮助你捕获失败的系统调用及其返回值。 - 程序卡住:如果程序似乎卡住或挂起,
strace
可以帮助你找到它在哪个系统调用中等待(如poll
、select
、read
、futex
等)。 - 权限问题:如果程序由于权限不足而无法访问某些文件,
strace
可以显示出open
或其他相关系统调用的失败原因。 - 文件操作失败:
strace
可以帮助跟踪程序对文件系统的操作,显示打开了哪些文件,读取了哪些内容,是否找到了正确的文件路径等。
基本用法
1. 直接跟踪可执行文件
你可以通过 strace
直接运行并跟踪一个可执行文件:
strace ./myapp
这会输出程序执行期间所有的系统调用,格式如下:
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
read(3, "..." , 83296) = 83296
close(3) = 0
每行显示了系统调用的名称、参数、返回值,以及有时还会显示错误信息(如 ENOENT
表示文件未找到)。
2. 跟踪已经运行的进程
你也可以使用 strace
来附加到正在运行的进程上:
strace -p <pid>
这会开始跟踪进程 pid
的系统调用。你可以用 ps
命令或其他方式找到进程 ID。
3. 输出到文件
如果系统调用输出信息太多,可以将其重定向到文件中:
strace -o trace_output.txt ./myapp
这会将 strace
输出写入 trace_output.txt
文件中,方便之后分析。
常用选项
-
-f
:追踪由当前进程fork
出的子进程。这个选项特别适用于多线程或多进程的程序,因为父进程和子进程需要一起分析。strace -f ./myapp
-
-e trace=<syscall>
:仅跟踪特定的系统调用。例如,你只关心文件操作相关的系统调用(如open
、read
、write
):strace -e trace=open,read,write ./myapp
-
-e trace=file
:只跟踪文件系统相关的系统调用(如open
、stat
、read
、write
等)。这是调试文件相关操作失败时的有用选项。strace -e trace=file ./myapp
-
-e trace=network
:只跟踪网络相关的系统调用(如socket
、connect
、send
、recv
等)。strace -e trace=network ./myapp
-
-e signal=<signal>
:跟踪信号的发送和接收。例如跟踪SIGSEGV
(段错误信号):strace -e signal=SIGSEGV ./myapp
-
-T
: 显示每个系统调用的执行时间。strace -T ./myapp
-
-tt
:显示系统调用的精确时间戳。特别适合分析程序何时进入某个系统调用以及调用的顺序。strace -tt ./myapp
-
-c
:统计各类系统调用的调用次数、时间消耗等strace -tt ./myapp