android signal 處理總結

2021-08-27 15:40:05 字數 1376 閱讀 3348

在android 開發中遇到一些signal 的情況,簡要總結如下:

1)zygote 監控 子程序的退出情況

jellybean/dalvik/vm/native/dalvik_system_zygote.cpp#151

151 sa.sa_handler = sigchldhandler;

153 err = sigaction (sigchld, &sa, null);

當程序結束的時候,log 中有類似下面的訊息,這就是 zygote列印出來,它會報告子程序被什麼 signal 終結的

d zygote : process 749 terminated by signal (11)

2)dvm 生成單獨的訊號處理執行緒,用來對三個訊號做特殊處理:

每個程序包含多個執行緒,當程序受到 signal 的時候,可能被其中任何乙個執行緒處理

乙個應用執行在虛擬機器上dvm上乙個應用也是乙個dvm 程序,dvm 專門建立了乙個訊號處理執行緒來處理這3個訊號,其他的執行緒都要block對這三個訊號的處理。

這三個訊號是 sigquit, sigusr1, sigusr2, 看下面**,後面兩個訊號 vm 內部要使用

dalvik/vm

/init.cpp

static void blocksignals()  

為何處理 quit

android 應用在收到異常終止訊號(sigquit)時,沒有遵循傳統 unix訊號模型的預設行為 (終止 + core )。而是列印出trace 檔案來,以利於記錄應用異常終止的原因。 參考

3) 其他基於 bionic 的應用,都被 android 動了手腳

android的實現是在 main 執行之前 先執行 debugger_init 方法,以實現攔截系統異常的幾個singal:sigill, sigabrt, sigbus, sigfpe, sigsegv和sigpipe, **位於: bionic/linker/debugger.c, 把 debugger_init 注入 是通過在 linker 中做手腳 (bionic/linker/linker.c#2255)

而後當程式收到那幾個訊號後,不是安裝 linux 預設的處理方法,而是執行 debugger_init 中設定的訊號處理方法,此方法就是和 debuggerd (守護程序)通訊,通過socket告訴其 tid ,

而後 debuggerd 通過呼叫

tid_attach_status= ptrace(ptrace_attach, tid, 0, 0);

這裡,debuggerd就掛上ptrace了,attach到出問題的執行緒,debuggerd程序就是被除錯程序的父程序了,這樣debuggerd就可以控制tid執行緒了,最終生成 tomestone的資訊

android signal 處理總結

在android 開發中遇到一些signal 的情況,簡要總結如下 1 zygote 監控 子程序的退出情況 jellybean dalvik vm native dalvik system zygote.cpp 151 151 sa.sa handler sigchldhandler 153 er...

海量處理處理

1.單詞統計 假設你只有一台記憶體2g的筆記本,i5的四核cpu以及4t的硬碟,請設計乙個程式,實現對1t英文資料進行詞頻分析,完成以下兩個小題 1 求所有詞的詞頻,把相應的值存入檔案 2 找出這些詞裡賣弄出現頻次最高的100個詞,並用 實現 名詞解釋 1t 1024g,為硬碟空間單位,詞頻,每個單...

批處理 sleep處理

echo off echo q debug nul echo bj jzh 0x ppppppa de dm do dh ls lu lx lezrr eeeuyrx2dx sleep.com echo 0dxfp,0xx.t0p,xtgsb4o piyu wwx0gwuy wv ovbx2gv0e...