Skip to content

Instantly share code, notes, and snippets.

@mkoslacz
Created January 12, 2018 15:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkoslacz/eb7d9345e6004fc39a5ba39f3f6324a4 to your computer and use it in GitHub Desktop.
Save mkoslacz/eb7d9345e6004fc39a5ba39f3f6324a4 to your computer and use it in GitHub Desktop.
RxJava2Debug causing StackOverflowError on too complex CompositeException
@RunWith(AndroidJUnit4::class)
class RxJava2DebugStackOverflowTest {
@Test
fun errorReportedCorrectlyWithoutRxJava2Debug() {
RxJava2Debug.disableRxJava2AssemblyTracking()
var i = 1
Observable.just(1)
.doOnNext { throw Exception("source exception") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.subscribe(
{ print("onNext: $it") },
{
// it has to be Log.e NOT printstacktrace!
Log.e("error", "", it.stripCompositeException()) // RxJava2Debug logging disabled, reports error correctly
},
{ print("onComplete") })
}
@Test
fun errorReportingCausesStackOverflowErrorWithRxJava2Debug() {
RxJava2Debug.enableRxJava2AssemblyTracking()
var i = 1
Observable.just(1)
.doOnNext { throw Exception("source exception") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.subscribe(
{ print("onNext: $it") },
{
// it has to be Log.e NOT printstacktrace!
Log.e("error", "",RxJava2Debug.getEnhancedStackTrace(it.stripCompositeException())) // RxJava2Debug logging enabled, process crashes on older apis (ie. 17 in my case)
},
{ print("onComplete") })
}
// workaround method I use to avoid stackOverflowError when reporting errors from some external components
private fun Throwable.stripCompositeException(): Throwable {
var exception = this
if ((this is CompositeException) && (this.exceptions.size > 5)) {
exception = CompositeException(this.exceptions.subList(0, 5))
}
return exception
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment