Giter Site home page Giter Site logo

Comments (17)

pyricau avatar pyricau commented on May 6, 2024

This is very interesting. It's happening in the service process, so that's when we're processing a heap dump.

from leakcanary.

luciofm avatar luciofm commented on May 6, 2024

It was on my first run with leakcanary enabled... will try to reproduce later...

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

Could you find the root of the stack in logcat? I'd like to know in which part of LeakCanary code this happened.

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

My best bet here is that this happens when we try to start AbstractAnalysisResultService because we need to pass some serializable data back to the original process (and the stacktrace says write).

HeapDump doesn't have a deep hierarchy. AnalysisResult has LeakTrace and Exception, so basically it could be that LeakTrace has a very long list of LeakTraceElement (but it's an unmodifiable array list so not sure that could trigger it), or Exception has a very deep stacktrace / causes.

I will close for now, please reopen or create a new one if you can get more info.

from leakcanary.

Maragues avatar Maragues commented on May 6, 2024

Hi @pyricau , I also got this StackOverFlow on my first run with LeakCanary. My Logcat is similar but not equal to @luciofm

I/dalvikvm( 1761): threadid=11: stack overflow on call to Ljava/io/SerializationHandleMap;.get:IL
I/dalvikvm( 1761):   method requires 16+20+12=48 bytes, fp is 0x9559b31c (28 left)
I/dalvikvm( 1761):   expanding stack end (0x9559b300 to 0x9559b000)
I/dalvikvm( 1761): Shrank stack (to 0x9559b300, curFrame is 0x9559b488)
W/dalvikvm( 1761): threadid=11: thread exiting with uncaught exception (group=0xa4d00b20)
E/AndroidRuntime( 1761): FATAL EXCEPTION: IntentService[HeapAnalyzerService]
E/AndroidRuntime( 1761): Process: org.microhealth.ostheoarthritis:leakcanary, PID: 1761
E/AndroidRuntime( 1761): java.lang.StackOverflowError
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.dumpCycle(ObjectOutputStream.java:425)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1566)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewArray(ObjectOutputStream.java:1205)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1662)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.util.ArrayList.writeObject(ArrayList.java:648)
E/AndroidRuntime( 1761):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1761):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.util.ArrayList.writeObject(ArrayList.java:648)
E/AndroidRuntime( 1761):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1761):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
E/AndroidRuntime( 1761):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
E/AndroidRuntime( 1761):    at java.util.ArrayList.writeObject(ArrayList.java:648)
E/AndroidRuntime( 1761):    at java.lang.reflect.Method.i

Let me know if I can help, as I've been able to isolate it to 1 specifc use case.

Plus, after the crash I'm seeing this message in Logcat

D/AndroidHeapDumper( 1256): Could not dump heap, previous analysis still is in progress.

Maybe you can reopen the issue?

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

Is this systematic?

from leakcanary.

Maragues avatar Maragues commented on May 6, 2024

yes, it happens every time.

from leakcanary.

swankjesse avatar swankjesse commented on May 6, 2024

Can you attach a debugger? Would be really handy if you could put a breakpoint in the StackOverflowError constructor to see what chain of objects it's attempting to serialize.

from leakcanary.

Maragues avatar Maragues commented on May 6, 2024

@swankjesse The crash doesn't happen when I attach a debugger, but it occurs systematically without it.

I'm going to try to add it as a local dependency and see if I can Log something. Any hint?

from leakcanary.

Maragues avatar Maragues commented on May 6, 2024

It's only happening on Android 4.4.4, it seems to work well on Lollipop. And, one time it also worked well on KitKat. I haven't been able to capture any log, sorry.

I've tested on Genymotion Nexus 4 and a real device One Plus One still on CM 11

from leakcanary.

pepyakin avatar pepyakin commented on May 6, 2024

@Maragues I bet crash doesn't happen with debugger attached because of this

from leakcanary.

vovkab avatar vovkab commented on May 6, 2024

Happening to me too on Android 4.3

from leakcanary.

vovkab avatar vovkab commented on May 6, 2024

Finally got correct stacktrace:

at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at org.eclipse.mat.parser.internal.SnapshotImpl.create(SnapshotImpl.java:184)
at org.eclipse.mat.parser.internal.SnapshotImplBuilder.create(SnapshotImplBuilder.java:94)
at org.eclipse.mat.parser.internal.SnapshotFactory.parse(SnapshotFactory.java:201)
at org.eclipse.mat.parser.internal.SnapshotFactory.openSnapshot(SnapshotFactory.java:106)
at com.squareup.leakcanary.HeapAnalyzer.openSnapshot(HeapAnalyzer.java:136)
at com.squareup.leakcanary.HeapAnalyzer.checkForLeak(HeapAnalyzer.java:89)
at com.squareup.leakcanary.internal.HeapAnalyzerService.onHandleIntent(HeapAnalyzerService.java:57)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

Thanks @vovkab. Damn, it's in haha. Which means it's going to be a nightmare.

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

Culprit: out.writeObject(answer.classCache);

We could spend some time improve the serialized classes to avoid recursive calls. But after looking at it, I realized that the whole point is to save the parsing so that it can be reopened quickly later without reparsing the heapdump. We don't care about that. So we can probably get away with remove that part entirely.

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

Fix in HAHA here: square/haha#4

from leakcanary.

pyricau avatar pyricau commented on May 6, 2024

Not just yet, need to update leakcanary.

from leakcanary.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.