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
gdb
# debug
gdb -ex r --args python main.py
# 查看详细上下文
bt full
# 查看文件依赖
ldd xxx.so

浙公网安备 33010602011771号