Valgrind. Speicherleaks und Bugs finden. Frederik Heber. Seminarreihe Technische Numerik. Institut für Numerische Simulation, Universität Bonn

Ähnliche Dokumente
Mint Medical GmbH. Einführung in. Valgrind. (dynamische Speicheranalyse) Lucas Beyer. Seite

Effizientes Memory Debugging in C/C++

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Software Entwicklung 1

HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage

Early first draft Höllische Programmiersprachen Seminar im WS 2014/15 Speichermanagement

Algorithmen und Datenstrukturen

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++ Debugging

Übungen zu Systemprogrammierung 1 (SP1)

Crashkurs C++ - Teil 1

Programmieren in Java

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Zeiger in C und C++ Zeiger in Java und C/C++

Grundlagen der Informatik 11. Zeiger

Kurzeinführung in C99

Was ist ein Profiler?

Pthreads. David Klaftenegger. Seminar: Multicore Programmierung Sommersemester

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

Advanced Programming in C

Eindimensionale Arrays und Heap

Zeiger und dynamischer Speicher

6 Speicherorganisation

Speichermanagement Software Entwicklung 1

9 Zeiger (Pointer). Dynamischer Speicher

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

Speichermanagement Software Entwicklung 1

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Name: Klausur Informatik III WS 2003/04

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

Programmierwerkstatt. Arrays, Pointer und Referenzen

Standardbibliotheken. Datentyp bool. Eingaben 2/2. Eingaben 1/2. In C gibt es keinen logischen Datentyp

Tools zur Programmierung mit C Software Entwicklung 1

Java Virtual Machine (JVM) Bytecode

Universität Hamburg. Seminar: Effiziente Programmierung in C. Referenzzählung. Autoren: Kevin Köster. Betreuer: Michael Kuhn

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

6 Speicherorganisation

Exceptions. CoMa-Übung VI TU Berlin. CoMa-Übung VI (TU Berlin) Exceptions / 19

Dynamische Speicherverwaltung

Einstieg in die Informatik mit Java

Debugging und Speicherfehler. Seminar Effiziente Programmierung Kadir Duman

Speicherverwaltung in C

Dynamische Speicherverwaltung

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer)

C++ für alle. Praktische Neuerungen in C September 2012

Zeiger. Zeiger ist eine Variable deren Wert eine Adresse enthält. Zeiger werden im Programm definiert. int *pmyinteger; Type *PointerName ;

C Seminar. Dr.sc.nat. Michael J.M. Wagner, New Elements. Revision 89

Praxisorientierte Einführung in C++ Lektion: "Dynamische Speicherverwaltung"

Der Gnu-C++-Compiler allerdings lässt den oben beschriebenen Code durchgehen. Das ist allerdings nicht Standardkonform und sollte deswegen vermieden

Praxis der Programmierung

Datenkapselung: public / private

Mehr Effektiv C++ programmieren

Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte

4. Objektorientierte Programmierung mit C++

Computergestütztes wissenschaftliches Rechnen SoSe 2004

Vorlesung Programmieren

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Pointer und Array Bugs in C / C++: Werkzeuge jenseits des Debuggers. Klaus Kusche, Juni 2013

U8 7. Übung U8 7. Übung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

C++ Teil 7. Sven Groß. 26. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 18

Objektorientierte Programmierung und Klassen

Agenda. Informatik I WS05/06 Folien von Tobias Dezulian

Praxis der Programmierung

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 24. Juni 2016

Programmieren in Haskell Debugging

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Objektorientierte Programmierung mit C Strukturierte Anweisungen: Exception Handling

Semantics of C++ Seminar Wintersemester 2009/2010. Pointer. Ludwig Nägele Technische Universität München

Zeiger in C und C++ Zeiger in Java und C/C++

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Informatik - Übungsstunde

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

Grundlagen der Informatik 12. Strukturen

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

Informatik I (D-ITET)

Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer"

Hydroinformatik I: Referenzen und Zeiger

Programmiertechnik II

Informatik 1 ( ) D-MAVT F2011. Pointer, Structs. Yves Brise Übungsstunde 6

Liste Programmieren Java Überblick

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

1 Fehler in einem Programm

Repetitorium Programmieren I + II

CORBA Implementierung von Client und Server

Programmieren in C++ Klassen

Programmierkurs. Steffen Müthing. January 18, Interdisciplinary Center for Scientific Computing, Heidelberg University

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

Kapitel 07. Variablen und deren Gültigkeit. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

1.5. Strukturierte Anweisungen

Probeklausur Name: (c)

Ein kleiner Blick auf die generische Programmierung

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

Transkript:

Speicherleaks und Bugs finden Institut für Numerische Simulation, Universität Bonn findet Seminarreihe Technische Numerik

