**发现问题:
在偶然调试APP(一款用于链接行车记录仪来播放和下载视频)的时候,在iOS 13系统上发现当处于播放视频状态的时候:
1)切换到后台然后再切换会前台
2)息屏之后再解锁手机
进行如上两种操作的时候会出现APP直接退出的情况(闪退现象),但与平常闪退情况不同的是,链接编译器调试的时候,编译器不会捕捉到相关的crash信息,编译器与手机的链接会直接中断。
编译器只给出 Message from debugger: Terminated due to signal 13 这个错误信息。
接下来就只有顺着signal 13信号这个线索进行研究。
**在 signal.h 文件中, 可以发现其定义如下:
简单来讲就是管道破裂。
管道破裂,这个信号通常在进程间通信产生,比如采用 FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到 SIGPIPE 信号. 此外用 Socket 通信的两个进程,写进程在写 Socket 的时候,读进程已经终止. 另外, 在 send/write 时会引起管道破裂,关闭 Socket, 管道时也会出现管道破裂. 使用 Socket 一般都会收到这个 SIGPIPE 信号.
简单来说就是和socket通信以及数据的读写相关联。这样一来就能大体猜到为什么在切换到前台或者重新解锁手机的时候出现crash现象了。
**接下来就顺着这个思路解决问题了:
signal 13 这种错误是系统发出来的, 和内存使用异常和野指针一样,由于是系统级别崩溃,所以不能通过
@try,catch捕获异常。
所以try,catch不能解决这个问题。
但是幸运的是,我们在苹果的开发者文档 (Avoiding Common Networking Mistakes developer.apple.com/library/arc…)中发现了相关的解决方案。
文档提供了两种解决方案:
1、 忽略这类信号。
2.修改socket通信的源码
当然最完美的解决方案还是从源头上进行根除,修改相关的源码。但是限于我们的音视频SDK问题,只能选择方案一,忽略此信号。 方案一解决的方式非常简单,只需要在你调用你的SDK之前,调用如下代码signal(SIGPIPE, SIG_IGN);
到此问题就顺利的解决了。
网友评论