Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk mencari kebocoran memori dalam C++ menggunakan Valgrind atau AddressSanitizer?

Bagaimana untuk mencari kebocoran memori dalam C++ menggunakan Valgrind atau AddressSanitizer?

WBOY
Lepaskan: 2024-06-02 21:23:00
asal
828 orang telah melayarinya

Untuk mencari kebocoran memori dalam C++, anda boleh memanfaatkan Valgrind dan AddressSanitizer. Valgrind mengesan kebocoran secara dinamik, menunjukkan alamat, saiz dan timbunan panggilan. AddressSanitizer ialah pemalam pengkompil Clang yang mengesan ralat dan kebocoran memori. Untuk mendayakan semakan kebocoran ASan, gunakan pilihan --leak-check=full semasa menyusun, yang akan melaporkan kebocoran selepas program dijalankan.

如何使用 Valgrind 或 AddressSanitizer 查找 C++ 中的内存泄漏?

Cara mencari kebocoran memori dalam C++ menggunakan Valgrind atau AddressSanitizer

Pengenalan
Kebocoran memori adalah masalah biasa dalam bahasa seperti C++. Untuk mengesan dan menyelesaikan kebocoran ini, alatan seperti Valgrind dan AddressSanitizer boleh digunakan.

Cari kebocoran memori dengan Valgrind
Valgrind ialah alat penyahpepijat memori dinamik yang boleh mengesan kebocoran memori. Untuk menggunakan Valgrind:

valgrind ./my_program
Salin selepas log masuk

Valgrind akan menjalankan program dan melaporkan sebarang kebocoran memori yang dikesan. Output akan menunjukkan alamat, saiz dan timbunan panggilan yang bocor.

Contoh
Contoh kod C++ berikut menunjukkan cara Valgrind mengesan kebocoran ingatan:

int* ptr = new int[10];
// ...
// 忘记释放 ptr
Salin selepas log masuk
Salin selepas log masuk

Menjalankan kod ini dan menggunakan Valgrind menghasilkan output berikut:

==8445== LeakSanitizer: detected memory leaks
==8445== Direct leak of 40 bytes in 1 object(s) allocated from:
    #0 0x49f2c0 in default_new_allocator_000000157013e0000000 ::operator() () (_libunwind.dylib:0x103d8e000)
    #1 0x41626f in create_array () in /tmp/a.out:10
    #2 0x415b2d in main () in /tmp/a.out:15

SUMMARY:
==8445== LEAK SUMMARY:
==8445==    definitely lost: 40 bytes in 1 object(s)
Salin selepas log masuk

Output menunjukkan bahawa 40 bait diedarkan 0x49 terletak pada alamat 2 cf2 cf49 .

Cari kebocoran memori dengan AddressSanitizer
AddressSanitizer (ASan) ialah pemalam pengkompil Clang yang boleh mengesan ralat memori, termasuk kebocoran memori. Untuk menggunakan ASan:

clang++ -fsanitize=address ...
Salin selepas log masuk

ASan akan mengesan ralat akses memori dan menjana laporan ranap apabila ralat berlaku. Untuk menyemak kebocoran memori, jalankan program dua kali:

./my_program # 第一次运行
./my_program --leak-check=full # 第二次运行,启用泄漏检查
Salin selepas log masuk

Larian kedua akan melaporkan sebarang kebocoran memori yang dikesan.

Contoh
Contoh kod C++ berikut menunjukkan cara AddressSanitizer mengesan kebocoran memori:

int* ptr = new int[10];
// ...
// 忘记释放 ptr
Salin selepas log masuk
Salin selepas log masuk

Menyusun dan menjalankan kod ini, dengan ASan didayakan, akan menghasilkan output berikut:

==28847== ERROR: AddressSanitizer: detected memory leaks
    SUMMARY:
    ==28847== LeakSanitizer: 40 byte(s) leaked in 1 allocation(s).
    ==28847==
    0x7fdd1b000010  40 bytes in 1 block
      ==28847== LeakSanitizer:
      ==28847==  Direct leak of 40 bytes in 1 object(s) allocated from:
      ==28847==    #0 0x7fdd17a346c0 in __sanitizer::Allocator<std::__detail::__shared_count>::allocate(unsigned long) (_sanitizer.h:1195)
      ==28847==    #1 0x7fdd184d0f90 in void* std::__detail::__shared_count<unsigned int>::allocate() (_shared_count.h:128)
      ==28847==    #2 0x7fdd182de485 in void* std::__shared_ptr<int>::__clone() (_shared_ptr.h:256)
      ==28847==    #3 0x48b935 in create_array() (/tmp/a.out:10)
      ==28847==    #4 0x48b884 in main (/tmp/a.out:15)
Salin selepas log masuk

Keluaran menunjukkan bahawa 40 dan bait adalah bocor di alamat Ditugaskan di 0x7fdd1b000010.

Atas ialah kandungan terperinci Bagaimana untuk mencari kebocoran memori dalam C++ menggunakan Valgrind atau AddressSanitizer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan