# 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 filename
将strace
的输出写入文件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
把输出定向到文件