Heim  >  Artikel  >  Backend-Entwicklung  >  Wie finde ich Speicherlecks in C++ mit Valgrind oder AddressSanitizer?

Wie finde ich Speicherlecks in C++ mit Valgrind oder AddressSanitizer?

WBOY
WBOYOriginal
2024-06-02 21:23:00704Durchsuche

Um Speicherlecks in C++ zu finden, können Sie Valgrind und AddressSanitizer nutzen. Valgrind erkennt Lecks dynamisch und zeigt Adresse, Größe und Aufrufstapel an. AddressSanitizer ist ein Clang-Compiler-Plugin, das Speicherfehler und -lecks erkennt. Um die ASan-Leckprüfung zu aktivieren, verwenden Sie beim Kompilieren die Option --leak-check=full, die Lecks meldet, nachdem das Programm ausgeführt wurde.

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

So finden Sie Speicherlecks in C++ mit Valgrind oder AddressSanitizer

Einführung
Speicherlecks sind ein häufiges Problem in Sprachen wie C++. Um diese Lecks zu erkennen und zu beheben, können Tools wie Valgrind und AddressSanitizer verwendet werden.

Speicherlecks finden mit Valgrind
Valgrind ist ein dynamisches Speicher-Debugging-Tool, das Speicherlecks erkennen kann. So verwenden Sie Valgrind:

valgrind ./my_program

Valgrind führt das Programm aus und meldet alle erkannten Speicherlecks. Die Ausgabe zeigt die durchgesickerte Adresse, Größe und Aufrufliste.

Beispiel
Das folgende C++-Codebeispiel zeigt, wie Valgrind einen Speicherverlust erkennt:

int* ptr = new int[10];
// ...
// 忘记释放 ptr

Das Ausführen dieses Codes und die Verwendung von Valgrind erzeugt die folgende Ausgabe:

==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)

Die Ausgabe zeigt, dass 40 Bytes verloren gegangen sind und sich an der Adresse 0x49f2c0 verteilen .

Speicherlecks finden mit AddressSanitizer
AddressSanitizer (ASan) ist ein Clang-Compiler-Plugin, das Speicherfehler, einschließlich Speicherlecks, erkennen kann. So verwenden Sie ASan:

clang++ -fsanitize=address ...

ASan erkennt Speicherzugriffsfehler und generiert einen Absturzbericht, wenn ein Fehler auftritt. Um nach Speicherlecks zu suchen, führen Sie das Programm zweimal aus:

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

Beim zweiten Lauf werden alle erkannten Speicherlecks gemeldet.

Beispiel
Das folgende C++-Codebeispiel zeigt, wie AddressSanitizer Speicherlecks erkennt:

int* ptr = new int[10];
// ...
// 忘记释放 ptr

Das Kompilieren und Ausführen dieses Codes mit aktiviertem ASan erzeugt die folgende Ausgabe:

==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)

Die Ausgabe zeigt, dass 40 Bytes verloren gegangen sind, und an der Adresse Zugewiesen bei 0x7fdd1b000010.

Das obige ist der detaillierte Inhalt vonWie finde ich Speicherlecks in C++ mit Valgrind oder AddressSanitizer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn