Rumah  >  Artikel  >  Tutorial sistem  >  Bagaimana untuk mengesan dan menyelesaikan kebocoran memori di bawah Linux

Bagaimana untuk mengesan dan menyelesaikan kebocoran memori di bawah Linux

WBOY
WBOYke hadapan
2024-02-12 14:30:17858semak imbas

Kebocoran memori merujuk kepada fenomena bahawa program menggunakan ruang memori tetapi tidak melepaskannya tepat pada masanya semasa proses berjalan, menyebabkan semakin banyak memori yang diduduki, malah menyebabkan sistem ranap. Kebocoran memori adalah kecacatan perisian biasa dan merupakan masalah yang tidak boleh diabaikan untuk sistem Linux. Jadi, bagaimana untuk mencari dan membetulkan kebocoran memori di bawah Linux? Apakah alatan yang boleh membantu kami mengesan dan menganalisis kebocoran memori? Artikel ini akan memperkenalkan anda kepada beberapa alat kebocoran memori yang biasa digunakan di bawah Linux, membolehkan anda mengurus dan mengoptimumkan sumber memori dengan lebih baik di bawah Linux.

Linux 下如何检测和解决内存泄漏问题

Kebocoran memori boleh dibahagikan kepada kategori berikut:
1. Kebocoran ingatan yang kerap. Kod dengan kebocoran memori akan dilaksanakan beberapa kali, menyebabkan kebocoran memori setiap kali ia dilaksanakan.
2. Kebocoran memori sporadis. Kod yang menyebabkan kebocoran memori hanya akan berlaku dalam keadaan atau operasi tertentu. Kerap dan sporadis adalah relatif. Untuk keadaan tertentu, perkara yang sekali-sekala mungkin menjadi perkara biasa. Jadi persekitaran ujian dan kaedah ujian adalah penting untuk mengesan kebocoran memori.
3. Kebocoran memori satu kali. Kod yang menyebabkan kebocoran memori hanya akan dilaksanakan sekali, atau disebabkan kelemahan algoritma, akan sentiasa ada satu dan hanya satu blok memori yang bocor. Sebagai contoh, memori diperuntukkan dalam pembina kelas Singleton, tetapi memori tidak dikeluarkan dalam pemusnah. Terdapat hanya satu contoh kelas Singleton, jadi kebocoran memori hanya akan berlaku sekali.
4. Kebocoran ingatan tersirat. Program ini secara berterusan memperuntukkan memori semasa ia berjalan, tetapi tidak melepaskan memori sehingga tamat. Tegasnya, tiada kebocoran memori di sini, kerana program akhirnya mengeluarkan semua memori yang diminta. Tetapi untuk program pelayan yang perlu dijalankan selama beberapa hari, minggu atau bulan, kegagalan untuk melepaskan memori dalam masa juga boleh menyebabkan keletihan akhirnya semua memori sistem. Oleh itu, kami memanggil jenis kebocoran memori ini sebagai kebocoran ingatan tersirat.

Alat Pengesan Kebocoran Memori

Terdapat banyak cara untuk mengesan kebocoran memori sekarang. Berikut ialah senarai alat pengesan kebocoran memori yang biasa digunakan di Linux.

1, mtrace

Persekitaran aplikasi: Linux GLIBC

Bahasa pengaturcaraan: C

Arahan penggunaan: Sertakan fail pengepala mcheck.h, tentukan pembolehubah persekitaran MALLOC_TRACE sebagai nama fail output dan panggil mtrace() apabila program bermula.

Keluaran hasil: fail yang ditentukan pengguna

Idea reka bentuk: Tambahkan fungsi cangkuk pada fungsi malloc, realloc dan bebas, dan rekod pelaksanaan setiap pasangan bebas malloc

Kebaikan dan keburukan: Hanya kebocoran memori yang disebabkan oleh penggunaan malloc/realloc/free boleh diperiksa

Cara mendapatkannya: GLIBC disertakan dan boleh digunakan terus

2.memwatch

Persekitaran aplikasi: Linux

