2010-08-11 5 views
1

Je programme Ruby qui est en cours d'exécution dans un niveau de pile trop d'erreur profonde (SystemStackError), se terminant le DataMapper:Debugging Stack Niveau trop profond dans Ruby

from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/collection.rb:510:in `each' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/comparison.rb:616:in `map' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/comparison.rb:616:in `expected' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/comparison.rb:461:in `matches?' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/operation.rb:498:in `matches?' 
from /usr/local/lib/ruby/gems/1.8/gems/extlib-0.9.15/lib/extlib/inflection.rb:103:in `any?' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/operation.rb:159:in `each' 
from /usr/local/lib/ruby/1.8/set.rb:195:in `each' 
... 5188 levels... 

est-il un moyen de le déboguer? Comme regarder dans les 5188 niveaux cachés? Ruby-debug n'a pas pu me aider, et le profileur rubis builtin meurt avec « [FATAL] n'a pas réussi à allouer de la mémoire »

+2

Si vous avez 5188 niveaux, vous avez probablement une sorte de récursion infinie. Aussi connu comme un débordement de pile! –

Répondre

5

Le problème, en plus de trouver aucune profileur Ruby qui peut traiter les débordements de pile, abusait DataMapper lazyness

L'application obtenait une propriété de texte (which is lazy) dans une requête (qui est également paresseuse), à ​​l'intérieur d'une autre requête (which is lazy as well). Même si tout ce lazyness transforme habituellement une requête N + 1 en une requête O (k) (ce qui signifie généralement 4 requêtes), cela s'est avéré générer un débordement de pile. L'exécution du test de débordement sous la forme d'un simple script ruby, d'un environnement rake extérieur, rspec et netbeans, m'a permis de voir le coupable plus clairement.

Encore des profileurs rubis qui auraient pu m'y aider.

+1

Merci, au moins je comprends ce qui se passe! Je n'ai pas compris pendant une semaine! Très apprécié, merci. – YogiZoli

Questions connexes