Как получить текст трассировки стека исключений в Java ME? - PullRequest
8 голосов
/ 22 октября 2008

В обычной Java вы можете получить текст трассировки стека, передав PrintWriter в printStackTrace. У меня такое чувство, что я знаю ответ на этот вопрос (то есть "Нет"), но

Есть ли способ получить текст трассировки стека в JavaME в виде строки?

Обновление:

Я должен отметить, что я ограничен CLDC 1.0

Ответы [ 5 ]

3 голосов
/ 22 октября 2008

два решения:

  • воспроизвести исключение на эмуляторе. беспроводной инструментарий и Netbeans распечатают следы стека на вашем компьютере.

  • использовать устройство Symbian.

До выпуска Feature Pack 2 в Series 60 третьего издания телефоны Symbian использовали виртуальную машину Java Hotspot Sun. Он был адаптирован для Symbian OS, связав его с частичной реализацией стандартной библиотеки C.

Это позволило Symbian создать программу на C ++ под названием redirector, которая была способна захватывать стандартный вывод VM и стандартную ошибку, включая трассировки стека исключений java.

редиректор c ++ никогда не обновлялся до версии 9 операционной системы Symbian. Вместо этого в виртуальную машину был введен протокол GCF «redirect: //»,

В отдельном мидлете откройте InputStream из соединения, возвращаемого Connector.open ("redirect: //", Connector.READ); затем вы можете захватывать трассировки стека исключений на телефонах Symbian.

РЕДАКТИРОВАТЬ: «redirect: //» вернулся в Series60 5-е издание, и «redirect: // test» должен работать на Series60 3-е издание Feature Pack 2

2 голосов
/ 22 октября 2008

AFAIK Нет способа получить трассировку стека в виде строкового значения, если только конкретная платформа не предоставляет средства для переопределения потока System.err по умолчанию. На платформе BlackBerry он выбрасывает трассировку стека на catch(Exception) для экономии памяти, однако на catch(Throwable) этого не делает и предоставляет доступ к трассировке стека через журнал событий устройства.

В конечном итоге я поймал Throwable, а не Exception в последний момент и напечатал оттуда трассировку стека. Это, конечно, есть опасность того, что вы также поймаете java.lang.Error, что не очень хорошо, особенно если это OutOfMemoryError, хотя вызов System.gc() перед печатью трассировки стека, кажется, снижает риск, и мы с ним не было никаких проблем.

Я бы посмотрел на любую платформу, на которую вы нацелены, и посмотрю, предоставляют ли они где-нибудь доступ к System.err. Вы всегда можете подключить отладчик, и он должен появиться на выходе консоли, хотя звучит так, как будто вы получаете трассировки стека «в поле».

0 голосов
/ 06 июля 2010

Я создал инструмент, который можно использовать для регистрации правильных трассировок стека также в CLDC. Проверьте это в http://jarrut.sourceforge.net. Это все еще очень ново и может иметь некоторые грубые края, но это работает для меня, и я не мог себе представить разработку мидлетов без него. Лучший способ использовать это, чтобы объединить это с microlog.

К сожалению, в настоящее время инструмент требует CLDC 1.1, поэтому он может не решить проблему с оригинальным постером.

0 голосов
/ 22 октября 2008

Я не думаю, что есть способ сделать это в CLDC 1.0. Однако на некоторых устройствах / ОС базовый класс Exception может обеспечивать способ доступа к трассировке стека (подумайте о новых версиях CLDC). Просто проверьте экземпляр исключения во время выполнения, используя отражение, чтобы увидеть, какие члены он предоставляет на ваших целевых платформах. Затем вы могли бы написать некоторый код, который сможет безопасно извлекать трассировку стека на платформах, которые предоставляют такую ​​информацию.

0 голосов
/ 22 октября 2008

Вы можете записать PrintWriter в ByteArrayOutputStream и восстановить строку из байтов.

try{
    throw new Exception("Message");     
} catch (Exception ex){
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ex.printStackTrace(new PrintStream(out));
    System.out.println(new String(out.toByteArray()));
}

Это не красиво, но должно работать почти везде. Прежде чем попробовать описанное выше, убедитесь, что у вас нет доступа к [Throwable # getStackTrace] (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace()), Eclipse утверждает, что он доступен в CDC / Foundation 1.1, но это ничего не говорит о других профилях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...