Quand j'obtiens des exceptions, cela vient souvent du plus profond de la pile d'appels. Lorsque cela se produit, le plus souvent, la ligne de code incriminée m'est cachée:
tmp.rb:7:in `t': undefined method `bar' for nil:NilClass (NoMethodError)
from tmp.rb:10:in `s'
from tmp.rb:13:in `r'
from tmp.rb:16:in `q'
from tmp.rb:19:in `p'
from tmp.rb:22:in `o'
from tmp.rb:25:in `n'
from tmp.rb:28:in `m'
from tmp.rb:31:in `l'
... 8 levels...
from tmp.rb:58:in `c'
from tmp.rb:61:in `b'
from tmp.rb:64:in `a'
from tmp.rb:67
Cette troncature "... 8 niveaux ..." me cause beaucoup de problèmes. Je n'ai pas beaucoup de succès avec Google pour celui-ci: comment dire à Ruby que je veux que les dumps incluent la pile complète?
ruby
exception
stack-trace
Sniggerfardimungus
la source
la source
Réponses:
L'exception # backtrace contient la pile entière:
(Inspiré du blog Ruby Inside de Peter Cooper )
la source
raise
. Inutile de spécifier explicitement l’exécution que vous souhaitez déclencher.Vous pouvez également le faire si vous souhaitez un simple one-liner:
la source
raise
pouvait être utilisé sans argument. Je ne savais pas non plus querescue
cela serait traité correctement comme une seule ligne. J'ignore aussi totalement ces variables globales comme$!
.puts "this line was reached by #{caller.join("\n")}"
y caller
pour imprimer la sortie comme trace de pile Java.caller(0,2)
renverrait les deux dernières entrées dans le stacktrace. Bien pour la sortie de traces de pile abrégées.Cela produit la description de l'erreur et une belle trace de pile propre et indentée:
la source
IRB a un paramètre pour cette horrible "fonctionnalité", que vous pouvez personnaliser.
Créez un fichier appelé
~/.irbrc
qui comprend la ligne suivante:Cela vous permettra de voir
irb
au moins 100 cadres de pile . Je n'ai pas été en mesure de trouver un paramètre équivalent pour le runtime non interactif.Vous trouverez des informations détaillées sur la personnalisation de l'IRB dans le livre Pickaxe .
la source
Une doublure pour la pile d'appels:
Une doublure pour la pile d'appels sans toutes les gemmes:
Une doublure pour la pile d'appels sans toutes les gemmes et relative au répertoire actuel
la source
Cela imite la trace officielle de Ruby, si cela est important pour vous.
De manière amusante, il ne gère pas correctement les «exceptions non gérées», les signalant comme «RuntimeError», mais l'emplacement est correct.
la source
J'obtenais ces erreurs en essayant de charger mon environnement de test (via rake test ou autotest) et les suggestions IRB n'ont pas aidé. J'ai fini par emballer tout mon test / test_helper.rb dans un bloc begin / rescue et cela a corrigé les choses.
la source
[examinez toutes les traces de threads pour trouver le coupable]
Même la pile d'appels entièrement développée peut toujours vous cacher la ligne de code incriminée lorsque vous utilisez plus d'un thread!
Exemple: un thread itère ruby Hash, un autre thread tente de le modifier. BOOM! Exception! Et le problème avec la trace de pile que vous obtenez en essayant de modifier le hachage `` occupé '' est qu'il vous montre la chaîne de fonctions jusqu'à l'endroit où vous essayez de modifier le hachage, mais il ne montre PAS qui l'itère actuellement en parallèle ( qui le possède)! Voici le moyen de comprendre cela en imprimant la trace de pile pour TOUS les threads en cours d'exécution. Voici comment procéder:
L'extrait de code ci-dessus est utile même à des fins éducatives car il peut vous montrer (comme la radiographie) le nombre de threads que vous avez réellement (par rapport au nombre que vous pensiez en avoir - bien souvent, ces deux nombres sont différents;)
la source
Vous pouvez également utiliser la gemme Ruby backtrace (j'en suis l'auteur):
la source