Bellek Sızıntısı Tespiti: Valgrind ile Debugging
Bellek sızıntısı, dinamik olarak ayrılan belleğin geri verilmemesinden ortaya çıkar. Programın çalışması sırasında kullanılan RAM giderek artar ve sistem kaynaklarını tükenir. C/C++'da bu sorun yaygındır; valgrind ise bunu tespit etmek için en etkili araçlardan biridir.
Valgrind, Linux üzerinde çalışan bir bellek hata ayıklayıcısıdır. Programı izler, her bellek işlemini kaydeder ve sızıntıları rapor eder. malloc(), free(), new ve delete gibi işlemleri takip eder.
Çoğu Linux dağıtımında paket yöneticisiyle yüklenebilir:
1sudo apt-get install valgrindSızıntı içeren basit bir C programı yazalım:
1#include <stdlib.h>2#include <stdio.h>34int main() {5int *ptr = (int *)malloc(10 * sizeof(int));6ptr[0] = 42;7printf("Değer: %d\n", ptr[0]);8// free(ptr); // Sızıntı: bellek geri verilmiyor9return 0;10}Bu kodu `sızıntı.c` olarak kaydedin.
önce hata ayıklama sembolü ile derleyin:
1gcc -g -o sızıntı sızıntı.cSonra valgrind ile çalıştırın:
1valgrind --leak-check=full./sızıntı1==12345== HEAP SUMMARY:2==12345== in use at exit: 40 bytes in 1 blocks3==12345== total heap alloc: 40 bytes in 1 blocks4==12345== total heap freed: 0 bytes in 0 blocks5==12345== Leak_Kind.DEFINITELY_LOST: 40 bytes in 1 blocksBu rapor 40 baytlık belleğin geri verilmediğini gösterir.
Kodda free() çağrısını açın:
1#include <stdlib.h>2#include <stdio.h>34int main() {5int *ptr = (int *)malloc(10 * sizeof(int));6ptr[0] = 42;7printf("Değer: %d\n", ptr[0]);8free(ptr);9return 0;10}Yeniden derleyin ve valgrind ile çalıştırın. Bu kez "no leaks are possible" mesajı alacaksınız.
- `--leak-check=full`: Tüm sızıntıları göster
- `--show-leak-kinds=all`: Sızıntı türlerini ayrıntılı listele
- `--track-origins=yes`: Hatanın kaynağını belirle
- `--log-file=rapor.txt`: Çıktıyı dosyaya kaydet
1valgrind --leak-check=full --show-leak-kinds=all --log-file=rapor.txt./sızıntıValgrind, bellek yönetimini güvenli hale getirmenin temel aracıdır. Özellikle büyük projelerde düzenli olarak kullanılmalıdır.
0 yorum