IDE olmadan nasıl hata ayıklarsınız? [kapalı]


61

Her zaman bir IDE aradığımda (şu anda Go ile uğraşıyorum), Vi, Emacs, Notepad ++ vb. Öneren insanlarla dolu bir konu buldum.

IDE dışında hiçbir gelişme yapmadım; Galiba şımarık oldum. IDE olmadan nasıl hata ayıklarsınız? Sadece giriş yapmakla sınırlı mısınız?


53
Oldschool printf tarzı bildiğim kadarıyla hata ayıklama :-)
Andrew Walters

25
IDE'lerden önceki günlerde, çalışan bir işleme eklenmiş ya da program durumunun adım atmasına ya da gözden geçirilmesine izin vermek için işlemi saran hata ayıklayıcıları kullandık. (gdb, perl -d, etc ...) Hata ayıklayıcıların IDE'lere entegrasyonu bunu kolaylaştırır, ancak ayrı olarak var olurlar. Hata ayıklayıcılarda hata ayıklama, günlüğe kaydetme ... günlüğe kaydetmenin, programın geri alındığı zamandaki durumunu değiştirmemesini sağlayın ve bulmaya çalıştığınız hatayı yeniden ekleyin.

7
komut satırı hata ayıklayıcı, (çeşitli IDE hata ayıklayıcıları bunlara dayanır)
cırcır

14
Yavaş ve dikkatli bir şekilde.
SinirliFormsDesigner'la

3
Baskılar oldukça yaygın olsa da kullanımı, yarış koşulları gibi daha ince olan bazı böcekleri gizleyebilir.
James

Yanıtlar:


86

Bir hata ayıklayıcı kullanarak. Çoğu zaman, bu aynı zamanda bir IDE'nin sahne arkasında yaptığı şeydir - sadece bir GUI'deki deneyimi tamamlar.

Unix'te, en yaygın kullanılan hata ayıklayıcılardan biri gdb, daha önceki Unix hata ayıklayıcılarını büyük oranda destekleyen GNU'dur dbx.

Hata ayıklamanın komut satırından nasıl göründüğü / hissettirdiği hakkında bir fikir edinmek için, gdb kılavuzuna bakabilirsiniz .

Diğer alanlarda olduğu gibi, komut satırından bir hata ayıklayıcı kullanmak, bir sözdizimi ve bir dizi komut öğrenmeyi gerektirir, ancak bununla birlikte çok fazla esneklik ve komut dosyası oluşturma yeteneği getirir . Öte yandan, zaten vim veya emacs gibi bir editörde çalışmaktan rahatsanız, favori editörünüzün favori hata ayıklayıcınız için bir eklenti olduğunu görebilirsiniz.


18
"Bir hata ayıklayıcı kullanarak" için +1.
IDE'deki

1
Python'da yazarsanız, pdbbulduğum herhangi bir IDE hata ayıklayıcısından daha iyidir.
asthasr

1
@ syrion Ve ipdbbundan daha iyidir;)
Izkata

Mükemmel - Bunun olduğunu bilmiyordum Izkata. Teşekkürler.
asthasr

@ joshin4colours entegre! = Koleksiyon, hayır?
Cole Johnson

35

Grafik sürücüleri yazarken birkaç yıl boyunca hata ayıklayıcı kullandım. Hata ayıklayıcısını birincisine karşı çalıştıran ikinci bir bilgisayarım vardı (çünkü birincil bilgisayardaki ekran grafik sürücüsü bozulduğunda çalışmayacaktı). Kodu durdurabilmek ve donanıma astığım noktaya adım atabilmek çok önemliydi, böylece ne olduğunu anlayabilecektim.

Tamamen yazılım sorunları için, sorun hakkında düşünmenin ve sistemin sorun hakkında daha fazla bilgi edinmek için test etmenin, kod satır satır satır adım atmanın çok daha faydalı olduğunu düşünüyorum. Print cümleleriyle, komut satırında veya günlük dosyasında olanları inceleyip yeniden yapılandırabildiğim, hata ayıklayıcı ile yapabileceğimden daha kolay ileriye ve geriye doğru giden her şeyin bir listesi var.

En zor hatalar genellikle sorunu bilgisayardan uzaklaştırarak çözülür. Bazen bir parça kâğıt veya beyaz tahta ile, bazen de başka bir şey yaparken cevap kendini ortaya koyuyor. En zor böcek, Where's Waldo'yu oynamak gibi koda dikkatlice bakarak çözülür. Geri kalan her şey baskı ifadeleri veya günlük ifadeleriyle kolay görünüyor.

