Valgrind Nedir? Kullanımı
C veya C++ gibi düşük seviyeli programlama dillerinde ortaya çıkan bellek sızıntılarını bulmak için kullanılan valgrind aracı ile ilgili bilgiler yer alıyor.
Valgrind nedir?
C veya C++ ile yazılım geliştirme sürecinde ortaya çıkan memory leak veya bellek sızıntı ile ilgi bilgi almaya yarayan bir araçtır.
Programlama dillerine ait her avantaj bir dezavantaj ile birlikte geliyor desek yanlış olmaz.
Modern programlama dilleri güvenli bir geliştirme ortamı sunarken hız konusunda çeşitli dezavantajlara sahip olabiliyor.
C ve C++ gibi düşük seviyeli programlama dilleri bellek yönetimin kullanıcı tarafından yapılmasına imkan vererek daha performanslı çalışmasını sağlıyor diyebiliriz.
Ancak doğru yapılmayan bellek yönetimi beraberinde memory leak veya bellek sızıntısı olarak adlandırılan hataların oluşmasına neden oluyor.
Bellek sızıntısı temel olarak program tarafından kullanılan bellek alanının işletim sistemine iade edilmemesi veya iade edilen alana tekrar erişim diyebiliriz.
Aşağıda C dilinde yazılmış bellek sızıntısı örneği yer almaktadır.
#include<stdio.h>
#include<stdlib.h>
int main() {
int *sayilar;
int n, i;
printf("Adet: ");
scanf("%d", &n);
sayilar = (int *) malloc(sizeof(sayilar) * n);
for(i = 0; i < n; i++)
{
scanf("%d", &sayilar[i]);
}
return 0;
}
Aşağıda C++ dilinde yazılmış bellek sızıntısı örneği yer almaktadır.
#include<iostream>
int main() {
int *sayilar;
int n, i;
std::cout << "Adet: ";
std::cin >> n;
sayilar = new int[n];
for(i = 0; i < n; i++)
{
std::cin >> sayilar[i];
}
return 0;
}
Örneklerden de görüldüğü gibi işletim sisteminden ayrılan bellek alanı geri iade edilmemiştir.
Valgrind kullanımı
Valgrind aracı Linux/Unix tabanlı işletim sistemlerinde çalışır.
Linux tabanlı işletim sistemine kurulum için Linux Uygulama Kurulumu yazısından faydalanabilirsiniz.
Kullanım için ilk olarak yazılan komutların derleyici ile derlenmesi gerekir.
gcc main.c veya g++ main.cpp
Derleme işlemi sonrası a.out dosyası oluşacaktır.
Aşağıdaki komut ile ortaya çıkan program çalıştırılır.
valgrind ./a.out
Program çalıştırılıp sonlandıktan sonra Valgrind aşağıdaki gibi bir uyarı verecektir.
==4709== HEAP SUMMARY:
==4709== in use at exit: 16 bytes in 1 blocks
==4709== total heap usage: 1 allocs, 0 frees, 16 bytes allocated
==4709==
==4709== LEAK SUMMARY:
==4709== definitely lost: 16 bytes in 1 blocks
==4709== indirectly lost: 0 bytes in 0 blocks
==4709== possibly lost: 0 bytes in 0 blocks
==4709== still reachable: 0 bytes in 0 blocks
==4709== suppressed: 0 bytes in 0 blocks
Bellek sızıntısına sebep olan yer ile ilgili bilgi almak için –leak-check=full eklenmesi yeterli olacaktır.
valgrind --leak-check=full ./a.out
Valgrind artık bellek sızıntısına sebep olan yer ile ilgili bilgi verecektir.
==4712== HEAP SUMMARY:
==4712== in use at exit: 16 bytes in 1 blocks
==4712== total heap usage: 1 allocs, 0 frees, 16 bytes allocated
==4712==
==4712== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4712== at 0x4C29BC3: malloc (vg_replace_malloc.c:299)
==4712== by 0x4006BA: main (in /root/a.out)
==4712==
==4712== LEAK SUMMARY:
==4712== definitely lost: 16 bytes in 1 blocks
==4712== indirectly lost: 0 bytes in 0 blocks
==4712== possibly lost: 0 bytes in 0 blocks
==4712== still reachable: 0 bytes in 0 blocks
==4712== suppressed: 0 bytes in 0 blocks
Valgrind aracı örnekteki gibi küçük çaplı, bellek sızıntısını fark edilebileceği uygulamalarda kullanılmayabilir.
Ancak daha fazla komutun olduğu programlarda gözden kaçan bellek sızıntılarını bulmak için faydalı bir araçtır.
Araç ortaya çıkan sonucu dosyaya kayıt etmek, daha detaylı analiz yapmak için geniş bir parametre kullanımına sahiptir.
Hayırlı günler dilerim.