SORU
18 Temmuz 2012, ÇARŞAMBA


Bir SystemStackError bir geri iz: seviyesi çok derin?yığın

Genellikle ruby kodlama sabit sonsuz recursions hata ayıklamak için. Bir şekilde tam olarak sonsuz döngü oluşur nerede olduğunu bulmak için SystemStackError Bir, bir geri iz de olabilir.

Örnek

Belirli bazı yöntemler bir döngü içinde birbirlerine çağrı foo, bar baz:

def foo
  bar
end

def bar
  baz
end

def baz
  foo
end

foo

Bu kodu çalıştırdığınızda, ben sadece mesajı test.rb:6: stack level too deep (SystemStackError). O-cekti var olmak kullanışlı için en azından son 100 satır yığını, ben de hemen bu bir döngü arasında foo, bar baz.

test.rb:6: stack level too deep (SystemStackError)
  test.rb:2:in `foo'
  test.rb:10:in `baz'
  test.rb:6:in `bar'
  test.rb:2:in `foo'
  test.rb:10:in `baz'
  test.rb:6:in `bar'
  test.rb:2:in `foo'
  [...]

Bunu yapmak için herhangi bir yolu var mı?

DÜZENLEME:

Cevap aşağıda görebileceğiniz gibi, Rubinius yapabilir. rubinius bugs yazılım kullanmadan alıkoyuyor ne yazık ki bazı hata ayıklama yapmak istiyorum. Soru şu kesin:

Nasıl (varsayılan ruby) MR 1.9 ile bir geri iz alabilirim?

CEVAP
5 ŞUBAT 2014, ÇARŞAMBA


O daha sonra bu soru... excellent gist Bir bulmak için başka bir yöntem, bir izleme fonksiyonu etkinleştirme ve bir dosya için tüm işlev çağrıları yazdırma ile ilgili bilgi sağlar. Sadece 1.9.3-p194 üzerinde test edilmiş ve mükemmel çalıştı.

Özü uzakta bir gün gider diye burada da dahil olmak üzere:

$enable_tracing = false
$trace_out = open('trace.txt', 'w')

set_trace_func proc { |event, file, line, id, binding, classname|
  if $enable_tracing && event == 'call'
    $trace_out.puts "#{file}:#{line} #{classname}##{id}"
  end
}

$enable_tracing = true
a_method_that_causes_infinite_recursion_in_a_not_obvious_way()

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • How To Cook That

    How To Cook

    16 NİSAN 2011
  • SavageLuxxxGaming - Daily NBA 2K15 & NBA Live 15 Enjoy And Subscribe!

    SavageLuxxxG

    11 Ocak 2013
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012