Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IndexOutOfBoundsException #1135

Closed
rickyManalo opened this issue Oct 23, 2018 · 4 comments
Closed

IndexOutOfBoundsException #1135

rickyManalo opened this issue Oct 23, 2018 · 4 comments
Milestone

Comments

@rickyManalo
Copy link

rickyManalo commented Oct 23, 2018

I'm using the latest version of LeakCanary which is 1.6.2.

I was testing my app for memory leaks and found some when changing activities. I can see the leaks when the dump has been completed. Then, when I return to my MainActivity, I get another bug. After the dump has been compeleted, I tap top the notification and LeakCanary crashed. The error log is below.

10-23 16:53:37.479 23282-23974/com.app.net:leakcanary E/GED: Failed to get GED Log Buf, err(0)
10-23 16:53:38.054 23282-23282/com.app.net:leakcanary E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.net:leakcanary, PID: 23282
    java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.ArrayList.get(ArrayList.java:308)
        at com.squareup.leakcanary.internal.DisplayLeakAdapter.getConnectorType(DisplayLeakAdapter.java:219)
        at com.squareup.leakcanary.internal.DisplayLeakAdapter.getView(DisplayLeakAdapter.java:87)
        at android.widget.AbsListView.obtainView(AbsListView.java:2467)
        at android.widget.ListView.makeAndAddView(ListView.java:1894)
        at android.widget.ListView.fillDown(ListView.java:710)
        at android.widget.ListView.fillFromTop(ListView.java:771)
        at android.widget.ListView.layoutChildren(ListView.java:1681)
        at android.widget.AbsListView.onLayout(AbsListView.java:2230)
        at android.view.View.layout(View.java:16001)
        at android.view.ViewGroup.layout(ViewGroup.java:5181)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1959)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1813)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1722)
        at android.view.View.layout(View.java:16001)
        at android.view.ViewGroup.layout(ViewGroup.java:5181)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
        at android.view.View.layout(View.java:16001)
        at android.view.ViewGroup.layout(ViewGroup.java:5181)
        at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494)
        at android.view.View.layout(View.java:16001)
        at android.view.ViewGroup.layout(ViewGroup.java:5181)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
        at android.view.View.layout(View.java:16001)
        at android.view.ViewGroup.layout(ViewGroup.java:5181)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2483)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2180)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1292)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6598)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:800)
        at android.view.Choreographer.doCallbacks(Choreographer.java:603)
        at android.view.Choreographer.doFrame(Choreographer.java:572)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:786)
        at android.os.Handler.handleCallback(Handler.java:815)
        at android.os.Handler.dispatchMessage(Handler.java:104)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5631)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
@pyricau
Copy link
Member

pyricau commented Oct 24, 2018

Thanks!

@rickyManalo
Copy link
Author

You're welcome

@pyricau
Copy link
Member

pyricau commented Jan 10, 2019

Looking at the code: https://github.com/square/leakcanary/blob/v1.6.2/leakcanary-android/src/main/java/com/squareup/leakcanary/internal/DisplayLeakAdapter.java#L219

Sounds like elementIndex(3) is returning 1, and leakTrace.expectedReachability has a size of 1. elementIndex() returns position - 2 so it makes sense that it returns 1.

LeakTrace.expectedReachability has as many nodes as the leak trace does. Sounds like the leaktrace had only one element here, and I didn't anticipate that edge case.

@rickyManalo
Copy link
Author

Oh, it's great that you already found the bug. Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants