Valgrind - Lucas Beyerlucasb.eyer.be/academic/misc/mint2011-valgrind.pdf · 2017. 8. 2. ·...

Post on 16-Aug-2020

0 views 0 download

Transcript of Valgrind - Lucas Beyerlucasb.eyer.be/academic/misc/mint2011-valgrind.pdf · 2017. 8. 2. ·...

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