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) 收藏 举报
浙公网安备 33010602011771号