2010-05-25 18 views
17

Ma fenêtre logcat dans Eclipse affiche uniquement les premières lignes du StackTrace pour chaque exception. Cela signifie que je ne peux souvent pas voir où une exception s'est produite. Est-il possible de modifier ce paramètre?La fenêtre Eclipse Logcat supprime les traces de pile d'exception

+0

Quelle version SDK utilisez-vous? C'est un comportement assez bizarre ... pouvez-vous s'il vous plaît fournir un exemple de sortie qui coupe la trace de la pile? * Modifier *: Je n'ai pas vu la balise eclipse, désolé. De toute façon, si vous utilisez le logcat original, je pense que vous n'aurez pas de problèmes: 'adb logcat' – Cristian

+0

Si vous faites référence à la partie" ... 12 lignes de plus ... ", vous ne voyez que des exceptions étaient la cause d'une autre exception. Si la partie supérieure de la trace de la pile est la même que l'autre, l'ensemble complet des cadres n'est affiché que pour l'un d'entre eux, et l'autre reçoit le traitement "...". (Vous avez vraiment besoin d'ajouter plus de détails à votre question - nous ne faisons que deviner ce que vous voulez.) – fadden

+0

@Fadden: Vous avez raison - il ne coupe pas du tout. Si vous postez ce commentaire en réponse, je l'accepterai. – Casebash

Répondre

32

Si vous faites référence à la partie "... 12 lignes de plus ...", vous ne voyez que les exceptions qui ont provoqué une autre exception. Si la partie supérieure de la trace de la pile est la même que la trace précédente, l'ensemble complet des cadres n'est affiché que pour l'exception la plus externe et les autres traces reçoivent le traitement "...". En d'autres termes, le fragment d'une trace qui n'est pas affiché est un doublon d'une trace apparue plus tôt dans la chaîne de cause d'exception. Par exemple, supposons que j'ai le code où la méthode main() appelle one(), qui appelle two() et ainsi de suite. four() déclenche une exception. two() l'attrape et le jette à nouveau. L'exception se présente comme suit:

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 

Le "causé par" exception dit "... 3 plus" plutôt que d'énumérer explicitement one(), main() et dalvik.system.NativeStart.main. Donc, pour obtenir la trace complète de l'exception initiale, vous devriez commencer par lire sa trace, puis continuer à la trace ci-dessus.

noter qu'il n'y a pas de chevauchement - two() apparaît à la fois, mais dans la « première » trace il est sur l'appel à three(), et dans la trace « re-jeter » il est sur l'instruction throw.

+0

Alors, quelle est la solution si l'exception originale est celle dont vous voulez voir plus de 7 lignes? – George

+0

J'ai réécrit l'explication et ajouté un exemple. – fadden

+1

Oui, je n'ai pas travaillé avec le "vrai" Java depuis un moment, mais j'aurais dû le faire en recherchant "Java stacktrace 12 more" ou quelque chose comme ça. Comme vous le faites remarquer, les lignes rédigées ("12 de plus") sont des lignes dupliquées de la pile ci-dessus. J'avais l'impression que LogCat réduisait les lignes "utiles" du stacktrace, mais ce n'est pas le cas. Merci d'avoir réparé mon malentendu. – George

-1

Si votre code appelle une méthode qui produit trop de pile, vous pouvez (et devez) gérer l'exception dans votre code et afficher tout ce qui est pertinent pour les journaux.

Si vous n'avez aucune exception et que vous ne savez même pas où placer votre code dans votre code, alors le problème est entièrement ailleurs - vous devriez gérer les exceptions un peu mieux que cela.