Bahasa pengaturcaraan: C

Arahan: Tambah memwatch.h, tambah -DMEMWATCH -DMW_STDIO dan memwatch.c semasa menyusun

Output hasil: Nama fail output ialah memwatch.log Semasa pelaksanaan program, gesaan ralat akan dipaparkan pada stdout

Idea reka bentuk: Takrif semula malloc/realloc/calloc/strdup/free, dsb. sebagai mwMalloc(sz, FILE, LINE), dsb., dan mengekalkan senarai terpaut operasi secara dalaman

Kebaikan dan keburukan: Boleh mengesan memori bebas dua kali, bebas ralat, tidak bebas, limpahan, aliran bawah, dll.

Bagaimana untuk mendapatkan: http://memwatch.sourceforge.net/

3.valgrind

Persekitaran aplikasi: Linux

Bahasa pengaturcaraan: C/C++

Cara menggunakan: Tambahkan pilihan -g semasa menyusun, seperti nama fail gcc -g.c -o, dan gunakan arahan berikut untuk mengesan penggunaan memori:

Keluaran hasil: #valgrind –tool=memcheck –leak-check=yes –show-reachable=yes ./nama fail, anda akan melihat laporan penggunaan memori

Idea reka bentuk: Kekalkan jadual ruang alamat yang sah dan jadual ruang alamat tidak sah (ruang alamat proses) mengikut operasi memori perisian

Kebaikan dan keburukan: Keupayaan untuk mengesan:

  • Penggunaan memori yang tidak dimulakan
  • Menggunakan memori yang telah dibebaskan (Membaca/menulis memori selepas ia dibebaskan)
  • Menggunakan lebih banyak ruang memori daripada yang diperuntukkan malloc (Membaca/menulis hujung blok malloc'd)
  • Akses tidak sah kepada timbunan (Membaca/menulis kawasan yang tidak sesuai pada timbunan)
  • Sama ada ruang yang digunakan telah dikeluarkan (Memori bocor – di mana penunjuk kepada blok malloc'd hilang selama-lamanya)
  • Penggunaan malloc/baru/baru [] yang tidak sepadan lwn percuma/padam/padam [])
  • Penunjuk src dan dst bertindih dalam memcpy() dan fungsi berkaitan)
  • Ulang percuma

Cara untuk mendapatkan: http://valgrind.org/

4.debug_new

Persekitaran aplikasi: Linux/Windows

Bahasa pengaturcaraan: C++

Arahan: Sertakan fail pengepala debug_new.h, pautan debug_new.cpp

Keluaran hasil: konsol

Idea reka bentuk: Tangkap permintaan aplikasi/keluaran memori dengan melebihkan operator baharu dan padam, dan kekalkan senarai cincang pembolehubah statik global di dalam program. Dalam pengendali baharu, ia bukan sahaja memperuntukkan memori yang diminta oleh pengguna, tetapi juga menambah pengepala kepada setiap memori yang diperuntukkan, yang menyimpan maklumat lokasi dan penunjuk senarai terpaut bagi peruntukan tersebut kepala mengimbangi memori, dan nilai pulangan ini telah dikira HASH sebelum ini dan ditambah pada senarai terpaut HASH. Apabila memadam, mula-mula lakukan pengiraan HASH berdasarkan alamat penuding yang akan dikeluarkan, dan kemudian lintasi senarai terpaut pada nilai HASH tatasusunan untuk mencari Jika ditemui, nod akan dialih keluar. Dengan cara ini, selepas program tamat, kita boleh menentukan sama ada terdapat kebocoran memori dengan menyemak sama ada terdapat sebarang blok memori yang belum dikeluarkan dalam tatasusunan ini.

Kebaikan dan keburukan: merentas platform, hanya untuk program C++,

Cara mendapatkan: http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html

Ringkasan

Kaedah yang digunakan oleh alat analisis di atas boleh dibahagikan secara kasar kepada kategori berikut:

