strace命令行工具


一、简介

strace主要提供对系统调用的监控功能,包括执行了哪些系统调用、执行时间、频次等,并提供统计功能。

帮助信息:

sa8155:/ # strace -h
usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
              [-a column] [-o file] [-s strsize] [-P path]...
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
   or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

Output format:
  -a column      列对齐到 column 位置打印系统调用的返回值(默认 40)
  -i             打印系统调用时的指令指针,它会在每行最左侧多出一个地址值
  -o file        将打印输出到文件(默认是stderr)
  -q             隐藏 attaching, detaching 等信息。
  -r             打印相对于上一条日志的时间戳,单位精确到us.
  -s strsize     strsize 将打印字符串的长度限制为 STRSIZE 个字符(默认 32-t             打印绝对时间戳,用的是墙上时间,单位只能精确到秒。
  -tt            打印绝对时间戳,用的是墙上时间,单位精确到us。
  -T             打印每次系统调用所用时间,在每个系统调用后面用 <0.000706> 显示时间,精确到us.
  -x             以16进制打印非ASCII码字符串.
  -xx            以16进制打印所有的字符串.
  -y             打印与文件描述符参数相关的路径,即打印fd对应的文件路径名等,socket打印为 getsockopt(16<socket:[173511]>,...).
  -yy            打印与套接字文件描述符相关的协议特定信息, 系统调用形参名也可以打印出来了.

Statistics:
  -c             统计每个系统调用的时间、调用次数和错误次数并在Ctrl+C时报告摘要
  -C             具有像-c一样的统计功能,同时还有常规打印输出
  -O overhead    将系统调用追踪的开销设置为 OVERHEAD 微秒(暂不清楚啥作用)
  -S sortby      将系统调用统计计数按 time, calls, name, nothing (default time) 进行排序.
  -w             总结系统调用延迟(默认为系统时间)

Filtering:
  -e expr        限定表达式:option=[!]all 或 option=[!]val1[,val2]...
     options:    选项:trace、abbrev、verbose、raw、signal、read、write、fault、inject、kvm
  -P path        path 跟踪对 path 的访问, 如 strace -p 11436 -P /proc/my_debug 只跟踪此进程对此文件的访问,必须指定进程

Tracing:
  -b execve      在 execve 系统调用上 detach 分离
  -D             将跟踪进程作为独立的孙进程运行,而不是作为父进程
  -f             跟随 forks,如 strace -p 810 加上 -f 后每行就多了一个[pid   810]/[pid  2395]进行区分了。
  -ff            按照 fork 的方式将输出放入单独的文件中,如 strace -p 810 -ff -o a.txt 除了810放在a.txt中外,其它线程的都放在 a.txt.<tid> 中。
  -I 可中断
     1:          没有信号被阻塞
     2:          在解码系统调用时致命信号被阻塞(默认)
     3:          致命信号始终被阻塞(如果使用“-o FILE PROG”,则为默认)
     4:          致命信号和 SIGTSTP (^Z)总是被阻塞(对'strace -o FILE PROG'不被 ^Z 结束有用)

Startup:
  -E var         从命令环境变量中移除 var
  -E var=val     将 var=val 放入命令环境变量中
  -p pid         跟踪进程 ID 为 PID 的进程,可重复. 例如 strace -p <pid1> -p <pid2>
  -u username    以用户名身份运行命令,处理 setuid 和/或 setgid

Miscellaneous:
  -d             使能debug打印到stdserr中
  -v             详细模式:打印未缩写的 argv、stat、termios 等参数
  -h             打印帮助信息
  -V             打印版本
  
-d 启用 stderr 调试输出
-v 详细模式:打印未缩写的 argv、stat、termios 等参数
-h 打印帮助信息
-V 打印版本

 

二、使用例子

1. 跟踪某个任务的执行逻辑

sa8155:/data/local/tmp # strace -p 24220
write(3, "2", 1  //卡在这个位置后我执行的 kill -10 24220
)                        = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=24366, si_uid=0} ---
write(1, "HAM: sig=10\n", 12HAM: sig=10  //记录写入的大小和内容
)           = 12                         //这次write系统调用的返回值
rt_sigreturn({mask=[RTMIN]})            = 3  //又经历了一次 rt_sigreturn 的系统调用,返回值3
write(3, "2", 1  //再次 write("my_debug", 2, 1)


sa8155:/data/local/tmp # P=/sys/kernel/debug/tracing/; echo sys_enter > $P/set_event; echo sys_exit >> $P/set_event; echo "common_pid==24220" > $P/events/raw_syscalls/filter; > $P/trace; echo 1 > $P/tracing_on; cat $P/trace_pipe
restart_test-24220 [006] .... 14078.886740: sys_exit: NR 64 = -512
restart_test-24220 [004] .... 14078.887075: sys_enter: NR 64 (1, 784ee0d000, c, 5c45d596e0, 5c45d596ff, 784ee0d00c) //这个是写stdout
restart_test-24220 [004] .... 14078.887089: sys_exit: NR 64 = 12
restart_test-24220 [004] .... 14078.887230: sys_enter: NR 139 (c, 784ee0d000, c, 5c45d596e0, 5c45d596ff, 784ee0d00c)
restart_test-24220 [004] .... 14078.887241: sys_exit: NR -1 = 3
restart_test-24220 [004] .... 14078.887362: sys_enter: NR 64 (3, 7ffc4d1db8, 1, 10, 10, 8080808080808080) //这个是写my_debug文件


sa8155:/ # ls /proc/24220/fd/ -l
lrwx------ 1 root root 64 2025-05-07 15:40 0 -> /dev/pts/1
lrwx------ 1 root root 64 2025-05-07 15:40 1 -> /dev/pts/1
lrwx------ 1 root root 64 2025-05-07 15:40 2 -> /dev/pts/1
lrwx------ 1 root root 64 2025-05-07 15:40 3 -> /proc/my_debug


2. 执行系统调用统计功能

sa8155:/data/local/tmp # strace -p 810 -c
strace: Process 810 attached
^Cstrace: Process 810 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 40.74    1.535179          70     21724           ioctl
 27.26    1.027327          49     20716           close
 11.42    0.430368          29     14348           ppoll
 10.56    0.397729          54      7270        54 futex
  5.23    0.197183          28      6943         6 dup
  1.91    0.071879          70      1018       369 recvfrom
  1.28    0.048048          65       730           epoll_pwait
  0.54    0.020220          54       369           write
  0.42    0.015885          42       371           read
  0.26    0.009763          26       368           fcntl
  0.18    0.006928          61       113           madvise
  0.14    0.005222         118        44           munmap
  0.05    0.001897          75        25           mmap
  0.01    0.000331          55         6           writev
  0.00    0.000156          26         6           getuid
------ ----------- ----------- --------- --------- ----------------
100.00    3.768115                 74051       429 total

 

3. 直接加命令行

strace cat /proc/my_debug //比较靠后的两行umask(000)后才是这个进程的

 

posted on 2025-05-20 16:17  Hello-World3  阅读(43)  评论(0)    收藏  举报

导航