跳转到内容

strace

strace 是一个用于跟踪系统调用(system calls)和信号(signals)的调试工具,它能监控进程执行过程中所调用的系统调用,输出详细信息,帮助开发者分析程序行为、调试问题和定位性能瓶颈。

strace 有两种启动模式:

Terminal window
strace [选项] command [command-arguments]

或者附加到已运行的进程:

Terminal window
strace [选项] -p pid
  • 第一种模式:启动一个新程序并追踪其系统调用
  • 第二种模式:将 strace 附加到一个已运行的进程上进行追踪
选项 说明
-p <PID> 跟踪指定进程 ID 的进程
-f 跟踪目标进程及其所有子进程
-c 统计系统调用的次数、时间等信息,结束后输出汇总报告
-t / -tt / -ttt 在输出中添加时间戳(分别精确到秒、毫秒、微秒)
选项 说明
-e <expr> 过滤要跟踪的事件
-o <file> 将输出重定向到指定文件

-e trace 常用过滤选项:

  • -e trace=all:跟踪所有系统调用(默认)
  • -e trace=file:只跟踪与文件操作相关的系统调用
  • -e trace=network:只跟踪网络相关的系统调用
  • -e trace=signal:只跟踪与信号相关的系统调用
  • -e trace=read,write:只跟踪指定的系统调用
选项 说明
-T 显示每个系统调用的耗时(便于分析性能瓶颈)
-y 显示文件描述符对应的文件名(让输出更易读)
-d 显示 strace 自身的调试信息

跟踪一个新程序的系统调用:

Terminal window
strace ls -l

将跟踪信息保存到文件:

Terminal window
strace -o ls.strace ls

只跟踪文件相关的系统调用:

Terminal window
strace -e trace=file ls

跟踪一个已运行的进程:

Terminal window
strace -p 1234

统计系统调用的次数和时间:

Terminal window
strace -c ls

跟踪带子进程的程序(如 shell 脚本):

Terminal window
strace -f -o output.log ./test.sh

跟踪网络相关系统调用并显示耗时:

Terminal window
strace -f -e trace=network -T curl https://example.com