При регистрации трассировки стека для необработанных исключений в Java или Android (например, через ACRA) вы обычно получаете трассировку стека в виде простой длинной строки.
Теперь все службы, предоставляющие отчеты и анализ сбоев (например, Google Play Developer Console, Crashlytics), группируют эти трассировки стека в уникальные ведра. Это, очевидно, полезно - иначе вы могли бы иметь десятки тысяч отчетов о сбоях в своем списке, но только дюжина из них могут быть уникальными.
Пример:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1027)
Caused by: java.lang.ArrayIndexOutOfBoundsException
at com.my.package.MyClass.i(SourceFile:1059)
...
Трассировка стека выше может отображаться в нескольких вариантах, например. классы платформы, такие как AsyncTask
, могут появляться с различными номерами строк из-за разных версий платформы.
Какой лучший способ получить уникальный идентификатор для каждого отчета о сбоях?
Ясно, что при каждой новой версии приложения, которую вы публикуете, отчеты о сбоях должны обрабатываться отдельно, потому что скомпилированный источник отличается. В ACRA вы можете использовать поле APP_VERSION_CODE
.
Но в противном случае, как вы определяете отчеты с уникальными причинами? Выбрав первую строку и выполнив поиск первого вхождения пользовательского (не-платформенного) класса и просмотрев файл и номер строки?