Farklı insanların farklı stilleri vardır ve farklı stiller farklı işler için daha iyidir. Baskı ifadeleri mutlaka bir hata ayıklayıcıdan bir adım aşağı değildir. Yaptıklarına bağlı olarak, daha iyi olabilirler. Özellikle yerel bir hata ayıklayıcı olmayan bir dilde (Go?).


7
Bu. Kesinlikle bu. En azından benim için sorunların bir hata ayıklayıcının daha belirgin hale getirmeyeceği mantıksal hatalar veya etkileşimler olma eğilimindedir. Bir şeylerin neden yanlış gittiğini anlamalısınız , sadece neyi değil .
Sahte İsim

2
Tamamen için +1 going backwards. Sık sık deneyime sahip: "Hey - waittaminute, bu doğru değeri değil nasıl oldu bu hale bu ?" Ve kodu okurken çıktıda ileri geri gitmek zorunda. Hata ayıklayıcıları geriye doğru kötü.
Izkata

Evet, gdb terkedilmiş çekirdeği incelemek için iyidir, ancak böyle durumlarda, baskı ifadelerinin berbat bir şekilde kullanılmasının gerçekten yardımcı olduğunu gördüm.
Brian

Hata ayıklayıcılar yararlı ancak geçicidir. İyi bir günlüğe kaydetme çerçevesiyle hata ayıklama oturumumu oluşturabileceğimi biliyorum. Durumu anlamaya yardımcı olmak için hata ayıklayıcısını kullanın, hata ayıklama oturumunu kalıcı hale getirmek için basılı ifadelerle tamamlayın. Zaman zaman hata ayıklayıcısına daha az ve daha az dava
açtığımı

Evet, bir parça kâğıt veya beyaz tahta ile veya sadece zihninizde düşünmek hata ayıklamanın en iyi yoludur. Sık sık düşünme sürecinizi düzeltir. Hata ayıklayıcınız bazen programınızdaki hataların neden olduğuna dair orijinal sorunu çözemeyen kolay bir yoldur :)
Nishant

11

Bazı insanlar komut satırında gdb veya bir eklenti kullanır . DDD gibi bağımsız GUI ön uçları gdb'ye de sahiptir . Dilinize bağlı olarak , python için Winpdb veya java için jswat gibi, dile özgü bağımsız hata ayıklayıcı GUI'leri vardır . Bu projeler yalnızca hata ayıklamaya odaklandıklarından , genellikle tümleşik hata ayıklayıcılardan üstündürler.

IDE'lerle ilgili diğer kirli küçük sır, hepsi kendi tuzuna değiyor, özel bir editör belirlemenize izin veriyor, bu nedenle IDE'nin bölümlerini belirli görevler için kullanabilirsiniz, ancak düzenleme için uygun bir editör kullanın. Bir IDE'yi yalnızca hata ayıklayıcısını kullanmak için ateşlemek alışılmadık bir durum değil, özellikle de meslektaşlarınızın kullandığı şey buysa.


1
1 elbette Diğer seçenek :) IDE editörü üzerinde renk düzeni ve keybinds ayarlayın ve taklit etmektir
darvids0n

1
@ darvids0n, Yirmi yıldan uzun bir süredir IDE'leri kullanıyorum ve YET'im var, belki de bir gün gelecek yüzyılda denemeye çalışmayı düşünmeye başlayabileceğini düşünerek ipucu veren bir editör bulmak için YET'im var GNU Emacs'a bir mum tutun.
John R. Strohm

6

Bazı diller bir REPL sunar - yani kod satırını yazarken satır satır yazabilir ve uygulayabilirsiniz; bu, bir kod parçasını doğrulamanın ilk adımı olabilir. Bunların çoğu ayrıca hata ayıklama olanakları sunar. Haskell için GHC, bir IDE'nin yapacağı gibi, komut satırındaki bir programı etkileşimli olarak hata ayıklamak için kullanılabilen GHCi ile birlikte gelir.


2

