欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SIGPIPE(Signal?13,?Code?0)?異常排查及處理

 更新時間:2023年01月29日 14:00:17   作者:yuec  
這篇文章主要為大家介紹了SIGPIPE(Signal?13,?Code?0)?異常排查原因解析及處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

問題現(xiàn)象

最近一個版本 APP 更新之后,sentry 大量異常數(shù)據(jù)上報,影響用戶的數(shù)量非??鋸?10w +,具體報錯如下

排查過程

首先查看 SIGPIPE 的報錯原因, 在官網(wǎng)搜索到了相關(guān)信息

大意是 Socket 連接關(guān)閉后,如果客戶端仍在發(fā)送數(shù)據(jù),這個時候就會產(chǎn)生 SIGPIPE 信號,如果信號沒有被處理就會產(chǎn)生崩潰,這里截取了部分關(guān)鍵信息。

文檔上說可以使用 signal(SIGPIPE, SIG_IGN) 全局忽略,確認客戶端添加了該邏輯,但是異常還是上報到了 sentry。signal 這個函數(shù)是給信號關(guān)聯(lián)一個 handler,收到這個信號的時候去執(zhí)行。 SIG_IGN 是系統(tǒng)提供的忽略信號的處理方式,定義如下:

#define SIG_IGN         (void (*)(int))1

嘗試手動觸發(fā) SIGPIPE, 運行后可以正常輸出。

void signalHandler(int signal) {
    printf("bingo");
}
int main(int argc, char * argv[]) {
    signal(SIGPIPE, signalHandler);
    kill(getpid(), SIGPIPE);
}

多次添加 handler 繼續(xù)嘗試, 控制臺輸出 333, 也就是說只有最后添加的 handler 會執(zhí)行到,比較容易理解一個信號只能關(guān)聯(lián)一個 handler。

void signalHandler(int signal) {
    printf("111");
}
void signalHandler2(int signal) {
    printf("222");
}
void signalHandler3(int signal) {
    printf("333");
}
int main(int argc, char * argv[]) {
    signal(SIGPIPE, signalHandler);
    signal(SIGPIPE, signalHandler2);
    signal(SIGPIPE, signalHandler3);
    kill(getpid(), SIGPIPE);
}

現(xiàn)狀是 sentry 可以捕獲并處理這個異常,所以此時懷疑是 sentry 把客戶端的處理給覆蓋了。

查看 sentry 里面的邏輯,sentry 使用了 sigaction 函數(shù)關(guān)聯(lián) handler,這個函數(shù)與 signal 函數(shù)一樣,可以設(shè)置與信號 sig 關(guān)聯(lián)的動作,而 oact 如果不是空指針的話,就用它來保存原先對該信號的動作的位置,act 則用于設(shè)置指定信號的動作。sentry 關(guān)聯(lián)了自己的處理 handleSignal 并且會把之前的handler 存儲到數(shù)組 g_previousSignalHandlers 里面。

int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
// sentry 關(guān)聯(lián)的 action 為 handleSignal
sigaction(fatalSignals[i], &action, &g_previousSignalHandlers[i])

sentryhandleSignal 里面上報異常并且執(zhí)行了了 sentrycrashcm_handleException,然后使用 raise 重新拋出這個信號。

static void handleSignal(int sigNum, siginfo_t *signalInfo, void *userContext)
{
    SentryCrashLOG_DEBUG("Trapped signal %d", sigNum);
    if (g_isEnabled) {
        // 這里省略上報邏輯
        sentrycrashcm_handleException();
    }
    SentryCrashLOG_DEBUG("Re-raising signal for regular handlers to catch.");
    // This is technically not allowed, but it works in OSX and iOS.
    raise(sigNum);
}

查看 handleException 簡化后的調(diào)用棧:

void sentrycrashcm_handleException(**struct** SentryCrash_MonitorContext *context)
{
    sentrycrashcm_setActiveMonitors(SentryCrashMonitorTypeNone);
}
void sentrycrashcm_setActiveMonitors(SentryCrashMonitorType monitorTypes)
{
    // isEnabled = false
    setMonitorEnabled(monitor, isEnabled);
}
static inline void setMonitorEnabled(Monitor *monitor, bool isEnabled) {
    uninstallSignalHandler();
}
static void uninstallSignalHandler(void) {
    sigaction(fatalSignals[i], &g_previousSignalHandlers[i], **NULL**);
}

