Linux神器strace的使用方法

前言

在Linux系统中,strace命令是一个集诊断、调试、统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用。

场景

1、在操作系统运维中会出现程序或系统命令运行失败,通过报错和日志无法定位问题根因。

2、如何在没有内核或程序代码的情况下查看系统调用的过程。

说明

1、strace是有用的诊断,说明和调试工具,Linux系统管理员可以在不需要源代码的情况下即可跟踪系统的调用。

2、strace显示有关进程的系统调用的信息,这可以帮助确定一个程序使用的哪个函数,当然在系统出现问题时可以使用 strace定位系统调用过程中失败的原因,这是定位系统问题的很好的方法。

strace的常用参数及示例

  • -c

统计每一系统调用的所执行的时间,次数和出错的次数等。

示例:打印执行uptime时系统系统调用的时间、次数、出错次数和syscall

1
# strace -c uptime
  • -d

    显示有关标准错误的strace本身的一些调试输出。

  • -f

    跟踪子进程,这些子进程是由于fork(2)系统调用而由当前跟踪的进程创建的。

  • -i
    在系统调用时打印指令指针。

  • -t

    跟踪的每一行都以时间为前缀。

  • -tt

    如果给出两次,则打印时间将包括微秒。

  • -ttt

    如果给定三次,则打印时间将包括微秒,并且前导部分将打印为自该**以来的秒数。

  • -T

    显示花费在系统调用上的时间。这将记录每个系统调用的开始和结束之间的时间差。

  • -v

    打印环境,统计信息,termios等调用的未缩写版本。这些结构在调用中非常常见,因此默认行为显示了结构成员的合理子集。使用此选项可获取所有详细信息。

  • -V

    打印strace的版本号。

  • -e expr

    限定表达式,用于修改要跟踪的事件或如何跟踪它们:

  • -e trace=set

    仅跟踪指定的系统调用集。该-c选项用于确定哪些系统调用可能是跟踪有用有用。例如,trace=open,close,read,write表示仅跟踪这四个系统调用。

  • -e trace=file

    跟踪所有以文件名作为参数的系统调用。

    示例:打印执行ls时跟文件有关的系统调用。

    1
    strace -e trace=file ls
  • -e trace=process

    跟踪涉及过程管理的所有系统调用。这对于观察进程的派生,等待和执行步骤很有用。

  • -e trace=network

    跟踪所有与网络相关的系统调用。

  • -e trace=signal

    跟踪所有与信号相关的系统调用。

  • -e trace=ipc

    跟踪所有与IPC相关的系统调用。

  • -o 文件名

    将跟踪输出写入文件名而不是stderr。

  • -p pid

    使用进程ID pid附加到该进程并开始跟踪。跟踪可以随时通过键盘中断信号(CTRL -C)终止。

  • -S

    按指定条件对-c选项打印的直方图输出进行排序。

    示例:打印执行uname系统调用中calls的次数排序

    1
    # strace -fc -S calls uname

    注:其他参数可以查看man手册

    1
    # man strace