Cara Mendeteksi Kebocoran Memori di C/C++ dengan Valgrind

Cara Mendeteksi Kebocoran Memori Di C C Dengan Valgrind



Valgrind adalah alat yang banyak digunakan untuk men-debug dan membuat profil program perangkat lunak yang sebagian besar ditulis dalam C, C++, dan bahasa lainnya. Ini membantu pengembang untuk mendeteksi kebocoran memori, melacak kesalahan akses memori, dan membuat profil eksekusi program mereka.

Saat Anda menjalankan program di bawah Valgrind, program tersebut secara dinamis menginstrumentasikan program yang dapat dieksekusi, memungkinkannya memantau penggunaan memori program dan perilaku eksekusi.

Kebocoran Memori di C++

Penting untuk dicatat bahwa Valgrind terutama dirancang untuk program C dan C++ dan mungkin tidak bekerja secara efektif dengan bahasa lain atau di semua skenario. Selain itu, menjalankan program di Valgrind dapat memperlambat eksekusinya secara signifikan, sehingga sering digunakan selama pengembangan dan debugging daripada di lingkungan produksi.







Ketika memori yang dibuat secara dinamis tidak dilepaskan dengan benar, hal ini dapat menyebabkan kebocoran memori di C/C++ yang secara perlahan akan menguras sumber daya memori yang tersedia. Hal ini dapat mengakibatkan konsumsi memori yang berlebihan dan penurunan kinerja program.



Instalasi Valgrid

Untuk menginstal Valgrind di sistem Linux, buka terminal dan perbarui repositori paket Anda menggunakan manajer paket yang khusus untuk distribusi Linux Anda. Perintah berikut berfungsi untuk sistem berbasis Ubuntu dan Debian:



$ sudo pembaruan yang tepat

Gunakan manajer paket untuk menginstal Valgrind. Sekali lagi, perintahnya mungkin berbeda-beda tergantung pada distribusi Linux Anda. Gunakan perintah berikut untuk sistem berbasis Ubuntu dan Debian:





$ sudo tepat Install gerbang pemilu

Saat diminta, masukkan kata sandi pengguna Anda dan tekan 'Enter'. Perhatikan bahwa akun pengguna Anda memerlukan hak administratif untuk menginstal perangkat lunak. Manajer paket mengunduh dan menginstal Valgrind beserta semua dependensi yang diperlukan. Prosesnya mungkin memakan waktu beberapa menit.



Setelah proses instalasi selesai, Anda dapat memastikan keberhasilan instalasi Valgrind dengan menjalankan perintah berikut sebagai langkah verifikasi:

$ gerbang pemilu --Versi: kapan

Perintah ini menampilkan informasi versi Valgrind jika berhasil diinstal.

Itu dia! Valgrind sekarang harus diinstal pada sistem Linux Anda, dan Anda dapat menggunakannya untuk menganalisis dan men-debug program C/C++ untuk kebocoran memori dan masalah lainnya.

Membuat File di Ubuntu

Untuk mulai mengerjakan program ini, pertama-tama kita perlu membuat file di Ubuntu. Untuk pembuatan file, kami menggunakan editor teks nano. Jadi, kami menulis perintah di terminal sebagai berikut:

$ nano file1

Di sini, nano adalah nama editor teks yang sedang dijalankan. Argumen “file1” mewakili nama file yang ingin Anda buka atau buat menggunakan editor teks nano. Nano membuka file untuk diedit jika sudah ada; jika tidak, itu akan menghasilkan file baru dengan nama yang diberikan. Karena kita tidak memiliki file seperti itu, maka dibuatlah dokumen baru dengan nama, “file1”.

Setelah Anda menjalankan perintah, editor nano akan terbuka, memberi Anda kanvas kosong untuk memasukkan atau mengedit konten file “file1”. Anda dapat mulai mengetik atau menempelkan konten yang ada ke dalam editor.

Sekarang semua prasyarat telah tercapai, kami membuat beberapa contoh penggunaan Valgrind untuk mendeteksi kebocoran memori dalam program C++.

Contoh 1:

Contoh pertama yang kami berikan menunjukkan contoh sederhana alokasi memori dinamis menggunakan fungsi “malloc” dari pustaka di C.

#termasuk

ke dalam utama ( )

{

arang * A = malloc ( 102 ) ;

kembali 0 ;

}

Berikut rincian kodenya:

