遇到进程卡死、响应慢、崩溃或行为异常时,strace能通过追踪系统调用和信号来定位问题。1. strace是linux系统调用追踪工具,可查看程序与内核交互的细节,帮助识别阻塞点、错误原因及低效操作;2. 基本用法包括跟踪新进程(strace command)、附加运行中进程(strace -p pid)和输出到文件(-o选项);3. 常用选项有-e trace=xxx过滤调用类型、-t显示耗时、-t加时间戳、-y显示文件路径;4. 典型场景:用-t查耗时长的调用,-e trace=file排查文件错误,附加进程看卡住位置,-e trace=signal捕获崩溃信号;5. 注意事项:strace降低性能,不适用于长期生产监控,多线程需加-f跟踪子线程,静态链接程序可能无法完整追踪,容器环境需权限支持;6. 小技巧:结合grep过滤日志,如grep open log.txt或实时过滤错误码。掌握strace的关键在于分析系统调用的参数、返回值和错误码,从而快速定位底层问题。

当你遇到进程卡死、响应慢、崩溃或行为异常的问题时,
strace
下面是如何使用
strace
strace
strace
通过观察这些信息,你可以:
read
connect
waitpid
ENOENT
EACCES
strace command [args]
例如:
strace ls /tmp
这会输出
ls
如果你有一个已经在运行的进程(比如卡住了),可以通过 PID 附加:
strace -p <PID>
例如:
strace -p 1234
按
Ctrl+C
strace -o debug.log command strace -p 1234 -o app_trace.log
这样可以把大量输出保存下来,方便后续分析。
| 选项 | 作用 |
|---|---|
| @@######@@ | 只追踪特定系统调用,如 @@######@@ |
| @@######@@ | 跟踪所有文件相关调用(open、stat、unlink 等) |
| @@######@@ | 跟踪网络相关调用(socket、connect、sendto 等) |
| @@######@@ | 跟踪进程创建类调用(fork、execve、exit 等) |
| @@######@@ | 排除某些调用,减少噪音 |
| @@######@@ | 显示每个系统调用的耗时(useful!) |
| @@######@@ 或 @@######@@ | 在每行输出前加上时间戳 |
| @@######@@ | 显示文件描述符对应的文件路径(部分版本支持) |
示例:只看文件操作并显示耗时
-e trace=xxx
输出可能显示:
trace=open,read,write
一眼看出“文件不存在”。
使用
-e trace=file
-e trace=network
重点关注:
-e trace=process
-e trace=!read,write
-T
用
-T
-tt
你会看到类似:
-y
说明程序在找这个路径下的配置文件,但没找到。
先用
strace -e trace=file -T ls /nonexistent
openat(AT_FDCWD, "/nonexistent", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000012>
-T
观察最后一两个系统调用是什么。常见情况:
strace -T -e trace=all your_program
connect()
open()
futex()
-e trace=file
加上
strace -e trace=file your_app
open("/etc/myapp/config.ini", O_RDONLY) = -1 ENOENT (No such file or directory)输出如:
ps
表示发生了段错误(访问非法内存)。
性能影响:
top
多线程程序:默认只跟踪主线程。要用
strace -p <PID>
read(0, ...)
静态链接程序:某些静态编译的程序(如 Go 默认编译)绕过部分系统调用封装,
futex(..., FUTEX_WAIT)
容器环境:在容器中使用时,确保有权限访问目标进程(可能需要
poll
epoll_wait
如果
wait4
-e trace=signal
strace -e trace=signal your_command
或者实时过滤:
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x10} ---基本上就这些。
strace
掌握它,你会比日志更快定位底层问题。
-f
strace -f your_command
strace
--privileged
SYS_PTRACE
strace
grep
strace -o log.txt your_app grep open log.txt | grep -i "no such"
strace your_app 2>&1 | grep -E "(open|read).*ENOENT"
strace
以上就是如何调试进程问题 strace系统调用追踪的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号