Neden printf deyimlerinin kullanımıyla hata ayıklamanın engellenmediğini anlamıyorum. Bir programı yeniden derlemek ve bağlamak çok uzun sürdü, ancak bugün sadece birkaç saniye sürüyordu. Cout, printf, qDebug (), vb. Tür çıktı kullanarak hata ayıklamayı çok kolay buluyorum. Printf ifadeleri size programın yaptığı her şeyin çalışan bir geçmişini verir, gerçekte sonra analiz edebilirsiniz, oysa hata ayıklayıcıda çalışmak programın akışını manuel olarak hatırlamanıza neden olur. Printf'ler ile değişkenlerin değerini belirli birimlere dönüştürebilir, onaltılık, her ne olursa olsun, onlarla görüntüleyebilirsiniz. Printf ifadeleri rutinlerin ve değişkenlerin adlarını ve satır numaralarını da listeleyebilir. Diğer değişkenlere bağlı olarak yalnızca belirli dizi öğelerini listeleyebilirsiniz. İndirmeleri takip edebilirsiniz. Çıktıyı kolayca kontrol edebilirsiniz, sayaçlar koymak, sadece bir döngü aracılığıyla belirli zamanlarda yazdırmak, hata ayıklama gibi baskı ifadeleri eklemek ve kaldırmak, farklı hata ayıklama çıktı seviyelerine sahip olmak, dosyalara yazmak, vb. Elle adım adım attığınız tüm yerleri hatırlamaya çalışın ve belki de programın ne yaptığını keşfetmek için değişkenlerin içeriğini zaman içinde değiştikçe yazmalısınız. Ve son olarak, printf ifadeleri ile gelecekteki hata ayıklama için bunları kalıcı olarak açık ve kapalı duruma getirebilirsiniz. Programınızın geçmişini bir dosyaya yazılmış olarak görmek, elle adım adım attığınız tüm yerleri hatırlamaya çalışmaktan çok, programın ne olduğunu bulmak için zaman içinde değiştikçe değişkenlerin içeriğini yazmak zorunda kalabilirsiniz. yapıldı. Ve son olarak, printf ifadeleri ile gelecekteki hata ayıklama için bunları kalıcı olarak açık ve kapalı duruma getirebilirsiniz. Programınızın geçmişini bir dosyaya yazılmış olarak görmek, elle adım adım attığınız tüm yerleri hatırlamaya çalışmaktan çok, programın ne olduğunu bulmak için zaman içinde değiştikçe değişkenlerin içeriğini yazmak zorunda kalabilirsiniz. yapıldı. Ve son olarak, printf ifadeleri ile gelecekteki hata ayıklama için bunları kalıcı olarak açık ve kapalı duruma getirebilirsiniz.


3
“Bir programı yeniden derlemek ve bağlamak çok uzun sürdü, ancak bugün sadece birkaç saniye sürdü”. Dilinize ve projenin boyutuna bağlıdır. Mevcut projemdeki bir başlık dosyasını değiştirirsem, 32-CPU'luk bir makinede 256 GB RAM ile yeniden oluşturmak yaklaşık 65 dakika sürer (şaka yapmıyorum)
Nemanja Trifunovic

İnsanların print ifadeleriyle hata ayıklamak için "isteksizliği" yoktur, sadece bir hata ayıklayıcıyı tercih ederler. Hiç hata ayıklayıcı kullanmayan, "hiç hata ayıklama yapan" insanlardan "printf" kullanarak hiç hata ayıklamayan çok daha fazla "printf" insanı tanıyorum.
Karl Bielefeldt

1
Yeterince dağıtılmış bir sistem için bir hata ayıklayıcı kullanmak şaşırtıcı derecede zordur, ancak günlükleri ilişkilendirmek (saat senkronizasyonu sorunu nedeniyle bir miktar kesinti olmadan) mümkündür. Yazılım sisteminiz 100 farklı makinede çalışan ikili dosyalardan oluşuyorsa, log / "printf hata ayıklama" hata ayıklayıcıları kullanmaktan ve her şeyi başka problemler ortaya koymayacak kadar yeterli adımda tutmaya çalışmaktan daha kolay olabilir.
Vatine

2

jimwise soruyu oldukça iyi cevapladı , ancak şunu da eklemeliyim ki, tam IDE'siz çalışmayı tercih ederseniz, Microsoft'un Windows için komut satırı hata ayıklayıcısını CDB olarak vermesi gerekir . CDB , Windows SDK'yı indirdiğinizde GUI'ye eşdeğer olan WinDBG dahil olmak üzere başka araçlarla birlikte gelir .


4
Bu soruyu nasıl cevapladığını daha ayrıntılı olarak açıklayabilir misiniz?
gnat

Haklısın, tek başına soruyu cevaplamıyor. @ Jimwise'ın cevabının soruya iyi bir cevap olduğunu hissettim, ancak Windows için bir komut satırı hata ayıklayıcısının nerede bulunacağı hakkında hiçbir bilgi içermediğini hissettim. Bu yüzden, bununla karşılaşanlara ve Windows'ta nasıl yapılacağını merak edenlere ek bir cevap vereceğimi düşündüm. Cevabımı kadar söyleyecek şekilde güncelleyeceğim.
Drew Marsh

2

Genellikle bir hata ayıklayıcı kullanmıyorum, belki birkaç haftada bir kez ama gitmem gereken ilk şey değil.

İşimdeki en önemli araç o kadar her yerde ki neredeyse söylemeyi unuttum - yığın izleri. Karşılaştığım sorunların% 90'ından fazlası yığın izlerini inceleyerek çözülebilir. Dilinize bağlı olarak bu araç her zaman çok yardımcı olmamakla birlikte, bir dil tarafından iyi bir şekilde uygulandığında size inanılmaz bir zaman kazandırabilir.

Sanırım basit problemleri saptadığım en yaygın ikinci yöntem muhtemelen değiştirdiğim kod. Birim testleri çok sık kullanıyorum, bu yüzden genellikle ne kırdığımı biliyorum.

Daha karmaşık geliştirme ve hata ayıklama için bazı hata ayıklama veya izleme düzeyi günlük ifadeleri ekleyebilirim. Gelişim problemlerini, üretim izini / hata ayıklama günlüğü bilgisini yerleştirmeme yardımcı olacak iyi bir rehber olarak görüyorum.

Her zaman kullanışlı bir hata ayıklayıcı yok. Üretimde bir hata ayıklayıcı çalıştırmak mümkün olmayabilir (Heck, şirketinizin ne kadar güvenli olduğuna bağlı olarak günlükler dışında üretim makinelerine erişmek mümkün olmayabilir). Ayrıca bir hata ayıklayıcısını takmanın çok uzun sürdüğü veya belki de iyi hata ayıklayıcıların bulunmadığı diller vardır.

Tüm boyunca mantık ve hata ayıklama / izleme düzeyi günlük kaydı kullanarak kodlama yapıyorsanız, bu, donanıma erişmeden bile sorunu çözmek için mükemmel günlük ifadelerinizi (Muhtemelen günlük seviyesini artırabilir) incelemeniz olabilir.

Hata ayıklayıcıların güçlü bir araç olduğunu düşünüyorum, ancak araç kutunuzdaki tek araç olmalarına izin vermeyin!


1

Bağımsız bir metin düzenleyicisiyle birlikte bir hata ayıklayıcısını IDE'de kullanamamanızın hiçbir nedeni yoktur. Zap'ı düzenlemek için kullanırdım, başka bir makinede hata ayıklamak için JBuilder'ı ve bodrumdaki bir dosya sunucusunu kullanırdım. Geleneksel olarak hata ayıklayıcılar, bir IDE boyunca sürüklemeden bağımsız programlardı ve bu da işe yarıyor.

Kapsamlı testlerin hata ayıklamanın yerini aldığına dikkat etmek önemlidir. Bildirilen bir hatanın kodunuzda değil de testinizde hata olarak kabul edilmesi faydalı olacaktır.

Bir de var printf. Her satırda durmak yerine, büyük miktarda "günlüğe kaydetme" oluşturmak ve içinde arama yapmak yararlı olabilir. -Xbootclasspath/p:Java kütüphanesi sınıflarını kırmak için kullanarak, üretimde değiştiremeyeceğiniz kütüphane sınıflarını değiştirebiliyorsanız, özellikle yararlı buluyorum .


"Kapsamlı testlerin hata ayıklamanın yerini aldığının farkına varmak gerekir." - "Yerinden edilmek" yerine, indirim olduğunu söyleyebilirim Bir hata ayıklayıcısından kod çalıştırmanın yararlı olduğu kesin durumlar vardır, TDD yaparken bile - örneğin bir test tamamen beklenmedik bir sonuç verirse, tam olarak nerede yanlış gittiğini bulmak çok yararlı olabilir - kuşkusuz, küçük parçada değilse az önce yazdığınız kodun anlamı, bu önceki testinizde son bir davayı kaçırdığınız anlamına geliyor, ancak bu gerçekleşiyor ...
Jules

1

En iyi sorunların bilgisayardan bir kalem ve kağıtla çözülebileceğini veya sadece sorunu düşünebileceğini kabul edin. Bu, canlı hata ayıklayıcıları kullanmaktan daha yararlıdır. Sık sık düşünme sürecinizi düzeltir.

Basit bir kullanıcı arayüzüne dayanan bir konsol olan pudb kullanabilirsiniz . Bir REPL girmek ve daha ayrıntılı incelemek istiyorsanız, tercih ettiğiniz hata ayıklayıcısını pdb veya ipdb gibi seçebilirsiniz.

Ayrıca , daha kapsamlı bir araç koleksiyonu için PythonDebuggingTools Wiki'ye bakın.


Asıl soru Go'yla ilgili, Python ile değil.
TMN

Doğru, bir şekilde özledim. Bir Python hata ayıklayıcısını denetlerken aramada ortaya çıktı.
Nishant
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.