=== HAYALET BUG ===
Evet, heisenbug ile uğraşıyorsanız, Allah kolaylık versin demiştim. Ama eğer bir "hayalet bug" ile uğraşıyorsanız, heisenbug'lara rahmet okuyacak duruma gelirsiniz! Olabilecek en pis buglar bunlardır, ve gereken bütün yazılım ve donanım geliştirme ekipmanları elinizde olsa bile, sizi haftalarca süründürür!
Hayalet buglar, hem yazılım hem de donanımın beraber geliştirildiği gömülü sistem projelerinde ortaya çıkarlar. Bir bug gözlemlersiniz, "hmm acaba şundan mı oluyor" deyip bir test kodu ilave edersiniz, problemin şekli tamamen değişir. Mesela daha önce takılıyorken, artık rastgele çalışmaya başlar. "haydaa, noldu yav, bir de şuna bakayım" diye bir test kodu daha eklersiniz, gene problemin şekli tamamen değişir. Daha önce çalışmayan bölüm artık çalışıyordur, ama önceden çalışan bölüm şu anda çalışmıyor! Yani bu bug, adeta "kendini aktif koruma" sistemine sahip, her çözüm teşebbüsünde tamamen şekil değiştiriyor. Hatta programdaki fonksiyonların link sıralamasını değiştiriyorsunuz, problem tamamen ortadan kalkıyor.
Bu bugların sebebi, hardware'den kaynaklanan bir sorundur, ve bu bugları en pis bug yapan da budur. Bundan önceki bugların hepsinde, en azında üzerinde çalıştığımız donanımın sorunsuz olduğunu varsayabiliyorduk. Problem varsa, bu bizim yazdığımız programda olmalıydı. Ama hardware sorunlu ise, aslında muhtemelen sizin programda herhangi bir sorun yok, ama hardware'deki sorun nedeniyle sizin program hatalı davranış sergiliyor. İşte bu yüzden de bunlara "hayalet bug" diyorum.
Şimdi benim de başıma gelmiş olan bir hayalet bug hikayesini anlatayım. Üzerinde çalıştığım PCI kart ile ilgili bir sorun rapor edildi. Son versiyon firmware ile program hatalı çalışıyor, bir önce firmware ile sorun yok, sadece son versiyondaki özellik eksik. İkisi arasında da çok az bir fark var. Tek fark, birisi ilave olarak bazı hesaplamalar daha yapıyor ve bunları da bir kenara yazıyor. O hesaplamaları çıkarıyorum, hakkaten sorun çözülüyor. Tekrar geri koyuyorum, problem geri geliyor. Kafayı yiyeceğim! birkaç ilave hesap nasıl firmware'in tamamen farklı davranmasına sebep olur?
Birkaç ilave test kodu ekliyorum, firmware tamamen saçmalıyor, hiç çalışmıyor. Hatta bir keresinde yaptığım değişiklik nedeniyle işlemci aşırı ısınmaya başladı neredeyse yanacak! Programa bir byte'lık NOP komutu (hiçbirşey yapma anlamına gelen komut) bile eklesem, gene sapıtıyor! Haftalarca süründüm ... En sonunda, işlemcinin adres ve data hatlarına lojik analizörü bağladım (bu tip lojik analizörler de son derece pahalı cihazlar) ve kodu bu şekilde çalıştırdım.
Programın assembly listing'ini aldım. Bu listing'de programdaki bütün makina dili görülebiliyor. Sonra da lojik analizörün topladığı makina dili program akışı ile kıyasladım. Problem şuymuş: RAM çipin adres dekoderi sorunlu imiş ve 4000H adresinden bir veri okunduğunda, oradaki gerçek veri değil de, 00H okunuyor!!!
Yani 4000H adresine programın ne tarafı denk geldiyse, orası yanlış çalışıyor.
Ama nasıl böğürüyorum laboratuvarda ... Hardware'in tasarımını yapan elemanı buldum, adamı neredeyse boğacağım. Biraz sakinleştikten sonra elemana yediği haltı anlattım ve tüm ekibe yemek ısmarlattım!