可以在 framwork source 中,加入 dumpStack( ),這樣就可以找出 caller..
舉例來說,想知道 短按 power button 時,system suspend 的動作是誰 call 的。
只知道最後 作 setScreenState( ) 是實際寫入 kernel interface 的 function。
所以在 PowerManagerService.java 的 setScreenStateLocked() 加入:
import java.lang.Thread;
....
Thread.currentThread().dumpStack();
然後suspend 時,logcat 就會有:
/System.err( 2417): java.lang.Throwable: stack request_suspend_state: mem (0->3) at 98046449377 (1970-01-02 00:26:25.141454751 UTC)
dump
W/System.err( 2417): at java.lang.Thread.dumpStack(Thread.java:577)
W/System.err( 2417): at com.android.server.PowerManagerService.setScreenStateLocked(PowerManagerService.java:1629)
W/System.err( 2417): at com.android.server.PowerManagerService.screenOffFinishedAnimatingLocked(PowerManagerService.java:1817)
W/System.err( 2417): at com.android.server.PowerManagerService.access$4300(PowerManagerService.java:82)
W/System.err( 2417): at com.android.server.PowerManagerService$BrightnessState.finishAnimationLocked(PowerManagerService.java:2079)
W/System.err( 2417): at com.android.server.PowerManagerService$BrightnessState.stepLocked(PowerManagerService.java:2062)
W/System.err( 2417): at com.android.server.PowerManagerService$BrightnessState.run(PowerManagerService.java:2088)
W/System.err( 2417): at android.os.Handler.handleCallback(Handler.java:587)
W/System.err( 2417): at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err( 2417): at android.os.Looper.loop(Looper.java:130)
W/System.err( 2417): at android.os.HandlerThread.run(HandlerThread.java:60)
I/PowerManagerService( 2417): setScreenStateLocked0
這樣就知道,是
ref : java: printing current backtrace
沒有留言:
張貼留言