【Android】【問題分析】G-sensor因數據交互問題導致手機crash

G-sensor因數據交互問題導致手機crash

問題現象:

測試同事發現,手機在使用和待機時,低概率發現手機會crash,查詢log發現和g-sensor有關(該問題當時未記錄log,隻記錄瞭問題分析結果,類似問題僅供參考)

問題原因:

G-sensor在driver和HAL層因交互的參數不匹配,導致timeout引起的crash

詳細邏輯原因:

具體情況是在qcom的HAL層裡的sensors.cpp下的這個函數

int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)

在以下的時候,先會拿到鎖,然後有查到函數會在sm.readEvents()裡面耗費很大時間以致無法解鎖,才導致被kill掉。繼續往下調查

178 Mutex::Autolock _l(mLock);

179 int nb = sm.readEvents(slist[i].handle, data, count);

180 if (nb < 0) {

181 ALOGE("readEvents failed.(%d)", errno);

182 return nb;

 

進ReadEvent()裡面會因為下面這段導致不斷被循環,而這段循環的要求mEnable =1是ok的,而 numEventReceived隻有在上面一個循環裡面才會++,

291 if (numEventReceived == 0 && mEnabled == 1) {

292 n = mInputReader.fill(data_fd);

293 if (n)

294 goto again;

295 }

 

在操作numEventReceived變量的函數循環,發現在report事件的時候有如下循環:

257 case SYN_REPORT:

258 {

259 if(mUseAbsTimeStamp != true) {

260 mPendingEvent.timestamp = timevalToNano(event->time);

261 }

262 if (mEnabled) {

263 if(mPendingEvent.timestamp >= mEnabledTime) {

264/* [BUFFIX]-Mod- Begin by TCTNB.XQJ,PR-915938, 2015/2/11, from AKM fae modify,for cts test */

265 raw = mPendingEvent;

266 if (algo != NULL)

267 {

268 if (algo->methods->convert(&raw, NULL, NULL)) {

269 ALOGE("Calibration failed.");

270 }

271 }

272/* [BUFFIX]-Mod- End by TCTNB.XQJ*/

273 *data++ = mPendingEvent;

274 numEventReceived++;

275 }

如紅色部分,這裡的函數就無法進入,但在report的case裡面,有SYN_TIME_NSEC下有如下操作

245 case SYN_TIME_SEC:

246 {

247 mUseAbsTimeStamp = true;

248 report_time = event->value*1000000000LL;

249 }

250 break;

251 case SYN_TIME_NSEC:

252 {

253 mUseAbsTimeStamp = true;

254 mPendingEvent.timestamp = report_time+event->value;

這樣才能理順這個流程。而如果流程中間卡主,在長事件卡在循環裡面,如果7-8秒,會導致無法喚醒,更長時間會導致system crash掉。

Best regards,

You May Also Like