Tencent / matrix

Matrix is a plugin style, non-invasive APM system developed by WeChat.
Other
11.62k stars 1.88k forks source link

Looper NullPointerException #450

Open LinXiaoTao opened 4 years ago

LinXiaoTao commented 4 years ago

问题描述

    @Override
    public void onDead() {
        super.onDead();
        if (isAnrTraceEnable) {
            UIThreadMonitor.getMonitor().removeObserver(this);
            if (null != anrTask) {
                anrTask.getBeginRecord().release();
            }
            anrHandler.removeCallbacksAndMessages(null);
            anrHandler.getLooper().quit();
        }
    }

AnrTraceronDead() 时不应该调用 anrHandler.quit() 方法,因为 looper 是使用的全局的。

this.anrHandler = new Handler(MatrixHandlerThread.getDefaultHandler().getLooper());

复现步骤

sample-android 先进入 TRACE_CANARY 页面,再退出,再进入,就会奔溃。

其他信息

异常类型:app 运行时异常

matrix版本:0.6.5

堆栈/日志:

2020-01-20 11:16:38.242 26783-26783/sample.tencent.matrix E/AndroidRuntime: FATAL EXCEPTION: main
    Process: sample.tencent.matrix, PID: 26783
    java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference
        at android.os.Handler.<init>(Handler.java:236)
        at android.os.Handler.<init>(Handler.java:140)
        at com.tencent.matrix.trace.view.FrameDecorator.getHandler(FrameDecorator.java:214)
        at com.tencent.matrix.trace.view.FrameDecorator.access$600(FrameDecorator.java:34)
        at com.tencent.matrix.trace.view.FrameDecorator$5.execute(FrameDecorator.java:208)
        at com.tencent.matrix.trace.tracer.FrameTracer.notifyListener(FrameTracer.java:102)
        at com.tencent.matrix.trace.tracer.FrameTracer.doFrame(FrameTracer.java:85)
        at com.tencent.matrix.trace.core.UIThreadMonitor.dispatchEnd(UIThreadMonitor.java:262)
        at com.tencent.matrix.trace.core.UIThreadMonitor.access$200(UIThreadMonitor.java:17)
        at com.tencent.matrix.trace.core.UIThreadMonitor$1.dispatchEnd(UIThreadMonitor.java:110)
        at com.tencent.matrix.trace.core.LooperMonitor$LooperDispatchListener.onDispatchEnd(LooperMonitor.java:48)
        at com.tencent.matrix.trace.core.LooperMonitor.dispatch(LooperMonitor.java:213)
        at com.tencent.matrix.trace.core.LooperMonitor.access$000(LooperMonitor.java:17)
        at com.tencent.matrix.trace.core.LooperMonitor$LooperPrinter.println(LooperMonitor.java:196)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)
taublast commented 4 years ago

Can happen when code is executed on wrong thread, force execution on ui thread and error would be gone.