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

  • brokenbellsVEVO

    brokenbellsV

    11 EYLÜL 2009
  • kylediablo

    kylediablo

    8 Ocak 2007
  • MrSuicideSheep

    MrSuicideShe

    9 NİSAN 2010