strace使用

在 Linux 上,strace 是一个强大的调试工具,用于追踪进程执行期间的 系统调用(system calls)和 信号(signals)。通过 strace,你可以观察程序与操作系统交互的细节,尤其是在处理文件操作、网络通信、内存分配、进程间通信等方面。使用 strace 跟踪二进制程序的系统调用,可以帮助你定位和诊断问题,如崩溃、卡住、权限问题、文件未找到等。

使用 strace 的常见场景

  1. 程序崩溃:例如,你的程序在某个系统调用(如 openreadwrite 等)失败后崩溃,strace 可以帮助你捕获失败的系统调用及其返回值。
  2. 程序卡住:如果程序似乎卡住或挂起,strace 可以帮助你找到它在哪个系统调用中等待(如 pollselectreadfutex 等)。
  3. 权限问题:如果程序由于权限不足而无法访问某些文件,strace 可以显示出 open 或其他相关系统调用的失败原因。
  4. 文件操作失败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>:仅跟踪特定的系统调用。例如,你只关心文件操作相关的系统调用(如 openreadwrite):

    strace -e trace=open,read,write ./myapp
    
  • -e trace=file:只跟踪文件系统相关的系统调用(如 openstatreadwrite 等)。这是调试文件相关操作失败时的有用选项。

    strace -e trace=file ./myapp
    
  • -e trace=network:只跟踪网络相关的系统调用(如 socketconnectsendrecv 等)。

    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
    
posted @ 2024-12-09 15:14  TY520  阅读(24)  评论(0编辑  收藏  举报