这周在新的产品版本上线后,发现监控日志总是会报recv()返回error,并且errno是131(ECONNRESET)。查了一下man手册,发现并没有说recv()会返回ECONNRESET,于是自己便打算一探究竟。想到最近正在学习Dtrace,于是便写了下面这个简单脚本(check_recv.d):
#!/usr/sbin/dtrace -qs syscall::recv:return /(int)arg0 <=0 && pid == $1/ { printf("recv return: tid=%d, arg0=%d, errno=%d\n", tid, arg0, errno); }
if (recv() <= 0) { log(errno) }
if (recv() < 0) { log(errno) }