Search code examples
androidacra

How to reduce stack trace in ACRA?


I'm sending crash reports from Android app with ACRA, and everything works great. Except for the fact that stack trace is huge. For example, a report can contain about 30000 chars and look like this:

{
  "REPORT_ID": "bb7cef15-ffc0-4e58-ada2-0472a5c02939",
  "APP_VERSION_CODE": 1,
  "APP_VERSION_NAME": 1.8,
  "PHONE_MODEL": "Nexus 5",
  "ANDROID_VERSION": "6.0.1",
  "STACK_TRACE": "io.reactivex.exceptions.CompositeException: 2 exceptions occurred. \n\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\tat android.os.Handler.handleCallback(Handler.java:739)\n\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\tat android.os.Looper.loop(Looper.java:148)\n\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\n  ComposedException 1 :\n\tandroid.nfc.TagLostException: Tag was lost.\n\t\tat android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:48)\n\t\tat android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)\n\t\tat android.nfc.tech.IsoDep.transceive(IsoDep.java:172)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommand(BalancePresenter.java:119)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommandToCard(BalancePresenter.java:101)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.getNextUrlObservable(BalancePresenter.java:77)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.lambda$getFares$3$BalancePresenter(BalancePresenter.java:49)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter$$Lambda$3.apply(Unknown Source)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:121)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\t\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\t\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\t\tat io.reactivex.internal.observers.DisposableLambdaObserver.onNext(DisposableLambdaObserver.java:58)\n\t\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:58)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\t\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)\n\t\tat io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)\n\t\tat io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)\n\t\tat io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)\n\t\tat java.util.concurrent.FutureTask.run(FutureTask.java:237)\n\t\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)\n\t\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)\n\t\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)\n\t\tat java.lang.Thread.run(Thread.java:818)\n\tCaused by: java.lang.RuntimeException: Duplicate found in causal chain so cropping to prevent loop ...\n\t\tat android.util.Log.getStackTraceString(Log.java:338)\n\t\tat android.util.Log.e(Log.java:243)\n\t\tat org.acra.log.AndroidLogDelegate.e(AndroidLogDelegate.java:56)\n\t\tat org.acra.ErrorReporter.uncaughtException(ErrorReporter.java:254)\n\t\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)\n\t\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)\n\t\tat io.reactivex.plugins.RxJavaPlugins.uncaught(RxJavaPlugins.java:411)\n\t\tat io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:365)\n\t\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\t\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\t\tat android.os.Handler.handleCallback(Handler.java:739)\n\t\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\t\tat android.os.Looper.loop(Looper.java:148)\n\t\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\t\tat java.lang.reflect.Method.invoke(Native Method)\n\t\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\t\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\n  ComposedException 2 :\n\tjava.lang.Exception: android.nfc.TagLostException: Tag was lost.\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.lambda$getFares$14$BalancePresenter(BalancePresenter.java:69)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter$$Lambda$14.accept(Unknown Source)\n\t\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\t\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\t\tat android.os.Handler.handleCallback(Handler.java:739)\n\t\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\t\tat android.os.Looper.loop(Looper.java:148)\n\t\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\t\tat java.lang.reflect.Method.invoke(Native Method)\n\t\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\t\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\n\tCaused by: android.nfc.TagLostException: Tag was lost.\n\t\tat android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:48)\n\t\tat android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)\n\t\tat android.nfc.tech.IsoDep.transceive(IsoDep.java:172)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommand(BalancePresenter.java:119)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommandToCard(BalancePresenter.java:101)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.getNextUrlObservable(BalancePresenter.java:77)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter.lambda$getFares$3$BalancePresenter(BalancePresenter.java:49)\n\t\tat com.icard.ui.card.content.balance.impl.BalancePresenter$$Lambda$3.apply(Unknown Source)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:121)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\t\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\t\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\t\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\t\tat io.reactivex.internal.observers.DisposableLambdaObserver.onNext(DisposableLambdaObserver.java:58)\n\t\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:58)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\t\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\t\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\t\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)\n\t\tat io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)\n\t\tat io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)\n\t\tat io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)\n\t\tat java.util.concurrent.FutureTask.run(FutureTask.java:237)\n\t\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)\n\t\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)\n\t\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)\n\t\tat java.lang.Thread.run(Thread.java:818)\n\tCaused by: java.lang.RuntimeException: Duplicate found in causal chain so cropping to prevent loop ...\n\t\tat android.util.Log.getStackTraceString(Log.java:338)\n\t\tat android.util.Log.e(Log.java:243)\n\t\tat org.acra.log.AndroidLogDelegate.e(AndroidLogDelegate.java:56)\n\t\tat org.acra.ErrorReporter.uncaughtException(ErrorReporter.java:254)\n\t\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)\n\t\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)\n\t\tat io.reactivex.plugins.RxJavaPlugins.uncaught(RxJavaPlugins.java:411)\n\t\tat io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:365)\n\t\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\t\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\t\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\t\tat android.os.Handler.handleCallback(Handler.java:739)\n\t\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\t\tat android.os.Looper.loop(Looper.java:148)\n\t\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\t\tat java.lang.reflect.Method.invoke(Native Method)\n\t\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\t\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\n\nio.reactivex.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>\n\tat android.util.Log.getStackTraceString(Log.java:338)\n\tat android.util.Log.e(Log.java:243)\n\tat org.acra.log.AndroidLogDelegate.e(AndroidLogDelegate.java:56)\n\tat org.acra.ErrorReporter.uncaughtException(ErrorReporter.java:254)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)\n\tat io.reactivex.plugins.RxJavaPlugins.uncaught(RxJavaPlugins.java:411)\n\tat io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:365)\n\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\tat android.os.Handler.handleCallback(Handler.java:739)\n\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\tat android.os.Looper.loop(Looper.java:148)\n\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\nCaused by: android.nfc.TagLostException: Tag was lost.\n\tat android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:48)\n\tat android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)\n\tat android.nfc.tech.IsoDep.transceive(IsoDep.java:172)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommand(BalancePresenter.java:119)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommandToCard(BalancePresenter.java:101)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.getNextUrlObservable(BalancePresenter.java:77)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.lambda$getFares$3$BalancePresenter(BalancePresenter.java:49)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter$$Lambda$3.apply(Unknown Source)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:121)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\tat io.reactivex.internal.observers.DisposableLambdaObserver.onNext(DisposableLambdaObserver.java:58)\n\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:58)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)\n\tat io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)\n\tat io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)\n\tat io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:237)\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)\n\tat java.lang.Thread.run(Thread.java:818)\nCaused by: java.lang.RuntimeException: Duplicate found in causal chain so cropping to prevent loop ...\n\tat android.util.Log.getStackTraceString(Log.java:338)\n\tat android.util.Log.e(Log.java:243)\n\tat org.acra.log.AndroidLogDelegate.e(AndroidLogDelegate.java:56)\n\tat org.acra.ErrorReporter.uncaughtException(ErrorReporter.java:254)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)\n\tat io.reactivex.plugins.RxJavaPlugins.uncaught(RxJavaPlugins.java:411)\n\tat io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:365)\n\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\tat android.os.Handler.handleCallback(Handler.java:739)\n\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\tat android.os.Looper.loop(Looper.java:148)\n\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\nandroid.nfc.TagLostException: Tag was lost.\n\tat android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:48)\n\tat android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)\n\tat android.nfc.tech.IsoDep.transceive(IsoDep.java:172)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommand(BalancePresenter.java:119)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.transferCommandToCard(BalancePresenter.java:101)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.getNextUrlObservable(BalancePresenter.java:77)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter.lambda$getFares$3$BalancePresenter(BalancePresenter.java:49)\n\tat com.icard.ui.card.content.balance.impl.BalancePresenter$$Lambda$3.apply(Unknown Source)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:121)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)\n\tat io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)\n\tat io.reactivex.internal.observers.DisposableLambdaObserver.onNext(DisposableLambdaObserver.java:58)\n\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:58)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)\n\tat retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)\n\tat retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)\n\tat io.reactivex.Observable.subscribe(Observable.java:10842)\n\tat io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)\n\tat io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)\n\tat io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)\n\tat io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:237)\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)\n\tat java.lang.Thread.run(Thread.java:818)\nCaused by: java.lang.RuntimeException: Duplicate found in causal chain so cropping to prevent loop ...\n\tat android.util.Log.getStackTraceString(Log.java:338)\n\tat android.util.Log.e(Log.java:243)\n\tat org.acra.log.AndroidLogDelegate.e(AndroidLogDelegate.java:56)\n\tat org.acra.ErrorReporter.uncaughtException(ErrorReporter.java:254)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)\n\tat io.reactivex.plugins.RxJavaPlugins.uncaught(RxJavaPlugins.java:411)\n\tat io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:365)\n\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)\n\tat io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)\n\tat io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)\n\tat android.os.Handler.handleCallback(Handler.java:739)\n\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\tat android.os.Looper.loop(Looper.java:148)\n\tat android.app.ActivityThread.main(ActivityThread.java:5417)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)\njava.lang.RuntimeException: Duplicate found in causal chain so cropping to prevent loop ...\n\tat android.util.Log.getStackTraceString(Log.java:338)\n\tat android.util.Log.e(Log.java:243)\n\tat org.acra.log.AndroidLogDelegate.e(AndroidLogDelegate.java:56)\n\tat org.acra.ErrorReporter.uncaughtException(ErrorReporter.java:254)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)\n\tat java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)\n\tat io.reactivex.plugins.RxJavaPlugins.uncaught(RxJavaPlugins.java:411)\n\tat io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:365)\n\tat io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)\n\tat ...",
  "USER_APP_START_DATE": "2017-10-24T18:17:42.006+03:00",
  "USER_CRASH_DATE": "2017-10-24T18:17:44.713+03:00",
  "IS_SILENT": false
}

Can I somehow to reduce the message in "STACK_TRACE" field? For example, can I send only a few starting lines from stack trace?


Solution

  • Create a custom ReportSender (extend one of the default ones), and modify the Report before it is sent.

    You can register custom ReportSenders using @ReportsCrashes.reportSenderFactoryClasses