**發現問題: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);
到此問題就順利的解決了。