宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

正文目录:

strace概述strace的两种启动方法跟踪nginx示例的系统调用返回错误的示例。 它还跟踪每个系统调用对时间、调用次数和错误次数的获取信号进行计数的系统调用。 其他

strace 简介

strace可用于跟踪进程与内核的交互情况,包括系统调用、信号和进程状态。

strace经常用于轮廓、问题定位等场景。

strace是基于linux内核特性ptrace开发的,相当于直接对系统调用进行了hook。 这意味着strace可以跟踪所有用户进程,即使没有跟踪程序的源代码,即使程序是非debug版本,程序日志不完整,也可以在strace中跟踪许多有用的信息

strace 的两种启动方式

之一是使用strace启动被跟踪的程序。 例如:

# #跟踪一次执行的ls命令

$strace ls /etc/nginx/

另一种方法是通过给-p加上进程号来跟踪启动的进程。

$strace -p 14735

跟踪:进程14735连接

.

追踪 nginx 示例

所有的网络I/o、文件I/o操作、基础都与系统调用有关。 用nginx的例子进行说明。

在我的博客服务器上使用strace跟踪nginx工作器的情况:

# 14735是nginx工作器的进程号。 服务器配置低,只启动了一个工作器进程。

$strace -p 14735

跟踪:进程14735连接

epoll_wait11个,

如果没有请求,strace打印将停留在epoll_wait中并等待网络事件。

在本地向远程服务器发送请求。

$ wget https://pengrl.com/sitemap.XML

strace打印大量的信息。 我剪下了内容的一部分:

.

# #各系统调用有参数值、返回值

请注意,wget客户端的ip和端口以及连接的文件描述符为5

accept48,{sa_family=AF_INET,sin_port=htons ) 58442,sin _ addr=inet _ addr 111.196.59.95 )。

正在使用EPOLLET模式

Epoll_CTL11,EPOLL_CTL_ADD,5,{ epoll in|epoll et,{u32=716806128,u64=93944536471536}} )

# #打开本地的sitemap.xml文件,读取文件的内容。 共计9635个字节

open /data/pengrl.com/sitemap.XML ),o _ rd唯一| o _ non block )=17

pread6417,’? XML版本=\’ 1.0\’编码=\’ ut ‘ .9635,0 )=9635

# #向客户端发送了文件内容

write5,’\27\3\243\372\320\334\241\241\246\241\203\r\241\247\342 \350 )

# #在日志文件中写入了内容

写3,’ 111.196.59.95– [ 12/Feb/2020:1 ‘ .121]=121

使用# # #无阻塞模式

setsockopt5,SOL_TCP,TCP _节点,[1],4 )=0

# #已关闭此连接

关闭5)=0

.

如果要打印日志中写入的所有内容,可以使用以下命令:

# 3是nginx进程写入日志的文件描述符

$ strace-p 14735-e写入=3

再次进行wget时,将得到如下结果。

写3,’ 111.196.59.95– [ 12/Feb/2020:1 ‘ .121]=121

| 00000313131312 e 3139362 e 3539392 e 39393935202 d 20111.196.59.95-|

| 000102 d 205 b 31322 f 4665622 f 32303230303 a 31-[ 12/Feb/2020:1 |

| 00020313131313535 a 3034202 b 303830303030305 d 202213360153360040800 |

| 00030474554202 f 73697465 d 61702 e 786 D6厘米/秒地图. XML |

| 0004020485454502 f 312 e 3122203230302039 HTT

P/1.1″ 200 9 |
| 00050 36 33 35 20 22 2d 22 20 22 57 67 65 74 2f 31 2e 635 “-” “Wget/1. |
| 00060 31 39 2e 31 20 28 64 61 72 77 69 6e 31 35 2e 36 19.1 darwin15.6 |
| 00070 2e 30 29 22 20 22 2d 22 0a .0)” “-“. |

系统调用返回错误示例

比如使用 cat 命令打开一个不存在的文件:

$strace cat /etc/nginx/nginx.conf.notexist

在 strace 的输出中将看到:


open”/etc/nginx/nginx.conf.notexist”, O_RDONLY) = -1 ENOENT No such file or directory)

exit_group1) = ?
+++ exited with 1 +++

可以看到,open 系统调用返回的错误值及对应的错误信息。并且,cat 在打开不存在的文件时,exit code 是 1。如果打开文件成功,exit code 则是 0。

还有哪些系统调用

strace 的-e trace=参数,可以追踪特定系统调用。借由这个参数列表,我们也可以看看还有哪些系统调用:

-e trace=%desc Trace all file descriptor related system calls.
%file Trace all system calls which take a file name as an argument.
%fstat Trace fstat and fstatat syscall variants.
%fstatfs Trace fstatfs, fstatfs64, fstatvfs, osf_fstatfs, and osf_fstatfs64 system calls.
%ipc Trace all IPC related system calls.
%lstat Trace lstat syscall variants.
%memory Trace all memory mapping related system calls.
%network Trace all the network related system calls.
%process Trace all system calls which involve process management.
%pure Trace syscalls that always succeed and have no arguments.
%signal Trace all signal related system calls.
%stat Trace stat syscall variants.
%statfs Trace statfs, statfs64, statvfs, osf_statfs, and osf_statfs64 system calls.
%%stat Trace syscalls used for requesting file status.
%%statfs Trace syscalls related to file system statistics.

我们尝试使用一个:

$strace -e trace=memory ls /etc/nginx/

brkNULL) = 0x11d4000
mmapNULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f881f8a2000
mmapNULL, 23250, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f881f89c000

统计每个系统调用的耗时,调用次数,错误次数

$strace -c ls /etc/nginx/

% time seconds usecs/call calls errors syscall
—— ———– ———– ——— ——— —————-
22.16 0.000082 3 28 mmap
19.19 0.000071 4 18 mprotect
12.70 0.000047 4 11 open
8.65 0.000032 3 10 read
7.57 0.000028 9 3 munmap
6.49 0.000024 12 2 getdents
4.05 0.000015 5 3 write
3.24 0.000012 6 2 2 statfs
2.97 0.000011 1 14 close
2.97 0.000011 1 12 fstat
2.16 0.000008 4 2 1 stat
1.62 0.000006 3 2 ioctl
1.62 0.000006 3 2 1 access
1.35 0.000005 5 1 execve
0.81 0.000003 1 3 brk
0.81 0.000003 3 1 openat
0.54 0.000002 1 2 rt_sigaction
0.27 0.000001 1 1 rt_sigprocmask
0.27 0.000001 1 1 getrlimit
0.27 0.000001 1 1 arch_prctl
0.27 0.000001 1 1 set_tid_address
0.00 0.000000 0 1 set_robust_list
—— ———– ———– ——— ——— —————-
100.00 0.000370 121 4 total

捕获信号

打开一个 tcp 监听进程:

$nc -l 8888

使用 strace 追踪这个进程:

$strace -p $pidof nc)

kill 掉这个进程:

$kill -9 $pidof nc)

strace 的输出:

strace: Process 12377 attached
select5, [3 4], [], NULL, NULL <unfinished …>
+++ killed by SIGKILL +++

其他

strace 还有许多其他的参数,比如常用的-tt可以打印每个系统调用的时间戳,-T可以打印每个系统调用花费的时间。

strace 不光能追踪统计系统调用,还能修改系统调用的行为,比如指定某个系统调用返回指定的错误值。

关于更多 strace 的玩法,可以使用strace -h命令或访问如下两个网站获取更多的信息:

http://www.man7.org/linux/man-pages/man1/strace.1.htmlhttps://strace.io/

linux 调试linux调试工具-风君子博客