Kami pertama-tama menyertakan file header perpustakaan standar yang menyediakan fungsi seperti malloc untuk alokasi dan deallokasi memori dinamis.

Baris int main() mendeklarasikan fungsi utama. Kemudian, char *a = malloc(102); mendeklarasikan variabel pointer “a” bertipe char* (pointer to char). Ia menggunakan fungsi 'malloc' untuk mengalokasikan memori secara dinamis untuk array 102 elemen char (total 102 byte). Ukuran alokasi memori, dinyatakan dalam byte, dikirim sebagai masukan ke fungsi malloc dan mengeluarkan penunjuk ke blok memori yang baru dibuat. Penunjuk char* “a” diberi nilai penunjuk ini. Terakhir, 'pengembalian 0;' menandakan akhir dari fungsi utama.

Singkatnya, kode ini secara dinamis mengalokasikan memori untuk array 102 elemen char menggunakan “malloc” dan menetapkan alamat memori ke pointer “a”. Namun, perhatikan bahwa kode tersebut tidak menggunakan atau memanipulasi memori yang dialokasikan dengan cara apa pun dan tidak menyertakan dealokasi memori menggunakan free.

Saat kami menjalankan program ini melalui Valgrind dengan opsi “–leak-check=full”, program ini melakukan pemeriksaan kebocoran memori dan memberikan laporan keluaran.

Laporan keluaran yang dihasilkan oleh Valgrid diberikan sebagai berikut:

Contoh 2:

Untuk memulai ilustrasi ini, pertama-tama kita membuat file “test2” menggunakan editor teks nano seperti yang dijelaskan sebelumnya dengan menulis perintah:

$ nano tes2

Sekarang, kita menulis program C++ untuk memeriksa apakah ada kebocoran memori menggunakan Valgrind:

#termasuk

#termasuk

#termasuk

konstan ke dalam a_s = 3000 ;

ke utama ( ) {

ke dalam * ia = malloc ( ukuran dari ( ke dalam ) * sebagai ) ;

untuk ( ke dalam saya = 0 ; Saya < sebagai; saya++ ) {

dia [ Saya ] = saya;

}

pasir ( waktu ( BATAL ) ) ;

int rn = Rand ( ) % sebagai;

printf ( 'itu[%d]: %d \N ' , rn, itu [ rn ] ) ;

kembali 0 ;

}

Mari kita ikuti programnya.

Kode tersebut mencakup file header yang diperlukan dan mendefinisikan variabel konstan “a_s” dengan nilai 3000. Di dalam fungsi main(), sebuah pointer “ia” bertipe int* dideklarasikan dan memori dialokasikan secara dinamis menggunakan “malloc” fungsi. Ekspresi “sizeof(int) * a_s” menentukan total memori yang diperlukan untuk menyimpan jumlah bilangan bulat “a_s”. Semua elemen array “ia” diinisialisasi oleh loop “for” dengan nilai indeks yang sesuai. Misalnya, ia[0] menjadi 0, ia[1] menjadi 1, dan seterusnya.

Generator nomor acak diunggulkan menggunakan fungsi “srand” menggunakan waktu saat ini. Hal ini memastikan bahwa program menghasilkan satu set bilangan bulat acak yang unik setiap kali dijalankan. Fungsi “rand” menghasilkan angka acak, dan “rn” ditetapkan dengan hasil rand() % a_s. Operator modulus “%” membatasi rentang angka acak antara 0 dan a_s – 1 yang sesuai dengan indeks valid dalam larik “ia”.

Terakhir, program menggunakan fungsi “printf” untuk mencetak nilai pada indeks “rn” yang dipilih secara acak dari larik “ia”, bersama dengan indeks yang sesuai.

Saat Anda menjalankan program ini melalui Valgrind, laporan keluaran berikut akan dihasilkan:

  Tangkapan layar deskripsi program komputer dibuat secara otomatis

Kesimpulan

Kami menemukan penggunaan alat Valgrind untuk mendeteksi kebocoran memori dalam program C++. Panduan instalasi Valgrind disediakan pada awalnya. Setelah itu, kami menguraikan pembuatan file di Ubuntu menggunakan editor teks nano. Pada akhirnya, dengan menggunakan prasyarat ini, kami mengeksekusi dua contoh C++ untuk memeriksa kebocoran memori di dalamnya. Laporan yang dihasilkan oleh Valgrind juga dilampirkan yang menunjukkan kebocoran memori pada file yang disediakan.