今天测试发现了一个 bug , app 大概每 2 分钟就会重启一次。看了下 log 。分析了下原因。
先说下我们这边的需求:
- 我们有个需求,就是在
api
请求失败的时候,需要把请求失败的原因上报给服务器。 - 上报请求失败的原因也是一个
api
,它的错误也会上报。
在此 2 条需求基础上,仔细想一想,其实有很大的问题,主要漏洞是会造成一个循环的调用。这个循环调用的逻辑如下:
- 某个
api
请求报错 - 触发上报错误请求
- 上报错误请求也发生了错误
- 触发下一次的上报错误请求
- 重复 3 - 4 步
当这种情况发生的时候,发生 OutOfMemeory
错误就不难理解了,因为在上报错误请求的时候,申请了比较多的内存,导致短时间内没有内存可以用。
虽然原因找到了,但是奇怪的是为什么上报错误请求会失败?以前没有发现过类似的错误。
我们在上报错误请求里面做了一些容错处理,比如没有网络的时候就不上传。可是我们看 log 发现,网络是连接的,而且后台是正常的,因为其他设备都是正常的,后台同学排查后台是好的。
这就很诡异了,后来在排查的时候,发现打印的 error
信息是 can not send to 192.168.xxx.xxx outtime xxx
,这个 ip
看着像是一个局域网的 ip
。联想到,之前报了一个 bug ,大概是连接 wifi 后,给设备设置代理(随意设置局域网里面的任意设备 ip ),然后无法播放视频,不设置代理就是好的。
初步认定是设置了代理,但是代理(任意设置局域网 ip)没有转发请求的能力,导致请求发送不成功。然后网络是联通的,不会触发上报错误请求停止,最终导致了循环调用,无限消耗资源,导致 OutOfMemory
错误。