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

Stackoverflow Error #282

Closed
PaulWoitaschek opened this issue Jan 5, 2018 · 2 comments
Closed

Stackoverflow Error #282

PaulWoitaschek opened this issue Jan 5, 2018 · 2 comments

Comments

@PaulWoitaschek
Copy link

PaulWoitaschek commented Jan 5, 2018

I'm not sure how to debug this issue.
To debug a specific crash, I enabled RxJava2Extensions assembly tracking for a part of my users.

For these users I see stackoverflow errors in my crash reporting tool.
I observe this with Timber 4.6.0 and on Android 5 and 6 (currently)

Fatal Exception: c.b.c.f: java.lang.StackOverflowError: stack size 1037KB
       at io.reactivex.plugins.RxJavaPlugins.onError(SourceFile:349)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(SourceFile:69)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(SourceFile:57)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:833)
Caused by java.lang.StackOverflowError: stack size 1037KB
       at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:122)
       at java.lang.StringBuffer.append(StringBuffer.java:278)
       at java.io.StringWriter.write(StringWriter.java:123)
       at java.io.PrintWriter.doWrite(PrintWriter.java:623)
       at java.io.PrintWriter.write(PrintWriter.java:601)
       at java.io.PrintWriter.write(PrintWriter.java:579)
       at java.io.PrintWriter.write(PrintWriter.java:660)
       at java.io.PrintWriter.append(PrintWriter.java:722)
       at java.io.PrintWriter.append(PrintWriter.java:691)
       at java.io.PrintWriter.append(PrintWriter.java:31)
       at java.lang.Throwable.printStackTrace(Throwable.java:315)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:349)
       at java.lang.Throwable.printStackTrace(Throwable.java:300)
       at timber.log.Timber$Tree.getStackTraceString(SourceFile:569)
       at timber.log.Timber$Tree.prepareLog(SourceFile:544)
       at timber.log.Timber$Tree.e(SourceFile:482)
       at timber.log.Timber$1.e(SourceFile:336)
       at my.package.name.misc.rx.loadingState.LoadingStateTransformer$contentOrError$1.apply(SourceFile:33)
       at my.package.name.misc.rx.loadingState.LoadingStateTransformer$contentOrError$1.apply(SourceFile:13)
       at io.reactivex.internal.operators.observable.ObservableOnErrorReturn$OnErrorReturnObserver.onError(SourceFile:73)
       at hu.akarnokd.rxjava2.debug.ObservableOnAssembly$OnAssemblyObserver.onError(SourceFile:60)
       at io.reactivex.internal.observers.BasicFuseableObserver.onError(SourceFile:100)
       at hu.akarnokd.rxjava2.debug.ObservableOnAssembly$OnAssemblyObserver.onError(SourceFile:60)
       at io.reactivex.internal.operators.observable.ObservableCombineLatest$LatestCoordinator.drain(SourceFile:172)
       at io.reactivex.internal.operators.observable.ObservableCombineLatest$LatestCoordinator.innerError(SourceFile:261)
       at io.reactivex.internal.operators.observable.ObservableCombineLatest$CombinerObserver.onError(SourceFile:312)
       at hu.akarnokd.rxjava2.debug.ObservableOnAssembly$OnAssemblyObserver.onError(SourceFile:60)
       at io.reactivex.internal.observers.BasicFuseableObserver.onError(SourceFile:100)
       at hu.akarnokd.rxjava2.debug.ObservableOnAssembly$OnAssemblyObserver.onError(SourceFile:60)
       at io.reactivex.internal.operators.observable.ObservableCombineLatest$LatestCoordinator.drain(SourceFile:172)
       at io.reactivex.internal.operators.observable.ObservableCombineLatest$LatestCoordinator.innerError(SourceFile:261)
       at io.reactivex.internal.operators.observable.ObservableCombineLatest$CombinerObserver.onError(SourceFile:312)
       at hu.akarnokd.rxjava2.debug.ObservableOnAssembly$OnAssemblyObserver.onError(SourceFile:60)
       at io.reactivex.internal.observers.BasicFuseableObserver.onError(SourceFile:100)
       at my.package.name.shared.ObservableMapError$MapErrorObserver.onError(SourceFile:47)
       at hu.akarnokd.rxjava.interop.ObservableV1ToObservableV2$ObservableSubscriber.onError(SourceFile:72)
       at rx.internal.operators.OnSubscribeRedo$4$1.onError(SourceFile:326)
       at rx.internal.operators.OperatorSwitch$SwitchSubscriber.checkTerminated(SourceFile:369)
       at rx.internal.operators.OperatorSwitch$SwitchSubscriber.drain(SourceFile:300)
       at rx.internal.operators.OperatorSwitch$SwitchSubscriber.onError(SourceFile:167)
       at rx.internal.operators.OnSubscribeMap$MapSubscriber.onError(SourceFile:88)
       at rx.internal.operators.OnSubscribeMap$MapSubscriber.onError(SourceFile:88)
       at rx.internal.operators.OnSubscribeRedo$3$1.onNext(SourceFile:300)
       at rx.internal.operators.OnSubscribeRedo$3$1.onNext(SourceFile:284)
       at rx.internal.operators.NotificationLite.accept(SourceFile:135)
       at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext(SourceFile:253)
       at rx.subjects.BehaviorSubject.onNext(SourceFile:160)
       at rx.observers.SerializedObserver.onNext(SourceFile:91)
       at rx.subjects.SerializedSubject.onNext(SourceFile:67)
       at rx.internal.operators.OnSubscribeRedo$2$1.onError(SourceFile:237)
       at rx.internal.operators.OperatorTake$1.onError(SourceFile:65)
       at rx.observers.SerializedObserver.onError(SourceFile:152)
       at rx.observers.SerializedSubscriber.onError(SourceFile:78)
       at rx.internal.operators.OnSubscribeConcatMap$ConcatMapSubscriber.innerError(SourceFile:192)
       at rx.internal.operators.OnSubscribeConcatMap$ConcatMapInnerSubscriber.onError(SourceFile:340)
       at rx.observers.Subscribers$5.onError(SourceFile:230)
       at rx.internal.operators.NotificationLite.accept(SourceFile:132)
       at rx.internal.operators.CachedObservable$ReplayProducer.replay(SourceFile:403)
       at rx.internal.operators.CachedObservable$CacheState.dispatch(SourceFile:220)
       at rx.internal.operators.CachedObservable$CacheState.onError(SourceFile:201)
       at rx.internal.operators.CachedObservable$CacheState$1.onError(SourceFile:175)
       at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(SourceFile:87)
       at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(SourceFile:87)
       at rx.exceptions.Exceptions.throwOrReport(SourceFile:212)
       at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(SourceFile:144)
       at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(SourceFile:266)
       at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(SourceFile:818)
       at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(SourceFile:579)
       at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(SourceFile:568)
       at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(SourceFile:276)
       at rx.internal.operators.OnSubscribeMap$MapSubscriber.onError(SourceFile:88)
       at rx.internal.operators.SingleLiftObservableOperator$WrapSubscriberIntoSingle.onError(SourceFile:81)
       at hu.akarnokd.rxjava.interop.SingleV2ToSingleV1$SourceSingleObserver.onError(SourceFile:75)
       at hu.akarnokd.rxjava2.debug.SingleOnAssembly$OnAssemblySingleObserver.onError(SourceFile:73)
       at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SourceFile:69)
       at hu.akarnokd.rxjava2.debug.SingleOnAssembly$OnAssemblySingleObserver.onError(SourceFile:73)
       at io.reactivex.internal.operators.observable.ObservableSingleSingle$SingleElementObserver.onError(SourceFile:95)
       at hu.akarnokd.rxjava2.debug.ObservableOnAssembly$OnAssemblyObserver.onError(SourceFile:60)
       at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(SourceFile:63)
       at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onError(SourceFile:72)
       at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(SourceFile:55)
       at io.reactivex.Observable.subscribe(SourceFile:11040)
       at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(SourceFile:34)
       at io.reactivex.Observable.subscribe(SourceFile:11040)
       at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(SourceFile:96)
       at io.reactivex.Scheduler$DisposeTask.run(SourceFile:463)
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(SourceFile:66)
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(SourceFile:57)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:833)
@JakeWharton
Copy link
Owner

This isn't a problem with Timber. It's given an exception and it's rendering the stacktrace to a string.

You just have a really large stack. You should be able to use tricks like observeOn(trampoline()) to reduce the Rx stack size. Also it's likely that the exception you're passing has a lot of causes and/or suppressed exceptions which adds more to the stack.

There's no action to take on Timber's side as it only contributes 4 stack frames to this massively large stack trace.

@snitsaruk
Copy link

In my case, the problem was in RxJavaAssembly tracing. It generated a stack trace with over 10,000 items where 99% of exceptions had the same object as a cause. That why when Throwable.printStackTrace() was called a StackOverflow exception occurred on low-end devices (Samsung S5 in my case). I've had the crash log just the same as yours.
Fixed by replacing RxJavaAssembly with RxTracer.

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

No branches or pull requests

3 participants