# strace/ltrace命令及其使用

# strace基本介绍

strace 是一个强大的工具,用于跟踪程序执行时的系统调用和接收到的信号。

通过 strace,可以了解程序在运行时请求了哪些系统调用,这些调用的参数是什么,以及操作系统对这些调用的响应。这对于调试程序、分析程序行为和优化性能非常有用。

其主要作用包括以下几点:

  • 诊断程序错误:通过分析程序与操作系统之间的交互,可以帮助找到错误和异常的原因
  • 性能分析:通过查看系统调用的时间、数量和类型,可以识别潜在的性能瓶颈
  • 安全分析:检查程序是否进行恶意行为,如不当访问文件、套接字等
  • 学习和理解:通过观察系统调用,可以加深对Linux操作系统、库函数和系统调用之间关系的理解
  • 调试:在没有源代码的情况下,可以通过查看系统调用的顺序和参数来了解程序的执行流程

# strace命令格式及常用选项

strace [选项] 程序 [程序参数]

支持的常用选项有:

  • -c统计每个系统调用的执行时间、次数和出错次数
# % time     seconds  usecs/call     calls    errors syscall
# ------ ----------- ----------- --------- --------- ----------------
#  45.53    0.001222          26        47        42 openat
#  23.10    0.000620          28        22           mmap
#   6.78    0.000182          26         7           mprotect
#   5.96    0.000160         160         1           munmap
#   5.96    0.000160          16        10           pread64
#   4.06    0.000109          18         6           fstat
#   2.53    0.000068          17         4           read
#   2.24    0.000060          12         5           close
#   1.34    0.000036          36         1           clock_nanosleep
#   1.12    0.000030          30         1           write
#   0.97    0.000026           8         3           brk
#   0.41    0.000011           5         2         1 arch_prctl
#   0.00    0.000000           0        31        28 stat
#   0.00    0.000000           0         1         1 access
#   0.00    0.000000           0         1           execve
# ------ ----------- ----------- --------- --------- ----------------
# 100.00    0.002684                   142        72 total
  • -f跟踪由 fork 调用产生的子进程
  • -o filenamestrace 的输出写入文件 filename
  • -e expr指定一个表达式来控制跟踪的系统调用,例如-e trace=open表示只跟踪 open 调用

# ltrace介绍

ltrace 是一个用于跟踪程序库函数调用的工具。它会显示被执行的进程调用的动态库函数,以及接收到的信号。与 strace 类似,ltrace 可以帮助用来调试程序和分析其行为。它还可以拦截并打印程序执行的系统调用。

# ltrace命令格式及其常用选项

命令格式:

ltrace [选项] 程序 [程序参数]

常用选项:

  • -c:统计每个库函数的调用次数和时间,并在程序退出时打印摘要
# % time     seconds  usecs/call     calls      function
# ------ ----------- ----------- --------- --------------------
#  99.92    1.000427     1000427         1 nanosleep
#   0.02    0.000250         250         1 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
#   0.02    0.000250         250         1 _ZNSolsEPFRSoS_E
#   0.02    0.000168         168         1 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
#   0.01    0.000121         121         1 _ZNSolsEi
# ------ ----------- ----------- --------- --------------------
# 100.00    1.001216                     5 total

  • -D, --debug <掩码>:打印调试信息。
  • -e <过滤条件>指定要跟踪的事件,例如特定函数
  • -f:跟踪子进程
  • -S显示系统调用
  • -t打印绝对时间戳
  • -o, --output=file 把输出定向到文件