可以看到 handleException 這個函數(shù)最終會重新關(guān)聯(lián)保存在 g_previousSignalHandlers里面的 handler,也就是客戶端設(shè)置的 SIG_IGN 默認忽略。sentry 關(guān)聯(lián)的函數(shù) handleSignal 會在處理完會重新拋出信號,這個信號會觸發(fā) SIG_IGN,所以這里并不存在覆蓋關(guān)系,sentry 不會影響到客戶端默認忽略的邏輯。

綜上客戶端設(shè)置的 SIG_IGN 是會生效的,sentry 只是上報了異常,并沒有崩潰產(chǎn)生。在 APP 里面手動觸發(fā) SIGPIPE,Charles 抓包可以看到 sentry 上報,APP 未出現(xiàn)崩潰。

原因與處理

和多個業(yè)務(wù)方確認這個版本并沒有 socket 相關(guān)的改動,那為什么在這個版本之后突然有大量異常上報呢?

后面 diff 代碼發(fā)現(xiàn)是改動了 sentry 的初始時機造成的。之前的邏輯是 sentry 初始化,客戶端調(diào)用 signal 關(guān)聯(lián) SIG_IGN,這個時候 SIG_IGN 覆蓋了 sentrysignalHandler,并且沒有保存和恢復(fù)之前 handler 的邏輯,sentry 捕獲不到信號不會上報,當前版本的改動使這個順序顛倒了,導(dǎo)致了大量異常數(shù)據(jù)上報。后續(xù)嘗試去定位具體的 socket 無果,重新修改了順序 SIG_IGNsentry 初始化之后關(guān)聯(lián),之后的版本不再有異常數(shù)據(jù)上報。

以上就是SIGPIPE(Signal 13, Code 0) 異常排查及處理的詳細內(nèi)容,更多關(guān)于SIGPIPE異常排查的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • iOS實現(xiàn)圓角箭頭視圖

    iOS實現(xiàn)圓角箭頭視圖

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)圓角箭頭視圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • iOS開發(fā)之TableView實現(xiàn)完整的分割線詳解

    iOS開發(fā)之TableView實現(xiàn)完整的分割線詳解

    在iOS開發(fā)中, tableView是我們最常用的UI控件之一。所以這篇文章主要給大家詳細介紹了關(guān)于iOS中的TableView分割線,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • iOS App開發(fā)中使用及自定義UITableViewCell的教程

    iOS App開發(fā)中使用及自定義UITableViewCell的教程

    這篇文章主要介紹了iOS App開發(fā)中使用及自定義UITableViewCell的教程,自定義TableViewCell文中使用Objective-C演示而非ib,需要的朋友可以參考下
    2016-04-04
  • ios中圖像進行壓縮方法匯總

    ios中圖像進行壓縮方法匯總

    在Iphone上有兩種讀取圖片數(shù)據(jù)的簡單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函數(shù)需要兩個參數(shù):圖片的引用和壓縮系數(shù).而UIImagePNGRepresentation只需要圖片引用作為參數(shù).
    2015-05-05
  • iOS WKWebView無法處理URL Scheme和App Store鏈接的問題解決

    iOS WKWebView無法處理URL Scheme和App Store鏈接的問題解決

    這篇文章主要給大家介紹了關(guān)于iOS WKWebView無法處理URL Scheme和App Store鏈接的問題解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • iOS中Label實現(xiàn)顯示不同顏色與字體的方法

    iOS中Label實現(xiàn)顯示不同顏色與字體的方法

    這篇文章主要給大家介紹了關(guān)于在iOS中Label實現(xiàn)顯示不同顏色與字體的相關(guān)資料,文中分別介紹了利用range或者文字兩種實現(xiàn)的方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • iOS應(yīng)用開發(fā)中SQLite的初步配置指南

    iOS應(yīng)用開發(fā)中SQLite的初步配置指南

    這篇文章主要介紹了iOS應(yīng)用開發(fā)中SQLite的初步配置指南,SQLite是一個極輕量級可作嵌入式的數(shù)據(jù)庫,非常適合入門開發(fā)者使用,需要的朋友可以參考下
    2015-12-12
  • iOS開發(fā)之App主題切換解決方案完整版(Swift版)

    iOS開發(fā)之App主題切換解決方案完整版(Swift版)

    這篇文章主要為大家詳細介紹了iOS開發(fā)之App主題切換完整解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • iOS UIView常見屬性方法小結(jié)

    iOS UIView常見屬性方法小結(jié)

    本文通過實例代碼給大家詳細介紹了iOS UIView常見屬性方法,非常不錯,需要的朋友參考下吧
    2016-12-12
  • ios開發(fā)加載webview顯示進度條實例

    ios開發(fā)加載webview顯示進度條實例

    本篇文章主要介紹了ios開發(fā)加載webview顯示進度條實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論