valgrind - lucas beyerlucasb.eyer.be/academic/misc/mint2011-valgrind.pdf · 2017. 8. 2. ·...
Post on 16-Aug-2020
1 Views
Preview:
TRANSCRIPT
Seite 110.08.12 |
10.08.12Mint Medical GmbH
Lucas Beyer
Einführung in
Valgrind
(dynamische Speicheranalyse)
Seite 210.08.12 |
Was ist valgrind?
● Framework für Tools zur dynamischen Analyse von Programmen● Simuliert Prozessor, Cache, RAM
● Linux/Darwin
● Name des (gut bewachten) Haupteingangs zu Valhalla● Nordische Mythologie● Irrelevant
● Verfügbare Tools:● Memcheck: Erkennen von Fehlern im Speicherverhalten
● Cachegrind: Profiler, auch für Cachelines und CPU Branchingprediction
● Helgrind, DRD: Erkennen von Threadfehlern● Deadlocks● Race conditions
● Viele weitere Tools● Weniger/seltener nützlich
● Benötigt keine Änderung des Codes● Mehr Info wenn mit Debuginfo kompiliert
● Sprich: „Wall“ + G + „Rind“
Seite 310.08.12 |
Memcheck
● Unzulässige Speicherzugriffe
● Verwenden von uninitialisiertem Speicher
● Ungültige frees/deletes
● Ungültige memcpy und ähnliche
● Memoryleaks
Seite 410.08.12 |
Unzulässige Speicherzugriffe
● Lesen und schreiben● Buffer over/underrun● Bereits befreiter Speicher
Seite 510.08.12 |
Memcheck
● Unzulässige Speicherzugriffe
● Verwenden von uninitialisiertem Speicher
● Ungültige frees/deletes
● Ungültige memcpy und ähnliche
● Memoryleaks
Seite 610.08.12 |
Verwenden von uninit. Speicher● Achtung!
g++ -O2 -g
● WTF!? Valgrind funktionniert nicht!!
● C++ undefined behaviour
Generiert
valgrind
Wo ist mein if?
Seite 710.08.12 |
test_uninit2.cpp: In function ‘int main()’:test_uninit2.cpp:5: warning: ‘i’ is used uninitialized in this function
● Moral der Geschicht'
● Ignoriere Compilerwarnungen nicht!
● G++ mit -Wall
Verwenden von uninit. Speicher
Seite 810.08.12 |
Verwenden von uninit. Speicher
● Nur wenn direkt oder indirekt verwendet in● Bedingung● Ausgabe
● Alles andere erlaubt
Seite 910.08.12 |
Memcheck
● Unzulässige Speicherzugriffe
● Verwenden von uninitialisiertem Speicher
● Ungültige frees/deletes
● Ungültige memcpy und ähnliche
● Memoryleaks
Seite 1010.08.12 |
Ungültige frees/deletes
● Double-frees● Unalloced frees● new/delete mismatch
Seite 1110.08.12 |
Memcheck
● Unzulässige Speicherzugriffe
● Verwenden von uninitialisiertem Speicher
● Ungültige frees/deletes
● Ungültige memcpy und ähnliche
● Memoryleaks
Seite 1210.08.12 |
Memoryleaks
● „Still reachable“● Es gibt noch einen gültigen Pointer auf den Anfang des blocks
● Es ist die Rede von memory Blöcken
● „Definitely lost“● Es gibt keinen gültigen Pointer mehr● Typischer memory-leak
● „Indirectly lost“● Es gibt noch gültige Pointer
● Jedoch befinden sich diese auch nur in verlorenem Speicher
● Typischer Folgefehler● z.B. Baumstruktur, wenn die Wurzel verloren ist
● „Possibly lost“● Es gibt noch gültige Pointer, aber nur mitten in den Block
● Zufall● Fehler● C++ new[] „magic cookie“
Seite 1310.08.12 |
Memoryleaks
● „Still reachable“ und „Indirectly lost“● nur angezeigt, wenn –show-reachable=yes● Meist unwichtig
● „Possibly lost“● „Potential memory leak“-Kategorie in Cdash● Nicht zu unterschätzen, wegen C++ new[]
Seite 1410.08.12 |
Memoryleaks
Seite 1510.08.12 |
Memcheck
● Unzulässige Speicherzugriffe
● Verwenden von uninitialisiertem Speicher
● Ungültige frees/deletes
● Ungültige memcpy und ähnliche
● Memoryleaks
● Input ptr und output ptr überlappen● Auch bei strcpy und strcat
● Werden diese heutzutage überhaupt noch verwendet?
Seite 1610.08.12 |
Bonusquiz 1
● G++ option -Wnon-virtual-dtor ist einfacher
quizz_leak.cpp:1: warning: ‘struct Base’ has virtual functions and accessible non-virtual destructorquizz_leak.cpp:10: warning: ‘struct Deriv’ has virtual functions and accessible non-virtual destructor
Seite 1710.08.12 |
Bonusquiz 2
top related