1. Daftarkan peruntukan memori/lepaskan fungsi cangkuk (cangkuk). Di bawah Linux, terdapat lima fungsi cangkuk seperti malloc_hook dan free_hook Di bawah Windows, anda boleh mendaftarkan fungsi cangkuk _CrtSetAllocHook, supaya permintaan ini boleh ditangkap dan diproses apabila memori diperuntukkan. Pengesan Kebocoran Visual dan mtrace menggunakan kaedah ini.

2. Gunakan penggantian definisi makro. Gantikan malloc dan percuma dalam kod pengguna dengan fungsi tersuai seperti mwMalloc(sz, FILE, LINE) yang ditentukan makro untuk menjejaki permintaan memori menggunakan kaedah ini.

3. Operator berlebihan. Kaedah ini hanya digunakan dalam bahasa C++ Ia melaksanakan permintaan memori penjejakan dengan melebihkan operator baharu dan padamkan operator yang terlebih beban adalah serupa dengan maksud fungsi cangkuk. debug_new mengambil pendekatan ini.

Kaedah keluaran alatan ini juga terbahagi kepada jenis berikut:

1. Dalam keadaan biasa, output biasanya dihantar ke tetingkap penyahpepijatan sendiri, dan output aplikasi GUI ke output standard tidak kelihatan. Pengesan Kebocoran Visual menggunakan kaedah ini.

2. Output ke output standard atau output ralat standard: Aplikasi konsol boleh mengeluarkan ke skrin, seperti memwatch, valgrind dan debug_new semuanya menggunakan kaedah ini.

3. Output ke fail log: Output hasil ke fail log yang ditentukan pengguna atau lalai, seperti mtrace dan memwatch.

Selain itu, kaedah pengesanan memori alat ini terbahagi kepada dua jenis:

1. Kekalkan senarai terpaut operasi memori Apabila terdapat operasi aplikasi memori, ia ditambahkan ke senarai terpaut ini Apabila terdapat operasi keluaran, operasi aplikasi dialih keluar dari senarai terpaut. Jika masih terdapat kandungan dalam senarai terpaut selepas program tamat, ini bermakna terdapat kebocoran memori jika operasi memori yang akan dikeluarkan tidak menemui operasi yang sepadan dalam senarai terpaut, ini bermakna ia telah dikeluarkan beberapa kali; . Gunakan kaedah ini dengan alat penyahpepijatan terbina dalam, Pengesan Kebocoran Visual, mtrace, memwatch, debug_new.

2. Simulasikan ruang alamat proses. Berikutan pengendalian sistem pengendalian operasi memori proses, pemetaan ruang alamat dikekalkan dalam mod pengguna Kaedah ini memerlukan pemahaman yang mendalam tentang pengendalian ruang alamat proses. Oleh kerana pengedaran ruang alamat proses Windows bukan sumber terbuka, sukar untuk disimulasikan, jadi ia hanya disokong pada Linux. Yang mengambil pendekatan ini ialah valgrind.

Melalui artikel ini, anda seharusnya mempunyai pemahaman asas tentang masalah kebocoran memori di bawah Linux, dan mengetahui punca, kesan dan penyelesaiannya. Anda juga mempelajari tentang beberapa alat kebocoran memori yang biasa digunakan di bawah Linux, seperti Valgrind, Memwatch, Mtrace, dsb., serta kaedah penggunaan, kelebihan dan kekurangannya. Kami mengesyorkan agar anda menggunakan alat ini untuk mengesan dan menganalisis kebocoran memori semasa membangunkan dan menguji program Linux untuk meningkatkan prestasi dan kestabilan program. Pada masa yang sama, kami juga mengingatkan anda untuk memberi perhatian kepada beberapa langkah berjaga-jaga dan sekatan apabila menggunakan alat ini untuk mengelakkan salah penilaian atau ketinggalan. Saya harap artikel ini dapat membantu anda menggunakan sistem Linux dengan lebih baik dan membolehkan anda menulis program berkualiti tinggi di bawah Linux.

Atas ialah kandungan terperinci Bagaimana untuk mengesan dan menyelesaikan kebocoran memori di bawah Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lxlinux.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam