Aşağıdaki Ruby kodunu internetten kopyaladım ve birkaç değişiklik yaptım ama işe yaramıyor.
Programın kendi hatalarını ayıklamak için ne yapabilirim?
Aşağıdaki Ruby kodunu internetten kopyaladım ve birkaç değişiklik yaptım ama işe yaramıyor.
Programın kendi hatalarını ayıklamak için ne yapabilirim?
Yanıtlar:
Yükleme yöntemi:
$ gem install pry
$ pry
Sonra Ekle:
require 'pry'; binding.pry
programınıza ekleyin.
İtibariyle pry0.12.2, ancak navigasyon gibi komutlar da mevcuttur next, break, bazı diğer taşlar ek bu sağlar, vb bakınız örneğin pry-byedebug.
binding.pry. Ayrıca renk tamamlama, belge arama ve bir yöntemi dinamik olarak düzenleme ve yeniden yükleme imkanı ile birlikte gelir ..
Pry/ byebugmükemmeldir, ancak hata ayıklamada ilk adımınız değildir. Çoğu durumda, bir istisna oluşturmak raise object.inspectsorununuzu bir irb oturumu açmaktan daha hızlı çözer. Konsol hata ayıklayıcılarını yalnızca bir istisna yükseltme gibi basit çözümlerin sorununuzu çözemediğinde kullanmanızı öneririz.
pry? Bunu nasıl yapacağımı bulamadım; ve bir hata ayıklayıcıdan beklediğim budur.
Ruby'de:
ruby -rdebug myscript.rb
sonra,
b <line>: kırılma noktası koymak n(ext)veya s(tep)vec(ontinue)p(uts) sergilemek için(perl hata ayıklama gibi)
Raylarda: Sunucuyu şununla başlat:
script/server --debugger
ve debuggerkodu ekleyin .
-r debugsaçma olduğunu söylüyorsun ?
facetsgem gereksinimlerinin belirli bir sürümü ile bir Rails 2.2 uygulaması üzerinde çalıştırmak için Pry eski bir sürümünü bulmaya çalışırken bir saatten fazla harcadı ve başarısız oldu. Eski Raylar uygulamaları ruby-debugiçin biraz kötü ama işi hallediyor.
Korkuluğun önerdiği gibi: gözetleme kullanın! Sadece buna katılıyorum.
pry, irb'den çok daha iyi bir cevaptır.
Eklemelisin
require 'pry'
ekleyin ve ardından kaynak kodunuza bir kesme noktası ekleyin.
binding.pry
şeylere bakmak istediğiniz yerde (bu klasik bir IDE ortamında bir kırılma noktasını tetiklemek gibidir)
Programınız bir kez
binding.pry
satırında, programınızın tüm bağlamı elinizin altında olacak şekilde gözetleme replanına atılırsınız, böylece etrafınızdaki her şeyi keşfedebilir, tüm nesneleri araştırabilir, durumu değiştirebilir ve hatta kodu anında değiştirebilirsiniz.
Şu anda bulunduğunuz yöntemin kodunu değiştiremeyeceğinize inanıyorum, bu yüzden ne yazık ki yürütülecek bir sonraki satırı değiştiremezsiniz. Ama iyi yakut kodu zaten tek satır olma eğilimindedir ;-)
İstisnalar yükselterek ayıklama olduğunu çok daha kolay aracılığıyla şaşı dahaprintgünlük ifadeleri ve en hatalar için, onun genellikle çok daha hızlı gibi bir irb ayıklayıcısını açılması dahapryyabyebug. Bu araçlar her zaman ilk adımınız olmamalıdır.
Exceptionzaman yükseltmek ve .inspectsonucuEn hızlı debug yolu Yakut (özellikle Raylar) kodu etmektir raiseçağıran ederken kod yürütme yolu boyunca bir istisna .inspectyöntemine veya nesne (örneğin üzerine foo):
raise foo.inspect
Yukarıdaki kodda, raisebir tetikler Exceptiono senin kod durur yürütülmesini ve elverişli içerdiğini bir hata mesajı döndürür .inspectnesne / yöntemi (yani hakkında bilgi foodebug çalıştığınızı satırda).
Bu teknik, bir nesneyi veya yöntemi hızlı bir şekilde incelemek ( örneğin öyle nilmi? ) Ve belirli bir bağlamda bir kod satırının yürütülüp yürütülmediğini hemen doğrulamak için kullanışlıdır .
byebugpryEğer kodları icra akışının durumu hakkında bilgi sahibi Sadece sonra bir yakut mücevher irb gibi ayıklayıcıya taşınıyor düşünmelisiniz pryveya byebugnerede size yürütme yolunun içindeki nesnelerin durumuna daha derinlemesine araştırmaya olabilir.
Bir sorunu ayıklamaya çalışırken, her zaman iyi bir tavsiye verilir :! @ # $ İng Hata Mesajını (RTFM) okuyun
Bu , size ne anlatmaya çalıştığını anlamanız için harekete geçmeden önce hata mesajlarını dikkatlice ve tamamen okumak anlamına gelir . Hata ayıkladığınızda, bir hata mesajını okurken aşağıdaki zihinsel soruları bu sırayla sorun :
nilmi? ) Yığın izlemesinde, projenizden gelen kod satırlarına özellikle dikkat edin (örneğin app/..., Rails kullanıyorsanız başlayan satırlar ). Sorunun% 99'u kendi kodunuzdadır.
Bu sırayla yorumlamanın neden önemli olduğunu göstermek için ...
Bir noktada şu şekilde çalışan kod çalıştırırsınız:
@foo = Foo.new
...
@foo.bar
ve şöyle bir hata mesajı alırsınız:
undefined method "bar" for Nil:nilClass
Yeni başlayanlar bu hatayı görüp sorun yöntemi olduğunu düşünüyorum baredilir tanımsız . Değil. Bu hatada önemli olan kısım:
for Nil:nilClass
for Nil:nilClass@fooNil demek ! @foobir Fooörnek değişkeni değildir ! Bir nesneniz var Nil. Bu hatayı gördüğünüzde, yöntemin barsınıftaki nesneler için var olmadığını söylemeye çalışmak yakuttur Nil. (iyi duh! çünkü sınıftaki bir nesne için bir yöntem kullanmaya Fooçalışmıyoruz Nil).
Ne yazık ki, bu hatanın nasıl yazıldığından ( undefined method "bar" for Nil:nilClass) bu hatanın barvarlıkla ilgili olduğunu düşünmek için kandırılması kolaydır undefined. Dikkatle okunmadığında bu hata, yeni başlayanların yanlışlıkla baryöntemin ayrıntılarını kazmaya gitmesine neden olur Foove hatanın nesnenin yanlış sınıfta olduğunu ima eden kısmını tamamen kaçırır (bu durumda: nil). Hata mesajlarının tamamını okuyarak kolayca önlenebilen bir hatadır.
Özet:
Herhangi bir hata ayıklama işlemine başlamadan önce hata mesajının tamamını daima dikkatlice okuyun . Bunun anlamı: Her zaman kontrol sınıf bir hata mesajı bir nesne türünü ilk o zaman, onun yöntemlerini , önce sen hata meydana olabilir düşünüyorum nerede herhangi stacktrace veya kod satırına sleuthing başlar. Bu 5 saniye sizi 5 saat hayal kırıklığına uğratabilir.
tl; dr: Yazdırma günlüklerine göz kırpmayın: istisnalar yükseltin veya bunun yerine bir irb hata ayıklayıcısı kullanın. Hata ayıklamadan önce hataları dikkatlice okuyarak tavşan deliklerinden kaçının.
Değişkenleri mümkün olduğunca yazdırın. (Buna printf hata ayıklama denir) Bunu çalıştırarak yapabilirsiniz
STDERR.puts x.inspect
veya
STDERR.puts "Variable x is #{x.inspect}"
Bunu yazmayı daha kolay hale getirmek istiyorsanız, örnek mücevher kullanmak isteyebilirsiniz .
Uyarıları açın. Çalışıyorsanız ruby, -wanahtarla çalıştırın (örn. ruby -w script.rb). İrb'den çalıştırıyorsanız ve 1.9.2'den önce bir ruby sürümü kullanıyorsanız $VERBOSE = true, oturumunuzun başına yazın. Bir örnek değişkenini yanlış yazarsanız, uyarılar açıldığında
uyarı: örnek değişkeni
@valeusbaşlatılmadı
İkili bir pirzola kavramını anlayın (aşağıdaki alıntı Çevik Geliştirici Uygulamalarından alınmıştır )
Sorunlu alanı ikiye bölün ve hangi yarının sorunu içerdiğine bakın. Sonra tekrar yarıya bölün ve tekrarlayın.
İkili bir doğramada başarılıysanız, yapmasını beklediğiniz şeyi yapmayan tek bir satır olduğunu görebilirsiniz. Örneğin
[1, 2, 3].include?([1,2])
falsedöneceğini düşünmenize rağmen, bir değer verir true. Bu durumda, belgelere bakmak isteyebilirsiniz. Dokümantasyon için web siteleri arasında ruby-doc.org veya APIdock bulunur . İkinci durumda, include?sağ üst köşeye yakın olan büyüteç simgesinin yanına yazacak include?, Arrayaltında hangisinin olduğunu seçeceksiniz (sınıfın ne olduğunu bilmiyorsanız [1, 2, 3], [1, 2, 3].classirb yazın) ve eklemeniz gerekir mi? (Array) .
Ancak, dokümantasyon yardımcı olmazsa, belirli bir satırın neden tüm komut dosyasının ne yapmadığını değil, ne yapması gerektiği konusunda bir soru sorabiliyorsanız iyi bir yanıt alma olasılığınız daha yüksektir. olması gerekiyor.
her şeyi siler
2017'ye hoş geldiniz ^ _ ^
Tamam, yeni bir IDE denemeye karşı değilseniz, aşağıdakileri ücretsiz olarak yapabilirsiniz .
launch.jsonkullanmak "cwd"ve ve "program" alanlar kullanılarak {workspaceRoot}makro"showDebuggerOutput"vetrue"debug.allowBreakpointsEverywhere": truevscode; bu Visual Studio ile aynı değildir . Ücretsiz, hafif ve genellikle olumlu sayılır.View->Extensions.vscodeve orada launch.jsonbazı yapılandırma seçeneklerini saklayacağımız yerde bir dosya yapacağız.
launch.json içindekiler
{
"version": "0.2.0",
"configurations":
[
{
"name": "Debug Local File",
"type":"Ruby",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "{workspaceRoot}/../script_name.rb",
"args": [],
"showDebuggerOutput": true
}
]
}
File->Preferences->Settings(veya Ctrl,) öğesini seçip Debugbölüme ulaşıncaya kadar kaydırırız . Genişletin ve adlı alanı arayın "debug.allowBreakpointsEverywhere"- o alanı seçin ve küçük kalem görünümlü simgeyi tıklayın ve olarak ayarlayın true.Tüm bu eğlenceli şeyleri yaptıktan sonra, 2017 ortasında ve daha koyu bir tema için buna benzer bir menüde kesme noktaları ve hata ayıklama ayarlayabilmeniz gerekir:
çağrı yığını, değişken görüntüleyici vb.
En büyük PITA 1) ön koşulları yüklemek ve 2) .vscode\launch.jsonDosya yapılandırmayı hatırlamak . Sadece # 2 gelecekteki projelere herhangi bir bagaj eklemelidir ve sadece yukarıda listelenen gibi yeterince genel bir konfigürasyonu kopyalayabilirsiniz. Muhtemelen daha genel bir yapılandırma konumu var, ama başımın üstünü bilmiyorum.
Şu anda kodumuzda hata ayıklamak için uygun aracı seçmek için bu videoyu şiddetle tavsiye ediyorum.
https://www.youtube.com/watch?v=GwgF8GcynV0
Şahsen, bu videodaki iki büyük konuyu vurgulamak isterim.
Bu benim iki sentim!
Diğer tüm cevaplar zaten neredeyse her şeyi veriyor ... Sadece küçük bir ekleme.
Daha fazla IDE benzeri hata ayıklayıcı (CLI olmayan) istiyorsanız ve Vim'i editör olarak kullanmaktan korkmuyorsanız, bunun için Vim Ruby Hata Ayıklayıcı eklentisini öneriyorum .
Belgeleri oldukça basittir, bu yüzden bağlantıyı takip edin ve bakın. Kısacası, düzenleyicide geçerli satırda kesme noktası ayarlamanıza, duraklamada şık pencerede yerel değişkenleri görüntülemenize, neredeyse tüm olağan hata ayıklayıcı özelliklerine geçmenize izin verir.
Benim için Rails uygulamasının hata ayıklaması için bu vim hata ayıklayıcıyı kullanmak oldukça zevkliydi, ancak Rails'in zengin logger yetenekleri neredeyse bu ihtiyacı ortadan kaldırıyor.
Ben sadece bu gem keşfetti (MRI Ruby 2.0+ için bir hata ayıklayıcı Pry döner)
https://github.com/deivid-rodriguez/pry-byebug
Yükleme yeri:
gem install pry-byebug
sonra tam olarak gibi kullanın pry, kırmak istediğiniz satırı işaretleyin:
require 'pry'; binding.pry
Aksine vanilya gözetlemek ancak bu mücevher gibi bazı kilit navigasyon GDB benzeri komutlar vardır next, stepve break:
break SomeClass#run # Break at the start of `SomeClass#run`.
break Foo#bar if baz? # Break at `Foo#bar` only if `baz?`.
break app/models/user.rb:15 # Break at line 15 in user.rb.
break 14 # Break at line 14 in the current file.
-w(Uyarılar) bayrağını açmairbharika bir başlangıç noktası ekleyeceğim . Küçük şüpheli parçalar ile irb kullanmayı deneyin. Ruby-debug'i (Ruby 1.9+ için ruby-debug19) seviyorum, çünkü çalışan programı durdurmayı, değişkenleri incelemeyi, irb'ye düşmeyi ve sonra çalışmaya devam etmeyi kolaylaştırır.
Ruby kabuk komut dosyasında kolayca hata ayıklamak için ilk satırını şuradan değiştirin:
#!/usr/bin/env ruby
için:
#!/usr/bin/env ruby -rdebug
Daha sonra hata ayıklayıcı konsolu her gösterildiğinde aşağıdakileri seçebilirsiniz:
cDevam için (bir sonraki İstisna, kesme noktası veya şununla:) debugger,n Sonraki satır için,w/ whereÇerçeve / çağrı yığınını görüntüleme,l Mevcut kodu göstermek için,cat yakalamak için.h daha fazla Yardım için.Ayrıca bkz: Ruby-debug ile hata ayıklama , Ruby-debug gem için anahtar kısayolları .
Betiğin askıda kalması ve geri izlemeye ihtiyacınız olması durumunda lldb/ gdblike komutunu kullanmayı deneyin :
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
ve ardından işleminizin ön planını kontrol edin.
Değiştir lldbile gdbeğer işler iyi. Sahip olunmayan sudoişlemde hata ayıklamak için önek ekleyin .
Ruby 2.4.0'dan itibaren, herhangi bir Ruby programının ortasında bir IRB REPL oturumu başlatmak daha kolaydır. Bu satırları programda hata ayıklamak istediğiniz noktaya yerleştirin:
require 'irb'
binding.irb
Ruby kodunu çalıştırabilir ve yerel değişkenleri yazdırabilirsiniz. quitREPL'yi sonlandırmak ve Ruby programının çalışmaya devam etmesine izin vermek için Ctrl + D veya yazın.
Ayrıca kullanabilirsiniz putsve pçalıştığı gibi programınızın değerleri yazdırmak için.
RubyMine kullanıyorsanız , ruby komut dosyalarında hata ayıklamak basit ve kolaydır.
Diyelim ki bir Ruby betiğiniz var hello_world.rb
6. satırda aşağıdaki gibi bir kesme noktası ayarlayın.
Şimdi betiği çalıştırmak için hata ayıklayıcıyı başlatabilirsiniz:
Ardından yürütme bir kesme noktasına çarptığında, değişkenleri vb. Kontrol edebilirsiniz.
printf hata ayıklama
Hata ayıklama teknikleri konusunda her zaman bir tartışma olmuştur, bazı insanlar basılı ifadelerle hata ayıklamayı, bazıları da hata ayıklayıcı ile derin kazmayı sever.
Her iki yaklaşımı da denemenizi öneririm.
Aslında yakın zamanda eski Unix adamlarından biri, printf hata ayıklamanın bazı noktalarda onun için daha hızlı bir yol olduğunu söyledi.
Ancak bir işte yeniyseniz ve büyük bir kod bloğunu anlamanız gerekiyorsa, oraya adım atmak, buraya ve orada bazı kesme noktaları koyarak, nasıl çalıştığını görmek gerçekten yararlıdır.
Kodun nasıl dokunduğunu anlamanız gerekir.
Diğer bazı halk yazılımlarında yeniyseniz, oraya adım atmanıza yardımcı olabilir.
Hızlı bir şekilde düzenleyip düzenlemediklerini veya sadece bir sürü bok olup olmadığını hızlıca öğreneceksiniz.
Ruby standart lib'in kullanımı kolay bir gdb benzeri konsol hata ayıklayıcısı var: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html Ekstra mücevher yüklemenize gerek yok. Rails komut dosyaları da bu şekilde hata ayıklanabilir.
Örneğin
def say(word)
require 'debug'
puts word
end
Tüm hata ayıklayıcının annesi düz eski baskı ekranı. Çoğu zaman, muhtemelen sadece basit nesneleri incelemek istersiniz, hızlı ve kolay bir yol şöyledir:
@result = fetch_result
p "--------------------------"
p @result
Bu, kolay tanımlamak için @result'un içeriğini STDOUT'a önden bir satırla yazdıracaktır.
Rails gibi otomatik yükleme / yeniden yükleme özellikli bir çerçeve kullanırsanız, uygulamanızı yeniden başlatmanız bile gerekmez. (Hata ayıkladığınız kod, çerçeveye özgü ayarlar nedeniyle yeniden yüklenmedikçe)
Bunun benim için kullanım durumunun% 90'ında işe yaradığını düşünüyorum. Ayrıca yakut hata ayıklama da kullanabilirsiniz, ancak çoğu zaman aşırı kilolu olduğunu düşünüyorum.
Seçim yaptığınıza göre farklı özelliklere sahip birçok hata ayıklayıcı var. Önceliklerim şut hareketlerinden memnun kaldı: