Valgrind ile C/C++'da Bellek Sızıntıları Nasıl Tespit Edilir

Valgrind Ile C C Da Bellek Sizintilari Nasil Tespit Edilir



Valgrind, öncelikle C, C++ ve diğer dillerde yazılan yazılım programlarında hata ayıklamak ve profil oluşturmak için yaygın olarak kullanılan bir araçtır. Geliştiricilerin bellek sızıntılarını tespit etmelerine, bellek erişim hatalarını takip etmelerine ve programlarının yürütülmesinin profilini çıkarmalarına yardımcı olur.

Valgrind altında bir program çalıştırdığınızda, programın yürütülebilir dosyasını dinamik olarak denetler ve programın bellek kullanımını ve yürütme davranışını izlemesine olanak tanır.

C++'da Bellek Sızıntıları

Valgrind'in öncelikle C ve C++ programları için tasarlandığını ve diğer dillerle veya tüm senaryolarda aynı derecede etkili çalışmayabileceğini unutmamak önemlidir. Ek olarak, bir programın Valgrind altında çalıştırılması, yürütülmesini önemli ölçüde yavaşlatabilir; bu nedenle, üretim ortamları yerine genellikle geliştirme ve hata ayıklama sırasında kullanılır.







Dinamik olarak oluşturulan bir bellek düzgün bir şekilde serbest bırakılmadığında, C/C++'da bellek sızıntılarına neden olabilir ve bu da mevcut bellek kaynaklarının yavaş yavaş tükenmesine neden olabilir. Bu, aşırı bellek tüketimine ve programın performansının düşmesine neden olabilir.



Valgrid Kurulumu

Valgrind'i bir Linux sistemine kurmak için bir terminal açın ve Linux dağıtımınıza özel paket yöneticisini kullanarak paket depolarınızı güncelleyin. Aşağıdaki komut Ubuntu ve Debian tabanlı sistemler için çalışır:



$ sudo uygun güncelleme

Valgrind'i yüklemek için paket yöneticisini kullanın. Yine, komut Linux dağıtımınıza bağlı olarak değişebilir. Ubuntu ve Debian tabanlı sistemler için aşağıdaki komutu kullanın:





$ sudo uygun düzenlemek seçim kapısı

İstendiğinde kullanıcı şifrenizi girin ve “Enter” tuşuna basın. Yazılımı yüklemek için kullanıcı hesabınızın yönetici ayrıcalıklarına ihtiyacı olduğunu unutmayın. Paket yöneticisi Valgrind'i gerekli bağımlılıklarla birlikte indirir ve yükler. İşlem birkaç dakika sürebilir.



Kurulum işlemi bittikten sonra doğrulama adımı olarak aşağıdaki komutu uygulayarak Valgrind'in başarılı kurulumunu onaylayabilirsiniz:

$ seçim kapısı --versiyon

Bu komut, başarılı bir şekilde yüklendiyse Valgrind'in sürüm bilgilerini görüntüler.

Bu kadar! Valgrind artık Linux sisteminize yüklenmiş olmalı ve bunu C/C++ programlarınızı bellek sızıntıları ve diğer sorunlar açısından analiz etmek ve hata ayıklamak için kullanabilirsiniz.

Ubuntu'da Dosya Oluşturmak

Program üzerinde çalışmaya başlamak için öncelikle Ubuntu'da bir dosya oluşturmamız gerekiyor. Dosya oluşturmak için nano metin düzenleyiciyi kullanıyoruz. Bu yüzden terminale komutu şu şekilde yazıyoruz:

$ nano dosya1

Burada nano, yürütülmekte olan metin düzenleyicinin adıdır. “Dosya1” bağımsız değişkeni, nano metin düzenleyiciyi kullanarak açmayı veya oluşturmayı planladığınız dosyanın adını temsil eder. Nano, eğer halihazırda mevcutsa, dosyayı düzenleme için açar; değilse, sağlanan adda yeni bir dosya oluşturur. Elimizde böyle bir dosya olmadığı için “file1” isminde yeni bir belge oluşturuyor.

Komutu çalıştırdığınızda, nano düzenleyici açılacak ve “file1” dosyasının içeriğini girmeniz veya düzenlemeniz için size boş bir tuval sağlayacaktır. Mevcut içeriği düzenleyiciye yazmaya veya yapıştırmaya başlayabilirsiniz.

Artık tüm önkoşullar karşılandığı için, C++ programlarındaki bellek sızıntılarını tespit etmek amacıyla Valgrind'i kullanmak için bazı örnekler oluşturuyoruz.

Örnek 1:

Sağladığımız ilk örnek, C'deki kitaplığından 'malloc' işlevini kullanan basit bir dinamik bellek ayırma örneğini göstermektedir.

#include

int ana ( )

{

karakter * A = malloc ( 102 ) ;

geri dönmek 0 ;

}

İşte kodun bir dökümü:

Öncelikle, dinamik bellek tahsisi ve tahsisin kaldırılması için malloc gibi işlevleri sağlayan standart kütüphane başlık dosyasını ekliyoruz.

int main() satırı ana işlevi bildirir. Daha sonra char *a = malloc(102); char* türünde bir işaretçi değişkeni “a” bildirir (char'a işaretçi). Belleği 102 karakter öğesinden oluşan bir diziye (toplamda 102 bayt) dinamik olarak tahsis etmek için “malloc” işlevini kullanır. Bayt cinsinden ifade edilen bellek ayırma boyutu, malloc işlevine bir giriş olarak gönderilir ve yeni oluşturulan bellek bloğuna bir işaretçi olarak çıktı verir. Char* işaretçisi “a”ya bu işaretçi değeri atanır. Son olarak “return 0;” ana fonksiyonun sonunu belirtir.

Kısacası bu kod, “malloc” kullanarak 102 karakterlik bir dizi için belleği dinamik olarak ayırır ve bellek adresini “a” işaretçisine atar. Ancak, kodun tahsis edilen hafızayı hiçbir şekilde kullanmadığını veya değiştirmediğini ve hafızanın serbest kullanımıyla tahsisinin kaldırılmasını içermediğini unutmayın.

Bu programı Valgrind üzerinden “–leak-check=full” seçeneği ile çalıştırdığımızda, bellek sızıntısı kontrolü gerçekleştirip çıktı raporu veriyor.

Valgrid'in ürettiği çıktı raporu şu şekilde verilmektedir:

Örnek 2:

Bu çizime başlamak için, daha önce açıklandığı gibi nano metin düzenleyiciyi kullanarak şu komutu yazarak bir “test2” dosyası oluşturuyoruz:

$ nano test2

Şimdi Valgrind kullanarak herhangi bir bellek sızıntısı olup olmadığını kontrol etmek için bir C++ programı yazıyoruz:

#include

#include

#include

const int a_s = 3000 ;

int ana ( ) {

int * ia = malloc ( boyutu ( int ) * gibi ) ;

için ( int ben = 0 ; Ben < gibi; i++ ) {

BT [ Ben ] = ben;

}

küçük parça ( zaman ( HÜKÜMSÜZ ) ) ;

int rn = Rand ( ) % gibi;

baskı ( 'o[%d]: %d \N ' , rn, o [ rn ] ) ;

geri dönmek 0 ;

}

Programı geçelim.

Kod, gerekli başlık dosyalarını içerir ve 3000 değeriyle “a_s” sabit değişkenini tanımlar. Main() fonksiyonunun içinde, int* türünde bir “ia” işaretçisi bildirilir ve “malloc” kullanılarak bellek dinamik olarak tahsis edilir. işlev. “sizeof(int) * a_s” ifadesi, “a_s” sayıda tamsayıyı depolamak için gereken toplam belleği belirler. “ia” dizisinin tüm elemanları, karşılık gelen indeks değeriyle birlikte “for” döngüsü tarafından başlatılır. Örneğin, ia[0] 0 olacak, ia[1] 1 olacak, vb.

Rastgele sayı üreteci, geçerli zamanı kullanan 'srand' işlevi kullanılarak tohumlanır. Bu, programın her yürütüldüğünde benzersiz bir rastgele tamsayılar kümesi üretmesini sağlar. “Rand” fonksiyonu rastgele bir sayı üretir ve “rn”, Rand() % a_s sonucuyla atanır. Modül operatörü “%”, rastgele sayının aralığını, “ia” dizisi içindeki geçerli bir indekse karşılık gelen 0 ile a_s – 1 arasında olacak şekilde sınırlar.

Son olarak program, “ia” dizisinin rastgele seçilen “rn” indeksindeki değeri karşılık gelen indeksle birlikte yazdırmak için “printf” fonksiyonunu kullanır.

Bu programı Valgrind aracılığıyla çalıştırdığınızda aşağıdaki çıktı raporunu oluşturur:

  Bir bilgisayar programının ekran görüntüsü Açıklama otomatik olarak oluşturuldu

Çözüm

Bir C++ programındaki bellek sızıntılarını tespit etmek için Valgrind aracının kullanıldığını keşfettik. Valgrind'in kurulum kılavuzu başlangıçta verilmiştir. Daha sonra nano metin editörünü kullanarak Ubuntu'da dosya oluşturma konusunu detaylandırdık. Sonunda, bu önkoşulları kullanarak, bellek sızıntılarını kontrol etmek için iki C++ örneğini yürüttük. Sağlanan dosyadaki bellek sızıntılarını gösteren, Valgrind tarafından oluşturulan rapor da ekte yer almaktadır.