PHP调试工具-Strace

作者 Gavin 日期 2015-09-06
PHP调试工具-Strace

昨天的时候,刚好看了下php调试方面的东西,正好看到了Strace,没想到今天就用上了.

今天,补单程序突然出现bug,有两笔订单掉单了却没有补单成功.

  • 首先,查了下 补单脚本
1
2
ps -ef|grep Patch
xx 32687 3224 0 Aug20 ? 00:00:48 ...

补单脚本是守护进程控制的,但是看到这个时间点 Aug20,说明8.20日之后,脚本没有自动关闭,一直在执行. 所以就想看看是什么原因导致了脚本一直执行而没有退出.

  • 使用 Strace 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
strace -p 32687
restart_syscall(<... resuming interrupted call ...>) = 0
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000^C <unfinished ...>

可以看到,程序一直卡在curl超时上,然后检查了下补单相关的 curl 操作,发现大多数的 curl 没有加入连接超时时间,当DNS出现问题时,一直在等待服务器的回应,导致脚本调用的时候卡死.

总结一下:Strace 还有很多用法,比如查看一段时间内调用系统函数最多的统计等等,strace -p 进程ID 是查看该进程的系统函数调用情况,对于异步脚本很有用! 很多strace的用法以后会再更新~


参考资料:

  1. php curl调用的时候卡死,strace结果如内