参考:https://database.51cto.com/art/202006/617923.htm
strace简介
strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用。
Strace是一个简单的跟踪系统调用执行的工具。在其最简单的形式中,它可以从开始到结束跟踪二进制的执行,并在进程的生命周期中输出一行具有系统调用名称,每个系统调用的参数和返回值的文本行。
常用选项
- -T:strace输出显示时间
- -t:可以在每行的输出之前添加时间戳,-tt可以精确到微妙级别,-ttt也可以精确到微妙级,但是它并不是打印当前时间,而是显示自从epoch以来的所经过的秒数
- -s:指定输出的字符串的最大长度,默认为32,如果输出到文件的话会全部输出
- -o:指定将strace输出到文件
- -ff:如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
- -e:指定跟踪某个行为,例如-e trace=open指定只跟踪open行为
- -y:将文件句柄用文件路径代替显示
正确姿势
简单使用
- strace -T -tt -o /tmp/strace.log CMD
- strace -T -tt CMD 2>&1 |tee /tmp/strace.log
- strace -T -tt -s 100 -o /tmp/strace.log CMD
- strace -T -tt -s 100 -ff -o /tmp/strace.log CMD
- strace -T -tt -s 100 -e trace=XXXX -o /tmp/strace.log CMD
使用案例
利用strace观察客户端client执行SQL
通过sys.processlist表中pid可以知道客户端连接pid
mysql> select thd_id,conn_id,user,pid,command,current_statement,program_name from sys.processlist where conn_id>0 and pid >0;
+--------+---------+----------------+--------+---------+-------------------------------------------------------------------+--------------+
| thd_id | conn_id | user | pid | command | current_statement | program_name |
+--------+---------+----------------+--------+---------+-------------------------------------------------------------------+--------------+
| 218265 | 218238 | root@localhost | 103440 | Query | select thd_id,conn_id,user,pi ... t where conn_id>0 and pid >0 | mysql |
+--------+---------+----------------+--------+---------+-------------------------------------------------------------------+--------------+
1 row in set (0.33 sec)
#session1
[root@localhost scripts]# strace -T -tt -s 100 -o /tmp/strace.log -p103440
strace: Process 103440 attached
#session2
mysql> use test
Database changed
mysql> select *from t1 limit 2;
+----+--------------------------------------+
| id | name |
+----+--------------------------------------+
| 1 | 137b97ba-6de1-11eb-91cf-000c29a5b3f5 |
| 2 | 13d6586d-6de1-11eb-91cf-000c29a5b3f5 |
+----+--------------------------------------+
2 rows in set (0.00 sec)
查看strace文件
[root@localhost tmp]# vi /tmp/strace.log
11:37:35.114324 write(1, "\r\33[15G*from t1 limit 2;\33[K", 26) = 26 <0.000846>
11:37:35.115354 read(0, "\n", 1) = 1 <0.624789>
11:37:35.740309 write(1, "\n", 1) = 1 <0.000850>
11:37:35.741471 ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0 <0.000025>
11:37:35.741701 rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM CONT TSTP WINCH], [], 8) = 0 <0.000022>
11:37:35.741814 rt_sigactio