findet findet

C/C++ bieten keinen Garbage Collector. Vorteile Mehr Freiheiten. Bewussteres Programmieren. Nachteile Speicherlecks können entstehen. Na und? Speicherlecks sind kein sauberer Code! Speicherlecks in Schleifen oder Unterfunktionen potenzieren sich! findet

Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet

Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet

Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet

Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet

Ich bette new/delete s in Objekte ein. template <typename T> MemoryContainer { MemoryContainer(T *ptr) : mem_ptr(ptr) {; MemoryContainer() { delete(mem_ptr); ; private: T * mem_ptr; double * f(double val){return new double(val); { MemoryContainer<double> Container( f(0.) ); findet Es gibt keine delete()s. Alle delete s erfolgen in Destruktoren eigens dafür geschaffener Containerobjekte.

Ich bette new/delete s in Objekte ein. template <typename T> MemoryContainer { MemoryContainer(T *ptr) : mem_ptr(ptr) {; MemoryContainer() { delete(mem_ptr); ; private: T * mem_ptr; double * f(double val){return new double(val); { MemoryContainer<double> Container( f(0.) ); findet Es gibt keine delete()s. Alle delete s erfolgen in Destruktoren eigens dafür geschaffener Containerobjekte.

Ich bette new/delete s in Objekte ein. template <typename T> MemoryContainer { MemoryContainer(T *ptr) : mem_ptr(ptr) {; MemoryContainer() { delete(mem_ptr); ; private: T * mem_ptr; double * f(double val){return new double(val); { MemoryContainer<double> Container( f(0.) ); findet Es gibt keine delete()s. Alle delete s erfolgen in Destruktoren eigens dafür geschaffener Containerobjekte.

Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;

Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;

Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;

Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;

Boost sorgt für sichere Freigabe. void f() { boost::shared ptr<double> ptr(new double(0.)); Boosts smart pointer funktionieren wie ein richtiger Pointer. Achtung, es können keine Zirkelreferenzen erkannt werden. Ihre Verwendung ergibt also keine sorglose Garbage Collector-Funktion. findet

Boost sorgt für sichere Freigabe. void f() { boost::shared ptr<double> ptr(new double(0.)); Boosts smart pointer funktionieren wie ein richtiger Pointer. Achtung, es können keine Zirkelreferenzen erkannt werden. Ihre Verwendung ergibt also keine sorglose Garbage Collector-Funktion. findet

Boost sorgt für sichere Freigabe. void f() { boost::shared ptr<double> ptr(new double(0.)); Boosts smart pointer funktionieren wie ein richtiger Pointer. Achtung, es können keine Zirkelreferenzen erkannt werden. Ihre Verwendung ergibt also keine sorglose Garbage Collector-Funktion. findet

http://www.valgrind.org/ ist eine Programmsuite mit Memchecker Sucht nach Speicherlecks und nicht-initialisierten Variablen. Cachegrind Prüft die Performance der Cache-Nutzung des Programmcodes. Callgrind Produziert einen Aufrufgraphen des Programmscodes mit darin verbrachten Laufzeitanteilen. Helgrind/DRD Prüft (Synchronisations-)Fehler in Thread-basierten Programmen. Massif Prüft die Effizienz der Heapspeicherverwendung und des Stacks. Ptrcheck Sucht nach Bufferüberläufen, falschen Speicherzugriffen. findet

Aufruf per Kommandozeile./valgrind [OPTIONS] [PROGRAMM and options] -v Ausführlicherer Output von Programmfehlern - -leak-check=full Vollständige und umfangreichere Suche nach Speicherlecks - -show-reachable=yes Zeig an, ob Speicher immer noch erreichbar ist (d. h. einfach nur nicht sinnvoll freigegeben wurde) - -db-attach=yes Startet einen Debugger an der Stelle, wo gerade ein Fehler erkannt wurde. findet

Aufruf in Eclipse dank Linux Tools Project findet

Liste möglicher Fehler illegal read/write - Lesen/Schreiben über Array-Grenzen hinaus oder in nicht-allokierten Speicherzellen Conditional jump or move depends of uninitialised value(s) - Nicht-initialisierte Variable wird benutzt Syscall param points to uninitialized byte(s) - Nicht-initialisierte Variablen wird für Syscalls benutzt. invalid free() - Zweimaliges Freigeben oder Freigeben von nicht-allokierten Bereichen. Mismatched free() / delete / delete[ ] - Mit new[] allokierte Bereiche durch free() freigeben anstatt delete[]. findet

http://valgrind.org/ Scott Meyers, Effektiv C++ programmieren, Addison-Wesley, 2006. http://www.boost.org/doc/libs/1 40 0/libs/smart ptr/ http://ootips.org/yonat/4dev/smart-pointers.html findet