Segmentation Fault Hatası Nedir?
Segmentation fault (kısaca segfault), bir programın izin verilmeyen bir bellek bölgesine erişmeye çalışması sonucu işletim sistemi tarafından sonlandırılmasıdır. Bu hata özellikle C ve C++ gibi düşük seviyeli dillerde sık görülür. Web sunucuları, veritabanı sistemleri veya özel yazılmış modüller bu hatayla karşılaşabilir. Örneğin, bir Apache modülünde null pointer'a erişmek segfault'a yol açar.
Segfault'un Yaygın Nedenleri
- Null pointer dereference: Bir pointer NULL ise ve içindeki değere erişilmeye çalışılırsa segfault oluşur.
- Buffer overflow: Bir dizi sınırlarının dışına yazmak komşu bellek bölgelerini bozabilir.
- Free sonrası kullanım: Bellek serbest bırakıldıktan sonra pointer kullanılırsa.
- Stack overflow: Çok derin recursive çağrılar yığın taşmasına neden olabilir.
Sunucu ortamında bir segfault, hizmet kesintisine yol açar. Bu nedenle hatayı tespit etmek ve düzeltmek için core dump analizi yapmak gerekir.
Core Dump Nedir ve Nasıl Etkinleştirilir?
Core dump, bir program çöktüğünde o anki bellek içeriğinin bir dosyaya kaydedilmesidir. Bu dosya, hatanın nedenini anlamak için kullanılır. Linux'ta core dump boyutu ulimit -c ile ayarlanır. Sınırsız yapmak için:
ulimit -c unlimited
Kalıcı olması için /etc/security/limits.conf dosyasına * soft core unlimited eklenebilir. Ayrıca core dump dosyalarının nereye kaydedileceği /proc/sys/kernel/core_pattern ile belirlenir. Örneğin, echo '/var/crash/core.%e.%p' > /proc/sys/kernel/core_pattern komutuyla dosya adı program adı ve PID içerir.
Core Dump Analizi: Adım Adım
1. Core Dosyasını Bulun ve İnceleyin
Varsayılan olarak core dump, çalışma dizininde core adıyla oluşur. Dosyayı bulmak için find / -name core* 2>/dev/null kullanabilirsiniz. Büyük dosyalar olabilir, disk alanına dikkat edin.
2. GDB ile Açın
GDB (GNU Debugger) core dosyasını programla birlikte açar:
gdb /usr/local/bin/program /path/to/core
GDB içinde bt (backtrace) komutuyla çağrı yığınını görebilirsiniz. Örnek çıktı:
(gdb) bt #0 0x00007f... in strcpy () at /lib/libc.so.6 #1 0x000055... in main (argc=1, argv=...) at test.c:10Bu, hatanın main fonksiyonunun 10. satırında strcpy çağrısında olduğunu gösterir.
3. Değişkenleri İnceleyin
frame 1 ile bir önceki çerçeveye geçip değişkenleri yazdırabilirsiniz: print var veya info locals. Örneğin, null pointer'ın hangi pointer olduğunu görmek için print ptr.
Örnek Bir Senato: Null Pointer ile Segfault
Bir C programı düşünelim:
#include int main() { int *p = NULL; *p = 5; return 0; }Bu program derlenip çalıştırıldığında segfault alır. Core dump oluşturulmuşsa gdb ile açıp bt yaptığımızda main içinde 0x0 adresine yazmaya çalıştığımızı görürüz. print p ile p = 0x0 olduğunu teyit ederiz. Çözüm: p'yi geçerli bir adrese yönlendirmek.
İleri Düzey Analiz Araçları
GDB dışında strace ile sistem çağrılarını takip edebilirsiniz. valgrind ise bellek hatalarını (örneğin okunmamış bellek) bulmak için idealdir. Sunucu ortamında systemd-coredump kullanarak core dump'ları merkezi olarak yönetmek mümkündür.
Sonuç
Segmentation fault hataları can sıkıcı olsa da core dump analizi ile sorunun kaynağı kolayca bulunabilir. HostingServer.com.tr olarak sunucularınızda bu tür hatalarla karşılaştığınızda core dump ayarlarını yapmanızı ve gdb kullanmanızı öneririz. Unutmayın: Doğru analiz, daha hızlı çözüm demektir.