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

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

WBOY
WBOYasal
2024-06-02 21:23:00704semak imbas

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

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

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)

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 ...

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 # 第二次运行,启用泄漏检查

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

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)

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!

Kenyataan:
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