一、初步分析結論
sensorservice多線程機制存在問題,導緻在disable accel sensor并釋放相應記憶體和資料之後,
有很小的機率發生繼續讀取到未處理完的sensor事件,進而繼續使用相應的記憶體和資料,
并且沒有做相應的防禦保護措施,最終引起指針位址操作錯誤。
二、解決方案
1、首先在可能發生錯誤的地方做好防禦保護措施
2、對多線程進行同步,對于臨界變量的操作都放置到臨界區中,使用鎖來保護。
三、具體分析過程
log中顯示打出accel sensor被disable的資訊,然後接着1ms sensorservice就crash。

Disable accel sensor會先登出listener并釋放相應記憶體,然後再調用具體的sensor的hal去disable,具體代碼如下:
登出listener時會釋放記憶體和資料:
真正發生位址操作失敗的代碼并沒有進行相應的判空保護,如果781行得到的是0,那麼783的item也是0,它的成員ctx相對偏移是8,在對8進行尋址和成員操作時就出現了記憶體錯誤,因為8不是一個有效的資料對象位址,具體如下: