Hata ayıklamayı öğrenmek
Hata ayıklama, "çalışmıyor"u adım adım daraltıp tek bir satıra inmektir; düzeltmenin kendisi genellikle saniyeler alır, zaman alan şey o satıra ulaşmaktır. Bu daraltmayı mümkün kılan ne bir araç ne de deneyimdir; güvenilir bir tekrardır: hatayı istediğiniz an üretemediğiniz sürece yaptığınız her değişiklik bir tahmindir.
- Ders 12 / 14
- Başlangıç
- Ücretsiz, kayıt yok
"Çalışmıyor"dan tek bir satıra
-
1
Çalışmıyor
Kullanıcının gördüğü her ne ise. Henüz bir bildirim, bir problem değil.
-
2
Hangi işlemle tekrarlanıyor?
En kısa yol, aynı veri, tanımlı bir başlangıç durumu. Bu bant olmadan diğerleri anlamsızdır.
-
3
Hangi katman?
Tarayıcı, ağ, sunucu, veritabanı. Tek bir ağ isteği ya da tek bir günlük satırı bu bandı bir dakikada kapatır.
-
4
Hangi fonksiyon?
İkiye bölmenin yeri burasıdır. On bölme, bin satırı bire indirir.
-
5
Hangi satır?
İnancınızla programın davranışının ayrıldığı satır. Genellikle hatanın yazdırıldığı satır değildir.
Bir bant ancak elinizde kanıt olduğunda kapanır, sezginiz olduğunda değil. İlk banttan sonuncuya atlamak tam da saatlere mal olan şeydir.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Hata ayıklama nedir ve zamanınızın çoğu neden düzeltmeye değil bulmaya gidiyor?
Hata ayıklama, "çalışmıyor" ile "bu satır yanlış" arasındaki mesafeyi kapatmak demektir. Yeni başlayan birinin karşılaştığı hataların çoğunda düzeltme tek bir kelime ya da tek bir işarettir. Bütün iş, o kelimeye ulaşmaktır.
Her şeyi basitleştiren daha keskin bir tanım var: hata, programa dair inancınızın programın gerçekte yaptığı şeyden ayrıldığı yerdir. Bir program asla "tuhaf" davranmaz, keyfi de yoktur; tam olarak yazdığınız şeyi yapar. Yani hata ayıklama, tasavvurunuzun gerçeklikten ayrıldığı noktayı bulmaktır.
Bu tanımın pratik bir sonucu var. Hata, inanç ile gerçeklik arasındaki bir boşluksa, bu ikisini yan yana koyan her şey ilerlemedir, koymayan hiçbir şey değildir. Bir değeri yazdırmak ilerlemedir. Belki düzelir umuduyla bir satırı değiştirmek değildir; o kumardır ve en kötü yanı, kazandığınızda bile hiçbir şey öğrenmemenizdir.
Ve kimsenin yeni başlayanlara söylemediği bir şey: hata ayıklama hızınız, dili ne kadar bildiğinizden çok yönteminizin ne kadar düzenli olduğuna bağlıdır. Deneyimli bir geliştirici de aynı beş aşamadan geçer, sadece ilgisiz tahminleri daha hızlı eler.
Neden her şey hatayı tekrarlanabilir kılmakla başlar?
Güvenilir bir tekrar, şunu yazabilmeniz demektir: "şunu yap, şu olur." Bu cümleye sahip olana kadar başka hiçbir şeyin anlamı yoktur. Sonrasında ne değiştirirseniz değiştirin, düzeldi mi yoksa bu sefer olmadı mı bilemezsiniz.
İyi bir tekrarın üç unsuru vardır: hataya ulaşan en kısa yol, hatanın oluştuğu verinin kendisi ve tanımlı bir başlangıç durumu. "Bazen sipariş verirken hata veriyor" bir tekrar değildir. "Yeni oluşturulmuş bir kullanıcı, boş sepet ve süresi dolmuş bir indirim koduyla gönder düğmesi 500 döndürüyor" bir tekrardır ve bu tek cümle işin yarısını yapmıştır.
Şimdi tam da bu sitede zaman kaybettiren ve kendi teknik notlarımıza yazılmış bir tuzak: tekrarınız sandığınız şeyi test etmiyor olabilir. Burada bir sayfanın önbellek dosyasını sildiğimizde, web sunucusu o silinmiş dosyayı bir dakikaya kadar sunmaya devam eder, çünkü dosya arama sonucunu 60 saniye saklar. Silme işleminin hemen ardından sayfayı açarsanız eski sayfayı görür ve silmenin işe yaramadığı sonucuna varırsınız. İşe yaramıştı; siz erken baktınız.
Bu, genel bir hatanın özel bir hali: yaptığınız şeyle gördüğünüz şey arasında haberiniz olmayan bir katman vardır. Tarayıcı önbelleği, ağ önbelleği, kod önbelleği, dosyanın başka bir sunucudaki eski bir kopyası. Sorulacak ilk soru "neden çalışmıyor" değil, "değiştirdiğim şeyi çalıştırdığımdan emin miyim?" sorusudur. PHP kodunda bunu kanıtlamanın en basit yolu, bilerek yanlış bir yazdırma satırı koyup hiç görünüp görünmediğine bakmaktır.
Bir hata mesajı gerçekte nasıl okunur?
Yeni başlayanların çoğu hata mesajını okumaz. Bakar, kırmızıdan ürker ve doğrudan aramaya gider. Oysa mesaj genellikle tam ihtiyacınız olan şeyi söyler; kimse onlara okuma sırasını öğretmemiştir.
Sıradan bir hatanın üç parçası vardır. Tür, ne sınıf bir şeyin olduğunu söyler. Metin, neyin neye olduğunu söyler. Konum, bir dosya ve satır numarası verir. Arkalarında da genellikle bir yığın izi bulunur: buraya gelmek için çağrılmış fonksiyonlar zinciri.
Yığını aşağıdan yukarı okumayın. Hataya en yakın satır listenin en üstündedir, çünkü çoğu dil en yeniyi başa koyar. Ama asıl aradığınız en yakın satır değildir; kendi yazdığınız en yakın satırdır. İlk beş satır sizin yazmadığınız bir kütüphaneye aitse, sorun genellikle orada değildir; o kütüphaneyi çağırıp ona yanlış bir şey veren kendi kodunuzun ilk satırındadır.
Ve bu bölümün en önemli noktası: hatadaki satır numarası, sorunun fark edildiği yerdir, mutlaka oluştuğu yer değil. Satır 42 bir değişkenin boş olduğunu söylüyorsa, satır 42 sağlamdır; onu doldurması gerekip doldurmayan yer daha yukarıdadır. Günlük bir örnek: "null üzerinde bir metot çağrısı" mesajı neredeyse hiçbir zaman yazdırıldığı satırla ilgili değildir. O değeri üretmesini beklediğiniz, ama bunun yerine hiçbir şey döndüren satırla ilgilidir ve ikisi arasında on fonksiyon çağrısı olabilir.
Hiç hata vermediğinde ne yaparsınız?
En zor hatalar, hata vermeyenlerdir. Program çalışır, biter ve sonuç yanlıştır ya da hiç sonuç yoktur. Burada ilk belirlenecek şey şudur: gerçekten hata yok mu, yoksa var da siz mi göremiyorsunuz? Bu ikisi çok farklıdır ve çoğu durumda cevap ikincisidir.
Bir hatanın kaybolduğu üç olağan yer: sunucuda hata gösterimini kapatan bir dil ayarı, hatayı yutup onunla hiçbir şey yapmayan bir yakalama bloğu ve yanlış çıktı kanalı. Üçüncüsü en az bilinen ve en çok zaman yiyendir.
Bir komut satırı programının iki ayrı çıktı kanalı ve bir çıkış kodu vardır. Yalnızca ilkini okursanız, bozuk bir araçla boş bir sonuç size tıpatıp aynı görünür. Bu sunucudan gerçek bir örnek, bu dersin yazıldığı gün: WordPress veritabanı sorgu komutunu çalıştırdık ve standart çıktıya sıfır bayt yazdı. Orada "hiç satır yok" sonucuna varmak yanlış olurdu. Çıkış kodu 1 idi ve hata kanalında veritabanına hiç bağlanamadığı yazıyordu.
Bu bölümün kuralı: boş bir sonuç, yokluğun kanıtı değildir. Boş bir çıktıya güvenmeden önce çıkış koduna bakın ve hata kanalını ayrıca okuyun.
Aynı hatanın herkesin başına gelen daha basit bir hali var: arama aracınız bir şey bulamaz ve siz o şeyin var olmadığı sonucuna varırsınız. Tam da bu sitede, ana sayfadaki robots etiketi tek tırnakla yazdırılır. Onu çift tırnakla ararsanız sıfır sonuç alır ve etiketin eksik olduğunu ilan edersiniz. Etiket oradadır. Deseniniz yanlıştı ve araç tam olarak bunu söyledi: "istediğin bulunamadı." Gerisini siz eklediniz.
Program hata mı veriyor, yoksa sessizce yanlış şeyi mi yapıyor?
Mesajı baştan sona okuyun
- Tür, metin, dosya ve satır numarası
- Yığında, kendi yazdığınız ilk satır
- Hata satırı fark edildiği yerdir, oluştuğu yer değil
Önce gerçekten hata olmadığını kanıtlayın
- Sunucuda hata gösterimi kapalı mı?
- Bir yakalama bloğu onu yutuyor mu?
- Çıkış kodunu ve hata kanalını ayrı ayrı kontrol ettiniz mi?
İki dal tümüyle farklı yöntemler ister. Boşa giden zamanın çoğu, sessiz dalda durup hata mesajı arayan kişiye aittir.
İkiye bölme: o tek satıra giden en kısa yol
Bir tekrarınız varsa, hatayı okuduysanız ve hâlâ nerede olduğunu bilmiyorsanız, neredeyse her zaman işe yarayan ve zekânıza bağlı olmayan bir yöntem var: ikiye bölün.
Mantığı basit. Programınız bin satırsa ve sorunun nerede olduğunu bilmiyorsanız, bakılacak bin yeriniz var. Yarısını devre dışı bırakın; hata hâlâ duruyorsa beş yüz yer elendi. On bölme, bini bire indirir. Saatlerce bakmayı gerektiren bir sorun için on adım.
Bunun üç pratik hâliyle kendi gününüzde karşılaşırsınız. Kodda: fonksiyonların yarısını yorum satırı yapın ya da erken return koyun. Veride: bin satırlık girdi dosyasını beş yüze indirip hatanın kalıp kalmadığına bakın; hâlâ hata veren en küçük girdiye ulaşana kadar. O girdi tek başına cevabın yarısıdır. Zamanda: dün çalışıp bugün çalışmıyorsa, bin satır arasında değil iki sürüm arasında arayın. Git'in tam bunun için bir komutu vardır, git bisect; bölmeyi sizin yerinize yapar ve sizden yalnızca her adımdan sonra o sürümün sağlam mı bozuk mu olduğunu söylemenizi ister.
Ve yeni başlayanları kurtaran bir nokta: bölerken hâlâ hata veren en küçük örneği mutlaka bir kenarda tutun. Aynı hatayı üreten on satırlık bir dosya, aynı hatayı üreten bin satırlık bir projeden kıyaslanamayacak kadar değerlidir, çünkü içinde dikkatinizi dağıtacak bir şey kalmamıştır. Birinden yardım isteyecekseniz de bütün projeyi değil, o on satırı gönderirsiniz.
Bir bölme turu
-
1
Yarısını kapatın
Fonksiyonların yarısı, girdi satırlarının yarısı ya da bir sürüm aralığı. Hangisi olduğu değil, yarı olması önemlidir.
-
2
Aynı tekrarı yeniden çalıştırın
Tam olarak aynı yol ve aynı veri. Tekrar değişirse bu turun sonucu bir işe yaramaz.
-
3
Hâlâ bozuk mu? Sağlam yarıyı atın
Hâlâ hata veriyorsa sorun açık bıraktığınız yarıdadır; düzeldiyse kapattığınız yarıda. Her iki durumda da alanın yarısı elenir.
-
4
Hata veren en küçük örneği saklayın
Aynı hatayı üreten on satır sizi hedefe götürür ve size yardım edecek kişiye vereceğiniz şeydir.
Bu döngü, ancak turda tam olarak tek bir şey değiştiği sürece işler. Aynı anda iki değişiklik onu tekrar tahmine dönüştürür.
Her seferinde tek bir şeyi değiştirin ve denediklerinizi yazın
Küçük bir alana indiğinizde, daha çabuk bitsin diye üç şeyi birden değiştirmek isteyeceksiniz. İşe yararsa hangisinin düzelttiğini bilemezsiniz. Kötüleşirse artık bir yerine üç değişkeniniz olur. Acele etmenin sizi kesinlikle yavaşlattığı tek yer burasıdır.
Doğru yöntemin sabit bir biçimi vardır. Yanlışlığı kanıtlanabilir bir hipotez kurun: "sanırım önbellekten" değil, "önbellekten ise, temizleyince sonuç değişir." Sonra bu hipotezi doğrulayacak ya da öldürecek en ucuz testi seçin, yalnızca o tek şeyi değiştirin ve sonuca bakın. Hipotez yanlışsa değişikliği geri alın. Yeni başlayanlar bu son kısmı atlar ve bir saat sonra kod, kendisi yeni hata olan ilgisiz düzenlemelerle dolar.
Ve bir kez denemeden kimsenin değerine inanmadığı bir alışkanlık: bir metin dosyası açın ve denediğiniz her şeyi sonucuyla birlikte yazın. Satır başına üç kelime. Size üç şey kazandırır: aynı şeyi iki kez denemekten kurtulursunuz, yarın döndüğünüzde sıfırdan başlamazsınız ve sorunu birine anlatmanız gerekirse anlatım hazırdır.
Çoğu zaman cevabı üreten şey, o anlatımı yazmaktır. İnsanların buna bir adı bile var: sorunu tarafsız bir dinleyiciye sesli anlatmak, o dinleyici masadaki plastik bir oyuncak olsa bile. Sebebi şu: anlatmak, varsayımlarınızı tek tek söylemeye zorlar ve hata genellikle o kadar apaçık göründüğü için hiç dile getirmediğiniz varsayımdadır.
Yazdırmak mı hata ayıklayıcı mı? Peki canlı sunucuda?
İki ana aracınız var ve hangisinin daha iyi olduğunu tartışmak anlamsız, çünkü farklı işler yapıyorlar.
Yazdırmak, bir değişkenin değerini gösteren bir satır eklemektir. Avantajı her yerde çalışmasıdır: küçük bir betikten erişiminiz olmayan bir sunucuya kadar, üstelik hiçbir kurulum istemez. Dezavantajı, her çalıştırmanın size tek bir anlık görüntü vermesidir; yanlış yere koyduysanız yeniden çalıştırmanız gerekir. Günlük hataların çoğu için yeterlidir ve profesyonellerin yazdırmadığını söyleyen kişi, profesyonelleri yakından izlememiştir.
Hata ayıklayıcı programı yolun ortasında durdurur, bütün değişkenleri bir arada görmenizi ve satır satır ilerlemenizi sağlar. Nereye yazdıracağınızı hiç bilmediğinizde ya da kodun akışı o kadar çok dallandığında ki hangi dala girildiğini kestiremediğinizde hakkını verir. Öğrenmek yarım gün alır ve o yarım günü çabuk geri alırsınız.
Canlı bir sunucuda ikisi de olağan hâliyle işlemez. Hata ayıklayıcı bağlayamazsınız ve ziyaretçinin göreceği bir şey yazdıramazsınız. Orada tek bir şeyiniz vardır: günlük. Ve bir kez anlatmaya değer yaygın bir hata: günlüğe yazmak, görülmek demek değildir. Sunucunun hata seviyeleri mesajınızın hiç kaydedilmeyeceği şekilde ayarlanmış olabilir ya da günlük dosyası aklınıza gelmeyecek bir yerde olabilir. Bir hatanın peşine düşmeden önce günlüğe anlamsız bir satır yazın ve onu bulun. O satırı görene kadar, diğer mesajları görmemeniz hiçbir şeyi kanıtlamaz.
Hazır buradayken, günlüğe asla girmemesi gereken üç şey: parolalar, jetonlar ve kullanıcıların kişisel verileri. Günlük, birkaç kişinin okuduğu ve uzun süre duran bir dosyadır.
Yapay zekayla hızlı yol
Hızlı yol, "hatayı yapıştır ve neden diye sor" değildir. Bu, doğru görünen ama programınızla ilgisi olmayan cevaplar getirir, çünkü model tahmin edemeyeceği üç şeye sahip değildir. Asıl hızlı olan şudur: üç kanıtı toplayın ve modelden düzeltme değil, <strong>olasılığa göre sıralanmış bir hipotez listesi ve her biri için onu çürütecek en ucuz test</strong> isteyin. Testlerden birini siz çalıştırırsınız ve tek turda listenin yarısı elenir. Bu bir muhakeme işidir, yani hızlı değil sınır seviyesinde bir model ister; kodlama modelleri arasındaki güncel tercihimiz <a class="text-link" href="/ai/code/">kodlama için en iyi yapay zekâ</a> sayfasındadır ve orada güncellenir.
- Üç kanıtı toplayın: tam tekrar, yığın iziyle birlikte hatanın tam metni ve en son çalıştığından beri neyin değiştiğinin listesi.
- Kod istemediğinizi açıkça söyleyin. Bu aşamada yalnızca hipotez istersiniz; aksi hâlde model düşünmek yerine yama yazar.
- Listedeki en ucuz testi kendiniz çalıştırın ve ham sonucu yorumsuz geri verin. Yorumunuz, modeli sizinle aynı fikre getiren şeyin ta kendisidir.
- Tek bir hipotez ayakta kaldığında ancak o zaman düzeltmeyi isteyin ve mümkün olan en küçük değişikliği isteyin. Sonra ilk tekrarı kendiniz çalıştırın.
Kopyalamaya hazır şablon
Bir hatam var ve kod istemiyorum. Yalnızca hipotez istiyorum.
KANIT 1 - tam tekrar:
{Şunu yapıyorum: ...} {Şu oluyor: ...} {her seferinde / ara sıra}
KANIT 2 - hatanın tam metni (varsa):
{yığın iziyle birlikte buraya yapıştır, özetleme}
{hata yoksa şunu yaz: hata yok. Gözlenen çıktı: ... Beklenen çıktı: ...}
KANIT 3 - en son çalıştığından beri değişenler:
{kod / kütüphane sürümü / sunucu ayarı / veri / bildiğim kadarıyla hiçbir şey}
ORTAM: {dil ve sürümü}, {işletim sistemi veya sunucu} üzerinde
İSTEDİĞİM:
1. Neden için en fazla 5 hipotez, en olasıdan en az olasıya sıralı.
2. Her biri için onu doğrulayacak ya da öldürecek en ucuz test: tek bir komut veya belirli bir kontrol.
3. Her biri için, doğru olsaydı başka ne görüyor olmam gerekirdi. Onu görmezsem hipotez düşer.
4. Ayrıca, bilmediğin ama bilseydin sıralamayı değiştirecek olan şeyler.
Hiç kod yazma. Düzeltmeyi bir sonraki mesajda isteyeceğim.
Çıktıya güvenmeden önce: Hipotez listesi, programınıza göre değil modelin gördüklerine benzerliğe göre sıralanmış tahminlerdir. Testleri kendiniz çalıştırın ve turda birden fazla değişiklik yapmayın. Mesaja girmemesi gereken üç şey: parolalar ve jetonlar, kullanıcıların kişisel verilerini içeren günlükler ve izinsiz bir müşteri kod tabanı.
Bu işte yapay zeka
Hata ayıklamada modeller bir şeyi gerçekten sizden iyi yapar: hiç görmediğiniz bir kütüphaneden gelen yığın izini okumak ve o mesajın genellikle ne anlama geldiğini söylemek. İyi yaptıkları ve neredeyse kimsenin kullanmadığı ikinci bir şey daha var: hipotez listesini üretmek. Çünkü liste çıkarmak, yorgun zihninizin iki saat sonra tam da yapmayı bıraktığı şeydir. Bizim duruşumuz, modeli tamirci değil hipotez üreticisi rolüne koymaktır: hangi hipotezin test edileceğine ve testin ne gösterdiğine karar vermek sizde kalır.
Gerçekten işe yarayan araçlar
- Claude Code Hata ayıklamada asıl avantajı depoyu görmesidir; o fonksiyonun nerede çağrıldığını size sormak yerine gidip bulur. Araç ücretsiz kurulur ama bir Claude aboneliği veya Anthropic Console hesabı olmadan çalışmaz ve İran, Anthropic'in desteklenen ülkeler listesinde yok.
- GitHub Copilot Bu konuda gerçek bir avantajı var: editörün içinde yaşar, yani hata veren satır zaten açıkken hiçbir yere bir şey yapıştırmazsınız. Erişim hikâyesi alışılmadıktır ve bilmeye değer: GitHub'ın kendi ticaret denetimleri sayfası, ABD Hazinesi'nden aldığı bir lisansın İran'da ikamet eden geliştiriciler için bulut hizmetlerini ücretsiz ve ücretli olarak kapsadığını söylüyor. Bu cümleyi aktarıyoruz ve ötesinde bir iddiada bulunmuyoruz: İran'dan ödeme ayrı bir meseledir ve test etmedik. Ücretsiz planı ayda iki bin tamamlamaya kadar gider.
- Claude Bu bölümün önerdiği şeye tam uyar: hatanın tam metnini verin ve koda girmeden hipotez listesi isteyin. İran, Anthropic'in iki desteklenen ülke listesinin ikisinde de yok; bunu ağ testinden değil Anthropic'in kendi sayfasından okuduk.
- Gemini Hata büyük ve bolca belgelenmiş bir kütüphane ya da servisten geliyorsa iyi iş görür. Google'ın kendi sayfası Gemini web uygulamasının iki yüz otuzdan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
Nerede geri teper
Hata ayıklamaya özgü risk şudur: model sizinle aynı fikre gelir. "Sanırım önbellekten" yazın; size önbellekten olmasının gerekçelerini üretir ve o gerekçeler makul görünür. İkinci bir görüş aramaya gittiniz, bir hoparlör buldunuz. Yukarıdaki tarif tam da bu yüzden yorumunuzu saklamanızı ve yalnızca ham test sonucunu geri vermenizi söylüyor.
İkinci riskin bir sayısı ve bir kaynağı var. 2025 Stack Overflow geliştirici anketinde, geliştiricilerin yapay zekâ araçlarından en büyük şikâyeti yüzde 66 ile "neredeyse doğru ama tam değil çözümler", ikincisi ise yüzde 45,2 ile "yapay zekânın ürettiği kodu ayıklamak daha çok zaman alıyor" idi. Yani hataları daha hızlı gidermek için başvurduğunuz aracın kendisi, kod yazmasına izin verirseniz, hata ayıklama işinize yeni bir pay ekleyebilir. Anthropic de kendi belgelerinde bu tür dayanaksız güvene halüsinasyon diyor ve azaltma yollarını anlatıyor. Bu araçların İran'dan nasıl ödenebileceği için satın alma rehberine bakın.
Kaynaklar: Stack Overflow 2025 Developer Survey: AI Anthropic: reduce hallucinations Anthropic: supported countries GitHub and Trade Controls GitHub Copilot plans Google: where the Gemini web app is available
Bu tavsiyenin sınırı
Bu dersteki her şey tek bir varsayıma dayanıyor: hata tekrarlanabilir. Yalnızca ağır yük altında, yalnızca iki şey aynı anda çalıştığında ya da birkaç günde bir ortaya çıkan hatalarda bu yöntem işlemez; adı günlük tutmak ve beklemek olan, kendi dersini hak eden başka bir yöntem gerekir. Üç şey daha bilerek dışarıda bırakıldı: eşzamanlılık hataları, kaynağına sahip olmadığınız bir şeyi teşhis etmek ve bozukluk için değil yavaşlık için olan profilleme araçları. Ve son bir dürüstlük: daraltma her zaman bir satırda bitmez. Bazen üç ay önce alınmış bir tasarım kararında biter ve o artık bir hata değildir.
Kendi işimizden
"Boş bir sonuç yokluğun kanıtı değildir" örneği hafızadan aktarılmadı; bu dersin yazıldığı gün bu sunucuda çalıştırıldı. WordPress'in wp db query komutunu yazılar tablosu üzerinde basit bir sayımla çalıştırdık: standart çıktı sıfır bayt üretti, çıkış kodu 1 idi ve gerçekte olan tek şey hata kanalına yazılmıştı: ERROR 2002 (HY000): Can't connect to local server through socket '/run/mysqld/mysqld.sock'. Araç veritabanına hiç ulaşmamıştı bile. Yalnızca standart çıktıyı okuyan bir betik, eşleşmesi olmayan bir aramanın ürettiği şeyin tıpatıp aynısını görür ve ikisini ayırt edecek hiçbir yolu yoktur. Aynı gün ikinci örneği bu sitenin ana sayfasından aldık: robots etiketi tek tırnakla yazdırılıyor, dolayısıyla name="robots" araması sıfır sonuç veriyor, oysa etiket tam oradadır.
Gerçek devam soruları
Sorunun kodumda mı yoksa sunucuda mı olduğunu nasıl anlarım?
Aynı yerde mümkün olan en küçük programı çalıştırın: yalnızca tek bir cümle yazdıran bir dosya. O bile çalışmıyorsa sorun sizin kodunuzda değildir. Çalışıyorsa sunucu sağlamdır ve o en küçük örneği bozulana dek adım adım büyütürsünüz; o adım cevaptır.
Hata ayıklayıcı öğrenmeli miyim, yoksa yazdırmak yeterli mi?
İlk aylarda yazdırmak yeterlidir ve kimse sizi bunun için yargılamaz. Zamanının geldiğinin işareti, arka arkaya yazdırma ekleyip her seferinde yeniden çalıştırdığınızı fark etmenizdir; bu örüntü, ayrı anlık görüntülere değil her şeyi bir arada görmeye ihtiyacınız olduğu anlamına gelir. Öğrenmesi yarım gündür.
Kodum kendi makinemde çalışıyor ama sunucuda çalışmıyor. Nereden başlamalıyım?
Koddan değil, farklar listesinden. Dil sürümü, kütüphane sürümleri, ortam değişkenleri, dosya izinleri, saat dilimi ve hata gösterim ayarları. Cevap neredeyse her zaman bu altısından biridir ve bunları ikişer ikişer karşılaştırmak, doğru olduğunu zaten bildiğiniz kodu yeniden okumaktan hızlıdır.