Cara Mengesan Kebocoran Memori dalam C/C++ dengan Valgrind

Cara Mengesan Kebocoran Memori Dalam C C Dengan Valgrind



Valgrind ialah alat yang digunakan secara meluas untuk nyahpepijat dan memprofilkan atur cara perisian yang ditulis terutamanya dalam C, C++ dan bahasa lain. Ia membantu pembangun untuk mengesan kebocoran memori, menjejaki ralat capaian memori, dan memprofilkan pelaksanaan program mereka.

Apabila anda menjalankan program di bawah Valgrind, ia secara dinamik menginstrumen program boleh laku, membolehkannya memantau penggunaan memori program dan tingkah laku pelaksanaan.

Kebocoran Memori dalam C++

Adalah penting untuk ambil perhatian bahawa Valgrind direka terutamanya untuk program C dan C++ dan mungkin tidak berfungsi dengan berkesan dengan bahasa lain atau dalam semua senario. Selain itu, menjalankan program di bawah Valgrind boleh melambatkan pelaksanaannya dengan ketara, jadi ia sering digunakan semasa pembangunan dan penyahpepijatan dan bukannya dalam persekitaran pengeluaran.







Apabila memori yang dicipta secara dinamik tidak dikeluarkan dengan betul, ia boleh menyebabkan kebocoran memori dalam C/C++ yang perlahan-lahan akan mengalirkan sumber memori yang tersedia. Ini boleh mengakibatkan penggunaan memori yang berlebihan dan prestasi program yang merosot.



Pemasangan Valgrid

Untuk memasang Valgrind pada sistem Linux, buka terminal dan kemas kini repositori pakej anda menggunakan pengurus pakej yang khusus untuk pengedaran Linux anda. Perintah berikut berfungsi untuk sistem berasaskan Ubuntu dan Debian:



$ sudo kemas kini yang sesuai

Gunakan pengurus pakej untuk memasang Valgrind. Sekali lagi, arahan mungkin berbeza-beza bergantung pada pengedaran Linux anda. Gunakan arahan berikut untuk sistem berasaskan Ubuntu dan Debian:





$ sudo apt pasang pintu pilihanraya

Apabila digesa, masukkan kata laluan pengguna anda dan tekan 'Enter'. Ambil perhatian bahawa akaun pengguna anda memerlukan keistimewaan pentadbiran untuk memasang perisian. Pengurus pakej memuat turun dan memasang Valgrind bersama-sama dengan sebarang kebergantungan yang diperlukan. Proses ini mungkin mengambil masa beberapa minit.



Selepas proses pemasangan selesai, anda boleh mengesahkan pemasangan Valgrind yang berjaya dengan melaksanakan arahan berikut sebagai langkah pengesahan:

$ pintu pilihanraya --versi

Perintah ini memaparkan maklumat versi Valgrind jika ia berjaya dipasang.

Itu sahaja! Valgrind kini sepatutnya dipasang pada sistem Linux anda dan anda boleh menggunakannya untuk menganalisis dan menyahpepijat program C/C++ anda untuk kebocoran memori dan isu lain.

Mencipta Fail dalam Ubuntu

Untuk mula bekerja pada program ini, pertama sekali kita perlu mencipta fail dalam Ubuntu. Untuk penciptaan fail, kami menggunakan penyunting teks nano. Jadi, kami menulis arahan pada terminal seperti berikut:

$ nano fail1

Di sini, nano ialah nama penyunting teks yang sedang dilaksanakan. Argumen 'file1' mewakili nama fail yang anda ingin buka atau buat menggunakan penyunting teks nano. Nano membuka fail untuk diedit jika ia sudah wujud; jika tidak, ia menjana fail baharu dengan nama yang dibekalkan. Oleh kerana kami tidak mempunyai fail sedemikian, ia mencipta dokumen baharu dengan nama, 'file1'.

Sebaik sahaja anda menjalankan arahan, editor nano akan dibuka, memberikan anda kanvas kosong untuk memasukkan atau mengedit kandungan fail 'file1'. Anda boleh mula menaip atau menampal kandungan sedia ada ke dalam editor.

Kini setelah semua prasyarat tercapai, kami mencipta beberapa contoh untuk menggunakan Valgrind untuk mengesan kebocoran memori dalam program C++.

Contoh 1:

Contoh pertama yang kami sediakan menunjukkan contoh mudah peruntukan memori dinamik menggunakan fungsi 'malloc' daripada pustaka dalam C.

#include

int utama ( )

{

char * a = malloc ( 102 ) ;

kembali 0 ;

}

