1. 程式人生 > >【Android】【問題分析】G-sensor因資料互動問題導致手機crash

【Android】【問題分析】G-sensor因資料互動問題導致手機crash

通過工作抓取到的kernel層的log(截選重要部分)如下顯示:

<6>[ 7040.264871] SysRq: Show backtrace of all active CPUs

<6>[ 7040.264925]Backtrace for cpu 0 (current):

<6>[ 7040.264946] CPU: 0PID: 4667 Comm: watchdog Tainted: P       W  O3.10.49-g8347c3d-00015-g4c1aa2f #1

<6>[ 7040.265001][<c00132f8>] (unwind_backtrace+0x0/0xe0) from [<c0011084>](show_stack+0x10/0x14)

<6>[ 7040.265023][<c0011084>] (show_stack+0x10/0x14) from [<c00125c8>](smp_send_all_cpu_backtrace+0x50/0xcc)

<6>[ 7040.265045][<c00125c8>] (smp_send_all_cpu_backtrace+0x50/0xcc) from[<c02fbfec>] (__handle_sysrq+0x9c/0x140)

<6>[ 7040.265066][<c02fbfec>] (__handle_sysrq+0x9c/0x140) from [<c02fc3f4>](write_sysrq_trigger+0x38/0x48)

<6>[ 7040.265090][<c02fc3f4>] (write_sysrq_trigger+0x38/0x48) from [<c013c124>](proc_reg_write+0x6c/0x80)

<6>[ 7040.265113][<c013c124>] (proc_reg_write+0x6c/0x80) from [<c00f66fc>](vfs_write+0xd0/0x180)

<6>[ 7040.265134][<c00f66fc>] (vfs_write+0xd0/0x180) from [<c00f6bb8>](SyS_write+0x38/0x68)

<6>[ 7040.265152][<c00f6bb8>] (SyS_write+0x38/0x68) from [<c000d700>](ret_fast_syscall+0x0/0x30)

<6>[ 7040.265161]

<6>[ 7040.265161]sending IPI to all other CPUs:

<4>[ 7040.265180] IPIbacktrace for cpu 1

<6>[ 7040.265192]

<6>[ 7040.265205] CPU: 1PID: 831 Comm: SensorService Tainted: P       W  O3.10.49-g8347c3d-00015-g4c1aa2f #1

<6>[ 7040.265215] task:ebce7380 ti: ebf3a000 task.ti: ebf3a000

<6>[ 7040.265231] PC isat sub_preempt_count+0x14/0xd4

這段log提供了,從kernellog的時間點看7040打印出堆疊異常資訊,換算對應於logcat的19:11:27秒打印出了watchdog 和sensor service的 堆疊,而kernel沒有掛掉,僅僅打印出異常堆疊資訊,logcat 在19:11:20 秒的時候 watchdog 已經被PowerManagerService block住的資訊,而log被儲存在了“ Wrote stack traces to'/data/anr/traces.txt'”下 。隨即列印主動watchdog 的堆疊(即kernel log的 7040s列印的堆疊資訊)“01-01 19:11:27.258   767  4667 I Watchdog_N: dumpKernelStac。而且sensorservice的堆疊資訊。所以應該是PowerManagerService 被block主了,要看下/data/anr/traces.txt'的資訊。Logcat 裡面多次 “watchdog: Blocked in handler onmain thread (main), Blocked in handler on PowerManagerService(PowerManagerService)”而引發kernel 列印堆疊。

同時上層也有抓到具體重啟的原因是Watchdog: *** WATCHDOGKILLING SYSTEM PROCESS: Blocked in handler on main thread (main), Blocked inhandler on PowerManagerService (PowerManagerService)

追溯“Blocked in handler on main thread(main), Blocked in handler on PowerManagerService (PowerManagerService)”來源於下段函式任務沒完成或者time out導致。

// something is overdue!

                blockedCheckers =getBlockedCheckersLocked();

                subject =describeCheckersLocked(blockedCheckers);

                allowRestart = mAllowRestart;

if (hc.isOverdueLocked()) {

                checkers.add(hc);

            }

public booleanisOverdueLocked() {

            return (!mCompleted) &&(SystemClock.uptimeMillis() > mStartTime + mWaitMax);

        }

預設的超時時間是6s,也可以呼叫函式時傳入,現在看來應該是傳入的資料,而HAL層的資料都是由輪詢的方式由底層傳入。

static final longDEFAULT_TIMEOUT = DB ? 10*1000 : 60*1000;

static final boolean DB =false;

於是鎖定在了PhoneWindowManager.goingToSleep()這裡和PhoneWindowManager.screenTurnedOff()持有同一個同步鎖導致。screenTurnedOff 在等待 goingToSleep 釋放鎖,於是導致系統卡在android.hardware.SystemSensorManager$BaseEventQueue.nativeDisableSensor。最後被watchdog 殺掉。