Android - печать полного исключения backtrace для журнала

У меня есть блок try/catch, который генерирует исключение, и я хотел бы видеть информацию об исключении в журнале устройств Android.

Я прочитал журнал мобильного устройства с помощью этой команды с моего компьютера разработки:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

Я попробовал это первым:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

но это ничего не печатает в журнале. Жаль, потому что это очень помогло.

Лучшее, что я достиг:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

Лучше, чем ничего, но не очень удовлетворительно.

Знаете ли вы, как распечатать полную обратную трассировку в журнале?

Спасибо.

Ответ 1

try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

Более подробно с дополнительной информацией

(Так как это самый старый вопрос по этому поводу.)

Методы журнала Android с тремя аргументами будут печатать трассировку стека для Exception, которое предоставляется в качестве третьего параметра. Например

Log.d(String tag, String msg, Throwable tr)

где tr - исключение.

Согласно этому комментарию, эти методы журнала "используют метод getStackTraceString()... за кулисами", чтобы сделать это.

Ответ 2

Эта вспомогательная функция также хорошо работает, поскольку Exception также является Throwable.

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

Ответ 3

catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

Или... я знаю... что сказал EboMike.

Ответ 4

public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

Ответ 5

e.printStackTrace() печатает его мне. Я не думаю, что вы правильно управляете логарифмом. Не запускайте его в оболочке, просто запустите

/home/dan/android-sdk-linux_x86/tools/adb logcat

Ответ 6

Стандартный вывод и вывод ошибки по умолчанию направлены на /dev/null, так что все они потеряны. Если вы хотите записать этот вывод, вам необходимо следовать инструкциям "Просмотр stdout и stderr", показанным здесь

Ответ 7

try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

Ответ 8

В контексте Android я должен был передать исключение в строку:

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}