В моем окне logcat в Eclipse отображаются только первые строки StackTrace для каждого исключения. Это означает, что я часто не вижу, где произошло исключение. Есть ли способ изменить этот параметр?
Окно Eclipse Logcat отключает следы стека объектов
Ответ 1
Если вы ссылаетесь на часть "... еще 12 строк...", вы видите только это для исключений, которые были причиной другого исключения. Если верхняя часть трассировки стека совпадает с предыдущей трассировкой, полный набор кадров отображается только для самого внешнего исключения, а остальные трассы получают обработку "...".
Другими словами, фрагмент следа, который не показан, представляет собой дубликат следа, который появился ранее в цепочке причин исключения. Например, предположим, что у меня есть код, где метод main()
вызывает one()
, который вызывает two()
и т.д. four()
выдает исключение. two()
ловит его и повторно бросает. Исключение будет выглядеть следующим образом:
java.lang.RuntimeException: re-throw
at Foo.two(Foo.java:14)
at Foo.one(Foo.java:7)
at Foo.main(Foo.java:3)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: first
at Foo.four(Foo.java:23)
at Foo.three(Foo.java:19)
at Foo.two(Foo.java:12)
... 3 more
Исключение "из-за" говорит "... еще 3", а не явно перечисляет one()
, main()
и dalvik.system.NativeStart.main
. Таким образом, чтобы получить полный след начального исключения, вы должны начать с чтения его трассировки, а затем продолжить на трассе выше.
Обратите внимание, что в обоих случаях нет перекрытия - two()
, но в "первой" трассе он вызывает вызов three()
, а в "повторном" трассировке - в команде throw
.
Ответ 2
вы можете перегрузить все методы журнала (log.d, log.i, log.e и т.д.) с параметрами (String tag, String msg, Throwable tr)
, где третий параметр является исключением. Это даст вам полный стек в logcat
http://developer.android.com/reference/android/util/Log.html
Ответ 3
Если ваш код вызывает метод, который производит слишком высокий стек, вы можете (и должны) обрабатывать исключение в своем коде и выводить все, что имеет отношение к журналам.
Если у вас нет никакой обработки исключений, и вы даже не знаете, где в вашем коде вы должны помещать такой обработчик, тогда проблема полностью в другом месте - вы должны обрабатывать исключения немного лучше, чем это.