Question

En Java normal, vous pouvez obtenir le texte d'une trace de pile en transmettant un PrintWriter à printStackTrace. J'ai l'impression de connaître la réponse à cette question (c'est-à-dire "Non"), mais

Existe-t-il un moyen d'obtenir le texte d'une trace de pile dans JavaME sous forme de chaîne?

Mise à jour:

Je dois mentionner que je suis limité à CLDC 1.0

Était-ce utile?

La solution

Si je comprends bien, il n’existe aucun moyen d’obtenir la trace de pile en tant que valeur de chaîne, à moins qu’une plate-forme spécifique ne permette de remplacer le flux System.err par défaut. Sur la plate-forme BlackBerry, la trace de pile est rejetée sur catch (Exception) afin d'économiser de la mémoire. Toutefois, elle ne le fait pas sur catch (Throwable) et donne accès à la trace de la pile via le journal des événements du périphérique.

J'ai fini par capturer Throwable plutôt que Exception au dernier moment possible et imprimer la trace de pile à partir de là. Ceci risque bien sûr d’attraper java.lang.Error , ce qui n’est pas très bon, surtout si son OutOfMemoryError , bien qu’un appel à System.gc () avant d’imprimer la trace de pile semble réduire le risque et nous n’avons rencontré aucun problème avec elle.

Je regarderais quelle que soit la plate-forme que vous ciblez pour voir si elle donne accès à System.err quelque part. Vous pouvez toujours connecter un débogueur et il devrait apparaître sur la sortie de la console, même s'il semble que vous soyez après avoir récupéré des traces de pile 'dans le champ'.

Autres conseils

deux solutions:

  • reproduit l'exception sur l'émulateur. la boîte à outils sans fil et Netbeans imprimeront les traces de pile sur votre ordinateur.

  • utilisez un périphérique Symbian.

Avant la version 2 du Feature Pack 2 de la série 60, les combinés Symbian utilisaient la machine virtuelle java Sun Hotspot. Il a été adapté à Symbian OS en le liant à une implémentation partielle de la bibliothèque standard C.

Cela a permis à Symbian de créer un programme C ++ appelé redirecteur, capable de capturer la sortie standard et l’erreur standard de la machine virtuelle, y compris les traces de pile d’exceptions java.

le redirecteur c ++ n'a jamais été mis à niveau pour la version 9 de Symbian OS. Au lieu de cela, un " redirect: // " Le protocole GCF a été introduit dans la VM,

À partir d'un MIDlet distinct, ouvrez un InputStream à partir de la connexion renvoyée par Connector.open ("redirect: //", Connector.READ); vous pouvez alors capturer des traces de pile d'exceptions sur les téléphones Symbian.

EDIT: & redirect; redirection: // " est de retour dans la 5e édition de Series60 et "redirect: // test" devrait fonctionner sur le Feature Pack 2 de Series60 3rd Edition

Je ne pense pas qu'il existe un moyen de le faire dans CLDC 1.0. Cependant, sur certains périphériques / systèmes d’exploitation, la classe Exception sous-jacente pourrait constituer un moyen d’accéder à la trace de pile (pensez aux nouvelles versions de CLDC). Il suffit d’inspecter l’instance d’exception au moment de l’exécution à l’aide de la réflexion pour voir les membres qu’elle expose sur vos plates-formes cibles. Vous pouvez ensuite écrire du code qui permettra d'extraire en toute sécurité la trace de la pile sur les plates-formes offrant ces informations.

J'ai créé un outil qui peut être utilisé pour consigner les traces de pile appropriées également dans CLDC. Consultez-la sur http://jarrut.sourceforge.net . C'est encore très nouveau et il a peut-être quelques aspérités, mais cela fonctionne pour moi et je ne pouvais plus imaginer développer des MIDlets sans cela. La meilleure façon de l’utiliser est de le combiner avec microlog.

Malheureusement, l'outil nécessite actuellement CLDC 1.1 et ne risque donc pas de résoudre le problème de l'affiche originale.

Vous pouvez avoir le PrintWriter écrire dans un ByteArrayOutputStream et reconstruire la chaîne à partir des octets.

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

Ce n’est pas beau, mais ça devrait marcher un peu partout. Avant d'essayer ce qui précède, assurez-vous de ne pas avoir accès à [Throwable # getStackTrace] ( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace ()) , Eclipse affirme être disponible dans CDC / Foundation 1.1, mais cela ne dit rien sur les autres profils.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top