Yazılım Hatalarının Sinyalleri
Önceki Standart Sinyaller Sonraki
Yazılım Hatalarının Sinyalleri
Aşağıdaki sinyaller, bilgisayarın kendi ya da işletim sistemi tarafından ciddi bir yazılım hatası saptandığında üretilir. Genelde bu sinyallerin tümü yazılımınızın bir şeyleri önemli ölçüde bozacağı ya da sistemin bütünü açısından yazılımın çalışmasının sorun olacağı durumları belirtir.
Bazı yazılımlar yazılım hatası sinyallerini sonlanmadan önceki düzenlemeler sırasında işleme sokar; örneğin, uçbirim girdisinin yansılamasını kapatan bir yazılım yansılamayı tekrar açacağı sırada yazılım hatasını işleme sokmalıdır. Sinyalin işlenmesi, öntanımlı eylemin bitirilmesinin ardından bu sinyalin tekrar yayınlanması şeklinde yapılır. Bu, yazılımın bir sinyal eylemci yokmuşçasına bu sinyalle sonlanmasını sağlayacaktır. (Bkz. Süreci Sonlandıran Eylemciler.)
Sonlanma, çoğu yazılım için bir yazılım hatasının nihai sonucudur. Buna rağmen Lisp gibi bazı yazılım geliştirme sistemleri bir hataya maruz kalsa bile derlenmiş kullanıcı yazılımını çalışır halde tutabilir. Bu sistemler denetimi komut seviyesine döndürmek için longjmp kullanılan sinyal eylemcilere sahiptir.
Bu sinyallerin tümü için öntanımlı eylem sürecin sonlandırılmasına sebep olmaktır. Bir gerçek hata yerine raise veya kill tarafından üretilmedikçe oluşan sinyalleri engeller, yoksayar ya da bir sinyal yakalayıcı kurup normale çevirirseniz, büyük olasılıkla yazılımınız dehşet verici şekilde bozulacaktır.
Bu yazılım hatası sinyalleri bir süreci sonlandırırken, sonlanma sırasında sürecin durum kaydı olarak o an içinde bulunulan dizine core isimli bir dosya olarak bellek dökümü çıktılar. (GNU sistemlerinde dosyanın ismini COREFILE ortam değişkeni ile belirtebilirsiniz.) Bu dosyanın çıktılanmasının amacı, dosyanın bir hata ayıklayıcı ile incelenerek hatanın sebebinin bulunmasını sağlamaktır.
int SIGFPE
makro
SIGFPE sinyali bir ölümcül aritmetik hata raporlar. Hatanın isminin "floating-point exception" kısaltması olarak oluşturlmasına rağmen sinyal aslında sıfırla bölme ve taşma dahil tüm aritmetik hataları kapsar. Eğer bir yazılım, tamsayı veri sakladığı bir alanı daha sonra bir gerçek sayı işleminde kullanmaya çalışırsa bu, bir "geçersiz işlem" olağandışılığına sebep olur, çünkü işlemci veriyi bir gerçek sayı olarak ele alamaz.
Aslında gerçek sayı olağandışılıkları oldukça karmaşık bir konudur, çünkü çok farklı anlamlara gelen çözümü zor çok çeşitli olağandışılıklar vardır ve SIGFPE sinyali onları ayıramaz. İkilik Kayan Noktalı Aritmetik için IEEE standardında (ANSI/IEEE Std 754-1985 and ANSI/IEEE Std 854-1987) çeşitli olağandışılıklar tanımlanmıştır ve onların oluşumlarını raporlayacak bilgisayar sistemleri arasında uyumluluk gerektirir. Ancak, bu standart olağandışılıkların nasıl raporlanacağını ya da işletim sisteminin yazılımcıya ne çeşit bir işleme ve denetim imkanı vereceğini belirtmez.
BSD sistemleri SIGFPE makrosunun yanında olağandışılığın çeşitli sebeplerini ayrımsamak için bir ek argüman sağlar. Bu argümana erişim sırasında, sinyal eylemciyi iki argüman kabul edecek şekilde tanımlamalısınız. Eylemci kurulurken de tek argümanlı işlev türüne dönüştürmelisiniz. GNU kütüphanesi bu ek argümanı sağlar. Ancak argümanın değeri sadece bu bilgiyi sağlayan sistemler (GNU ve BSD) için anlamlıdır.
FPE_INTOVF_TRAP
Tamsayı taşması (C yazılımlarında donanıma özel biçimde taşma yakalayıcıyı etkinleştirmedikçe imkansızdır).
FPE_INTDIV_TRAP
Sıfırla tamsayı bölme.
FPE_SUBRNG_TRAP
İndisleme aralığı (C yazılımlarında bazı şeyler hiç denetlenmez).
FPE_FLTOVF_TRAP
Gerçek sayı taşması.
FPE_FLTDIV_TRAP
Gerçek/tam sayılarda sıfırla bölme.
FPE_FLTUND_TRAP
Gerçek sayılarda alttan taşma (Normalde etkin değildir).
FPE_DECOVF_TRAP
Ondalık taşma (Sadece bir kaç makine ondalık aritmetiğe sahiptir, C hiç kullanmaz).
int SIGILL
makro
Sinyalin ismi "illegal instruction" sözcüklerinden türetilmiştir; yazılımınızın bozuk ya da ayrıcalıklı bir makine kodu komutunu çalıştırmayı denediğini belirtir. C derleyicileri sadece geçerli makine kodu komutlar ürettiğinden SIGILL sinyali genellikle çalıştırılabilir dosyanın zarar görmüş olabileceğini ya da çalıştırılabilir olmayan bir kodu çalıştırmayı denediğinizi belirtir. İkinci durumun ortaya çıktığı çok bilinen durumlar şunlardır: bir işlev olarak ele alınacağı umulan bir göstericiyle geçersiz nir nesnenin aktarılması; bir özdevinimli dizinin sonundan sonrasına yazma denemesi (benzer durum özdevinimli değişkenlere göstericilerde de ortaya çıkabilir); yığıt üzerinde, yığıt çerçevesine dönüş adresi gibi bir takım verilerin bozulması.
SIGILL sinyali bunlardan başka, yığıt taşmalarında ya da sistemde çalışan sorunlu bir sinyal eylemcinin varlığında da üretilebilir.
int SIGSEGV
makro
Bu sinyal, bir yazılımın kendine ayrılan bellek bölgesinin dışında okuma veya yazma denemesi yaptığında ya da salt okunur belleğe yazma denemesinde oluşur. (Aslında bu sinyal sadece sistemin bellek koruma mekanizması tarafından saptanabilen, yazılımın kendi alanının dışında çok uzak bölgelere yazmaya çalıştığı durumlarda ortaya çıkar.) Sinyalin ismi "segmentation violation" sözcüklerinden türetilmiştir.
SIGSEGV sinyalinin alındığı bilinen sorunlar: göstericinin bir boş ya da ilklendirilmemiş göstericiye dönüştürülmesi (dereferencing - dizi olmayan bir değişkene gösterici üzerinde gösterici aritmetiği uygulanması ya da ilklendirilmemiş bir yapı elemanını göstermek için bir -> işleci ile sol taraf değeri olarak kullanılması); bir dizinin sonunu kontrol etmeden dizi üzerinde gösterici aritmetiği ile işlem yapılması. Bir göstericinin bir boş göstericiye dönüşmesini durumunu çeşitli sistemler SIGSEGV ya da SIGBUS sinyali ile belirtir.
int SIGBUS
makro
Bu sinyal geçersiz duruma gelmiş göstericiler kullanılmaya çalışıldığında ortaya çıkar. SIGSEGV sinyalindeki gibi bu sinyalde geçersiz bir gösterici kullanımıyla ilgili olarak üretilir. İkisi arasındaki fark, SIGSEGV sinyalinin geçerli belleğe geçersiz erişimi belirtmesi, SIGBUS sinyalinin ise geçersiz bir adrese erişimi belirtmesidir. Kimi zaman SIGBUS sinyali göstericinin hatalı hizalama ile kullanıldığı durumlarda da üretilir; örneğin dört sözcüklük bir tamsayı değerinin saklandığı adreste alanın dörde bölünememesi gibi (her bilgisayarın kendine özgü adres hizalaması vardır).
Sinyalin ismi "bus error" sözcüklerinden türetilmiştir.
int SIGABRT
makro
Bu sinyal yazılımın kendisi tarafından saptanan bir hatayı belirtir ve abort çağrısı ile raporlanır. Bkz, Anormal Sonlanma.
int SIGIOT
makro
PDP-11 "iot" komutu tarafından üretilir. Çoğu makinede, SIGABRT sinyali olarak yer alır.
int SIGTRAP
makro
Makinenin "breakpoint" komutu ve bazı diğer yakalama komutları tarafından üretilir. Bu sinyal hata ayıklayıcılar tarafından kullanılır. Yazılımınız büyük ihtimalle bazı hatalı makine komutları dolayısıyla sadece SIGTRAP sinyalini görecektir.
int SIGEMT
makro
Öykünme tuzağı; bu sinyal henüz gerçeklenmemiş ama yazılım tarafından taklit edilen makine komutlarından ya da onların olması gerektiği gibi taklit edilememesinden dolayı işletim sistemi tarafından üretilir.
int SIGSYS
makro
Hatalı sistem çağrısı; İşletim sisteminden çalıştırılması istenen ancak çağrı için belirtilen kod numarası makine komutlarında geçersiz olan çağrılarda üretilir.
Önceki Üst Ana Başlık Sonraki
Standart Sinyaller Başlangıç Sonlandırma Sinyalleri
Bir Linux Kitaplığı Sayfası