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