Android JAVA源码之打印调用栈

Android JAVA源码之打印调用栈


以PowerManagerService中的一段代码为例:

    private boolean wakeUpNoUpdateLocked(long eventTime, String reason, int reasonUid,
            String opPackageName, int opUid) {
        if (DEBUG) {
            StackTraceElement[] stack = new Throwable().getStackTrace();//输出wakeUpNoUpdateLocked的调用栈
            for (StackTraceElement element : stack)
            {
                Slog.d(TAG, "   |----" + element.toString());
            }
        }

        if (DEBUG_SPEW) {
            Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime
                    + ", reason=" + reason + ", uid=" + reasonUid);
        }

        if (reason == PowerManager.WAKE_UP_REASON_SHUTDOWN) {
            synchronized (mLock) {
                mShutdownFlag = false;
                Slog.d(TAG, "mShutdownFlag = " + mShutdownFlag);
                mDirty |= DIRTY_SETTINGS;
                updatePowerStateLocked();
                return true;
            }
        }

        if (eventTime < mLastSleepTime || mWakefulness == WAKEFULNESS_AWAKE
                || !mBootCompleted || !mSystemReady) {
            return false;
        }

        Trace.traceBegin(Trace.TRACE_TAG_POWER, "wakeUp");
        try {
            switch (mWakefulness) {
                case WAKEFULNESS_ASLEEP:
                    Slog.i(TAG, "Waking up from sleep (uid " + reasonUid +")...");
                    break;
                case WAKEFULNESS_DREAMING:
                    Slog.i(TAG, "Waking up from dream (uid " + reasonUid +")...");
                    break;
                case WAKEFULNESS_DOZING:
                    Slog.i(TAG, "Waking up from dozing (uid " + reasonUid +")...");
                    break;
            }

            mLastWakeTime = eventTime;
            setWakefulnessLocked(WAKEFULNESS_AWAKE, 0);

            mNotifier.onWakeUp(reason, reasonUid, opPackageName, opUid);
            userActivityNoUpdateLocked(
                    eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, reasonUid);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_POWER);
        }
        return true;
    }


输出的LOG如下:

先附上日志截图,避免排版错乱。

文本日志

07-12 04:25:24.848133  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.goToSleepNoUpdateLocked(PowerManagerService.java:1464)
07-12 04:25:24.848330  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.updateWakefulnessLocked(PowerManagerService.java:2109)
07-12 04:25:24.848434  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.updatePowerStateLocked(PowerManagerService.java:1676)
07-12 04:25:24.848531  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.handleUserActivityTimeout(PowerManagerService.java:2035)
07-12 04:25:24.848632  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.-wrap18(PowerManagerService.java)
07-12 04:25:24.848728  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService$PowerManagerHandler.handleMessage(PowerManagerService.java:3390)
07-12 04:25:24.848835  1180  1207 D PowerManagerService: |----android.os.Handler.dispatchMessage(Handler.java:110)
07-12 04:25:24.848941  1180  1207 D PowerManagerService: |----android.os.Looper.loop(Looper.java:203)
07-12 04:25:24.849034  1180  1207 D PowerManagerService: |----android.os.HandlerThread.run(HandlerThread.java:61)
07-12 04:25:24.849123  1180  1207 D PowerManagerService: |----com.android.server.ServiceThread.run(ServiceThread.java:46)
07-12 04:25:24.849207  1180  1207 I PowerManagerService: Going to sleep due to screen timeout (uid 1000)...
07-12 04:25:24.849337  1180  1207 D PowerManagerNotifier: onWakefulnessChangeStarted: wakefulness=3, reason=2, interactive=false


[小结]

在JAVA中可以使用new Throwable().getStackTrace()的方式获取某函数的被调栈过程。

StackTraceElement[] stack = new Throwable().getStackTrace();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值