Professional Documents
Culture Documents
• Programlama Hataları
İÇİNDEKİLER
• Hata Ayıklama
• Hata Ayıklama Araçları
• Hatasız Kod Yazımı PROGRAMLAMA
TEMELLERİ
kaynaklandığını bilebilecek,
• Söz dizimsel ve anlam bilimsel
hata türlerini bilebilecek,
• Hataların nasıl tespit
edilebileceğini ve
ayıklanabileceğini bilebilecek,
• Hata ayıklama araçlarının nasıl
kullanılabileceğini bilebilecek,
• Hata ayıklama işinin neden zor ÜNİTE
olduğunu bilebilecek,
• Hatasız kod yazımı için yapılması
gerekenleri öğrenebileceksiniz.
8
© Bu ünitenin tüm yayın hakları Atatürk Üniversitesi Açıköğretim Fakültesi’ne aittir. Yazılı izin alınmadan
ünitenin tümünün veya bir kısmının elektronik, mekanik ya da fotokopi yoluyla basımı, yayımı, çoğaltımı ve
dağıtımı yapılamaz.
Hata Ayıklama
HATA AYIKLAMA
Koşullu Kesme
Hata Ayıklama Söz Dizimsel
Noktası
Prensipleri Hatalar
Oluşturma
Hata Ayıkla ve
İstisnai Durum
Serbest Bırak
Yönetimi
Modları
GİRİŞ
Programcılar, programın geliştirilmesine gösterdikleri ilgiyi test aşamasına
göstermedikleri için programda karşılaşılan hataların ayıklanması bazen geliştirme
aşamasından daha fazla zaman almaktadır. Bu durum bilişim projelerinin bütçe,
zaman ve maliyet analizlerini de zorlaştırmaktadır. Çalıştığı sanılan çoğu program
beklenmeyen veri girişleriyle karşılaştığında hata vererek çalışmasını durdurmaktadır.
Programın hata vermeden çalışmasını yanlış bir biçimde sürdürmesi ise daha vahim
sonuçlar doğurabilmektedir.
Hatasız kod yazımı kolay olmadığı için hata ayıklama işinin de ciddiye alınması
gerekmektedir. Programın geliştirilmesinden imha edilmesine kadarki bütün
aşamalarda hata ayıklama hesaba katılmalıdır.
Bu ünitede, hata kavramının ortaya çıkışından başlanarak hata türlerinden
örnekleriyle birlikte bahsedilecektir. Hata ayıklama prensiplerinden ve
yaklaşımlarından bahsedilecektir. Çalışma zamanında oluşan hataların ayıklanması
için geliştirilen istisnai durum yönetimine de değinildikten sonra hata ayıklayıcı
programlarda kullanılan araçlar incelenecektir. Son bölümde ise hatasız kod yazımı
için neler yapılması gerektiği tartışılacaktır.
PROGRAMLAMA HATALARI
Hata (bug), bir bilgisayar sistemi tarafından üretilen beklenmeyen ya da doğru
olmayan sonuçtur. Programın amaçlanan davranışı ile gerçek davranışı arasındaki
fark, hatadan kaynaklanmaktadır. Bug (böcek) terimi, ilk olarak 1945 yılında
Massachusetts Teknoloji Enstitüsündeki hesaplama laboratuvarında karşılaşılan
hatanın, röleler içine sıkışıp kalan bir böcekten kaynaklandığı anlaşılınca “Böceğin ilk
vakası bulunmuştur.” ifadeleriyle rapor edilmesiyle kullanılmıştır [1]. Böylece bug
(böcek) terimi sistem hatası manasında kullanılmaya başlanmıştır.
Programlarda
karşılaşılan hataların
%90’ı programlamadan
kaynaklanmaktadır.
Noktalı virgül hatası: C dil ailesindeki diğer dillerde olduğu gibi C++ dilindeki
kodlar da “;” işaretiyle bitmektedir. Noktalı virgülün unutulması durumunda
ise derleyici takip eden satırı işaretler ancak verdiği hata mesajı doğrudur.
Tanımlanmamış değişken: Değişkenler C++ dilinde kullanılmadan önceki
satırlarda tanımlanırlar. Böylece hangi tipte ve boyutta veriler için
kullanılacağı belirtilerek bellekte yer tahsis edilir. Bir değişken
tanımlanmadan kullanıldığında ise derleyici tarafından işaretlenir.
Küçük/büyük harf duyarlılığına uyulmaması da C++ dili için hataya sebep
olabilmektedir.
Kapatılmayan parantez: Açılan bir parantezin kapatılmadığı tespit edildiğinde
derleyici ilgili satırı işaretler. İç içe kullanılan parantezlerde en iç
parantezlerden başlanarak dışa doğru gidilerek her bir parantezin kapatıldığı
kontrol edilebilir.
Bitmeyen blok (küme parantezi): Başlayan bir kırlangıç (C dili ailesi için)
parantezinin (“{ }”) bitirilmemesi durumunda program kodunun son satırı
işaretlenir.
Bitmeyen metinsel ifade: C++ dilinde metinsel (string) ifadeler çift tırnak
karakterleri (" ") arasında yazılır. İkinci çift tırnak karakterinin unutulması ise
metinsel ifadenin sonlandırılmamasına sebep olur.
Return eksikliği: Değer döndüren fonksiyonlar için return ifadesinin
konulmaması hataya sebep olmaktadır.
Aşağıdaki örnekte 5 elemanlı dizinin ilk elemanı diye 1 ile gösterilen indise
yani 2. elemanına değer atanmaktadır. Son 5 ile gösterilen indis olmadığı için de
hata vermektedir. Dikkat edin burada koşul ifadesi yerinde “i<5” kullanılsaydı hata
alınmayacaktı ancak ilk elemana değer atanmadığından program muhtemelen
doğru çalışmayacaktı.
for (i=1; i <= 5; i++) dizi[i]=i;
Akış yolu varsayımı: Program, hata vermemesine rağmen bazı kod
bloklarını çalıştırmadan sonlanıyorsa, programın varsayılan akışın dışına
çıktığı anlaşılmalıdır. Programa öngörülmeyen veriler girdi olarak
yüklendiğinde mesela, program farklı bir akış yolu izleyebilmektedir.
Örneğin, bir sınavdan alınan notların tutulduğu değişkene -1 değeri
girildiğinde şartlı deyimler beklenenden farklı davranacaktır. Yapılması
gerekense, istenen değer aralığı dışında girilen değerlerin reddedilmesi ya
da farklı bir dallanma izlenerek kullanıcıya mesaj görüntülenmesi olmalıdır
[7].
Bireysel Etkinlik
HATA AYIKLAMA
Genel olarak yazılım hatalarının yerini bulma, hataları teşhis etme ve
düzeltme işlemi hata ayıklama olarak tanımlanır [4]. Hata ayıklama, teşhis
algoritması (diagnosis algorithm) ve hata düzeltme algoritmalarının (bug-
correction algorithm) birleşiminden oluşur.
Hata ayıklama, teşhis
algoritması ve hata Hata Ayıklama Prensipleri
düzeltme
Hata ayıklama prensipleri çoğunlukla sezgiseldir. Uygulamada sıklıkla
algoritmalarının
unutulur ya da dikkatten kaçırılır. Hata ayıklamanın iki temel algoritmanın
birleşiminden oluşur.
birleşiminden oluştuğunu söylemiştik: Hatanın yerini bulma (tespit, teşhis) ve
düzeltme.
Kesme noktası,
program çalışırken ilgili
satırda çalışmanın
durdurulmasını sağlar.
Benzer bir biçimde “Hata Ayıkla” menüsü altında bulunan Kesme Noktasını
Ekle/Kaldır bağlantısına tıklanarak veya F9 tuşuna basılarak da yeni kesme noktası
eklenebilir, varsa da kaldırılabilir.
Koşullu kesme noktaları içinde artı işareti bulunan kırmızı nokta şeklinde
görüntülenmektedir.
DEĞERLENDİRME SORULARI
1. “Programlarda karşılaşılan hataların çoğunluğu ……………. ‘dan
kaynaklanmaktadır?”
Cümlede boş bırakılan yere aşağıdakilerden hangisi getirilmelidir?
a) Kullanıcı
b) Programlama
c) Donanım
d) İşletim sistemi
e) Hesaplama
Cevap Anahtarı
1.b, 2.d, 3.e, 4.d, 5.c, 6.d, 7.b, 8.c, 9.a, 10.a
YARARLANILAN KAYNAKLAR
[1] Shapiro, F. R. (1987). Etymology of the Computer Bug: History and Folklore.
American Speech, 62(4), 376-378.
[2] Kopplin, J. (2002). An Illustrated History of Computers Part 3. 19 temmuz 2018
tarihinde
http://www.computersciencelab.com/ComputerHistory/HistoryPt3.htm
adresinden erişildi.
[3] Tahvildari, L. ve Singh A. (1999). Software Bugs. Wiley Encyclopedia of
Electrical and Electronics Engineering, 445-456.
[4] Lourenço, J. M. d. S. (2003). A Debugging Engine for Parallel and Distributed
Programs. Faculdade de Ciências e Tecnologia Departamento de
Informática, Doktora Tezi, Lisboa.
[5] Barr, A. (2004). Find the bug: a book of incorrect programs (1. baskı). Kanada:
Addison-Wesley Professional.
[6] Ford, A. R. and Teorey T. J. (2002). Practical Debugging in C++ (1. baskı). New
Jersey, USA: Prentice Hall.
[7] Sarıdoğan, M. E. (2008). Yazılım Mühendisliği. İstanbul: Papatya Yayıncılık.
[8] Dijkstra, E. W. (1972). Structured programming (1. baskı). London: Academic
Press Ltd.
[9] Lauesen, S. (1979). Debugging techniques. Software: Practice and Experience,
51-63.
[10] O'Connor, M. (2008). Parallel debugging is easy. 21 Temmuz 2018 tarihinde
http://www.allinea.com/Portals/90122/docs/allinea-
parallel_debugging_is_easy.pdf adresinden erişildi.
[11] Algan, S. (2003). Her Yönüyle C# (4. baskı). İstanbul: Pusula Yayıncılık.
[12] Singh, A., Schaeffer J. ve Szafron D. (1998). Experience with parallel
programming using code templates. Concurrency: Practice and Experience,
91-120.