Berikut ialah pecahan kod:

Kami mula-mula memasukkan fail pengepala perpustakaan standard yang menyediakan fungsi seperti malloc untuk peruntukan memori dinamik dan deallocation.

Baris int main() mengisytiharkan fungsi utama. Kemudian, char *a = malloc(102); mengisytiharkan pembolehubah penunjuk 'a' jenis char* (penunjuk kepada char). Ia menggunakan fungsi 'malloc' untuk memperuntukkan memori secara dinamik untuk tatasusunan 102 elemen aksara (jumlah 102 bait). Saiz peruntukan memori, dinyatakan dalam bait, dihantar sebagai input kepada fungsi malloc dan ia mengeluarkan penunjuk kepada blok memori yang baru dibuat. Penunjuk char* “a” diberikan nilai penunjuk ini. Akhir sekali, 'pulangan 0;' menandakan berakhirnya fungsi utama.

Ringkasnya, kod ini memperuntukkan memori secara dinamik untuk tatasusunan 102 elemen aksara menggunakan 'malloc' dan memberikan alamat memori kepada penunjuk 'a'. Walau bagaimanapun, ambil perhatian bahawa kod itu tidak menggunakan atau memanipulasi memori yang diperuntukkan dalam apa-apa cara dan tidak termasuk deallocation memori menggunakan percuma.

Apabila kami menjalankan program ini melalui Valgrind dengan pilihan '–leak-check=full', ia melakukan semakan kebocoran memori dan menyediakan laporan output.

Laporan keluaran yang dihasilkan oleh Valgrid diberikan seperti berikut:

Contoh 2:

Untuk memulakan dengan ilustrasi ini, kami mula-mula membuat fail 'test2' menggunakan penyunting teks nano seperti yang dijelaskan sebelum ini dengan menulis arahan:

$ nano ujian2

Sekarang, kami menulis program C++ untuk memeriksa sama ada terdapat kebocoran memori menggunakan Valgrind:

#include

#include

#include

const int a_s = 3000 ;

int utama ( ) {

int * ia = malloc ( saiz ( int ) * a_s ) ;

untuk ( int i = 0 ; i < a_s; i++ ) {

ia [ i ] = i;

}

srand ( masa ( NULL ) ) ;

int rn = rand ( ) % a_s;

printf ( 'ia[%d]: %d \n ' , rn, ia [ rn ] ) ;

kembali 0 ;

}

Mari kita melalui program ini.

Kod tersebut termasuk fail pengepala yang diperlukan dan mentakrifkan pembolehubah pemalar 'a_s' dengan nilai 3000. Di dalam fungsi main(), penunjuk 'ia' jenis int* diisytiharkan dan memori diperuntukkan secara dinamik menggunakan 'malloc' fungsi. Ungkapan 'sizeof(int) * a_s' menentukan jumlah memori yang diperlukan untuk menyimpan nombor 'a_s' integer. Semua elemen tatasusunan 'ia' dimulakan oleh gelung 'untuk' dengan nilai indeks yang sepadan. Sebagai contoh, ia[0] akan menjadi 0, ia[1] akan menjadi 1, dan seterusnya.

Penjana nombor rawak disemai menggunakan fungsi 'srand' menggunakan masa semasa. Ini memastikan program menghasilkan set integer rawak yang unik setiap kali ia dilaksanakan. Fungsi 'rand' menjana nombor rawak, dan 'rn' diberikan dengan hasil rand() % a_s. Pengendali modulus “%” mengehadkan julat nombor rawak menjadi antara 0 dan a_s – 1 yang sepadan dengan indeks yang sah dalam tatasusunan “ia”.

Akhir sekali, program menggunakan fungsi 'printf' untuk mencetak nilai pada indeks 'rn' yang dipilih secara rawak tatasusunan 'ia', bersama-sama dengan indeks yang sepadan.

Apabila anda menjalankan program ini melalui Valgrind, ia menghasilkan laporan output berikut:

  Tangkapan skrin program komputer Perihalan dijana secara automatik

Kesimpulan

Kami menemui penggunaan alat Valgrind untuk mengesan kebocoran memori dalam program C++. Panduan pemasangan Valgrind disediakan pada mulanya. Selepas itu, kami menghuraikan penciptaan fail dalam Ubuntu menggunakan penyunting teks nano. Akhirnya, menggunakan prasyarat ini, kami melaksanakan dua contoh C++ untuk memeriksa kebocoran memori di dalamnya. Laporan yang dijana oleh Valgrind juga dilampirkan yang menunjukkan kebocoran memori dalam fail yang disediakan.