一、在工作中遇到的问题
当我利用XCode中的Instrument对我的app做自动化测试的时候,有时候会发生app的crash,这种crash的原因是signal SIGPIPE错误。这种错误就能够引起APP的Crash.
二、探究问题的原因
在app请求Service端视图建立TCP连接时,往往需要多次请求,中间会有失败的请求。所以服务器会经常去close一个连接,在TCP连接中,client会受到一个RST响应。之前如果client已发出数据,系统会发出SIGPIPE信号给client进程,告诉进程这个连接已经失效,不要再去写数据了。若根据默认规则,应用程序进程会被terminate,client的进程会退出。根据测试的现象来看,IOS应用程序并没有直接退出,而是是做了SIGPIPE信号屏蔽处理,屏蔽处理让app收到SIGPIPE信号之后不会crash。但是会在进行debug调试时触发debug中断,正如上述现象。
三、解决方法
要从根本上解决这个问题,需要服务端与客户端协同进行修改处理。但是在客户端别人提供了个临时解决的办法,就是在调试入口设置断点,让debug console进入
gdb或是lldb状态。我们IOS开发使用的是LLVM,所以使用process handle SIGPIPE -s false。
gdb
handle SIGPIPE nostop
lldb
process handle SIGPIPE -s false
如图所示: