Cpp Programmierung: Unterschied zwischen den Versionen

Aus Physik
Zur Navigation springen Zur Suche springen
Zeile 19: Zeile 19:
   
 
stellt die maximale core dump grösse auf 20MB.<br>
 
stellt die maximale core dump grösse auf 20MB.<br>
Nun führt man (in der gleichen Konsole!) das fehlerhafte Programm aus, das mit einem Speicherzugriffsfehler beendet. Es wird ein core file angelegt.<br>
+
Nun führt man (in der gleichen Konsole!) das fehlerhafte Programm aus, das mit einem Speicherzugriffsfehler beendet. Es wird automatisch ein core file angelegt.<br>
   
 
Jetzt braucht man nur ein Debugger Programm, dort die Sourcefiles angeben, und den core dump laden, und kann sie den Zustand des Programms zum Zeitpunkt des "Programmabsturzes" ansehen. Das weitverbreitetste Debugger ist "ddd". Lässt sich einfach in der Konsole mit dem Befehl
 
Jetzt braucht man nur ein Debugger Programm, dort die Sourcefiles angeben, und den core dump laden, und kann sie den Zustand des Programms zum Zeitpunkt des "Programmabsturzes" ansehen. Das weitverbreitetste Debugger ist "ddd". Lässt sich einfach in der Konsole mit dem Befehl

Version vom 11. April 2005, 12:29 Uhr

Qt

Eine Klassenbibliothek und Entwicklungsumgebung für Programmierung graphischer Benutzeroberflächen.

Debuggen von C/C++ Programmen

Besonders die Speicherzugriffsfehler (Segmentation Faults) können schwer zu finden sein. Es gibt aber Tools mit denen die Fehlersuche wesentlich schneller und weniger frustrierend verläuft.

valgrind

Valgrind ist ein Programm, das die ganze CPU emuliert, es verfolgt jeden einzelnen Zugriff auf den Speicher, den das zu testende Programm macht. Ungültige Speicherzugriffe (z.B. über das ende eines Arrays hinausschreiben) werden auf der Konsole ausgegeben und können im Quellcode sofort ausgebessert werden. Die Verwendung ist ganz einfach:

  $ valgrind <das_zu_testende_programm>

Die Meldungen von valgrind sind etwas kryptisch, es wird aber alles klar, wenn man sich das kurze howto durchliest. (hier ist noch ein howto) Das zu testende Programm muss natürlich mit dem flag -d (fürs debuggen) kompiliert sein. Da die cpu emuliert wird, läuft das programm ungefähr 20 mal langsammer. Sollte für das testen aber kein Problem sein. Valgrind ist im Computerraum natürlich installiert.

core dump

Nach einem Speicherzugriffsfehler kann man linux dazu veranlassen einen sogenannten "core dump" abzuspeichern. Es ist eine Datei die einfach 'core' heisst. In diesem File das dann in dem Verzeichniss abgespeichert wird, von wo das Programm gestartet wurde, befindet sich der vom Programm verwendete Arbeitsspeicher, so wie er zum Zeitpunkt des Programmfehlers gerade gesetzt war. Man kann sich also den Variableninhalt zum Zeitpunkt des Fehlers anschauen. Außerdem bekommt man auch die Programmzeile, in der der Fehler aufgetreten ist.
Der core dump wird standartmäsig nicht abgespeichert, es muss erst eine Konsole aufgemacht werden, und dort mit dem Befehl ulimit die maximale Grösse des core dump festgelegt werden. Diese Einstellung gilt dann aber nur für die eine Konsole! Nach dem Schliessen der Konsole ist alles wieder auf standarteinstellung!
Der Befehl

  $ ulimit -c 20000

stellt die maximale core dump grösse auf 20MB.
Nun führt man (in der gleichen Konsole!) das fehlerhafte Programm aus, das mit einem Speicherzugriffsfehler beendet. Es wird automatisch ein core file angelegt.

Jetzt braucht man nur ein Debugger Programm, dort die Sourcefiles angeben, und den core dump laden, und kann sie den Zustand des Programms zum Zeitpunkt des "Programmabsturzes" ansehen. Das weitverbreitetste Debugger ist "ddd". Lässt sich einfach in der Konsole mit dem Befehl

  $ ddd

starten. Wie bei valgrind, sollte das Programm mit dem -d flag (für Debuginformationen) kompiliert sein.

Plotten von Daten

Es gibt mehrere Möglichkeiten Plots zu erzeugen:

  1. Speichern der Daten in Files, laden in Matlab und Plots erzeugen
    • Vorteil: gute, alte Matlab-Plots, Plotbefehle sind (mehr oder weniger) bekannt
    • Nachteil: umständlich
  2. In C die Berechnungen und Funktionen, mit denen man die Daten erhält, schreiben.
    Dann aus Matlab heraus die Funktionen aufrufen und die erhaltenen Daten plotten
    • Im Prinzip wie 1. Methode, man spart sich den Zwischenschritt über die Files
    • Wie man C-Funktionen aus Matlab startet, findet man hier
    • Vorteil: Ausgaben können in einem Schritt erstellt werden
    • Nachteil: mann muss zusätzlich die Funktionalität bereit stellen, mit deren Hilfe die Daten ins Matlab kommen
  3. Verwenden des C-Interfaces von Gnuplot
    • Infos dazu unter Computer_Benutzung#Visualisierung
      Link zum Projekt (alles Nötige steht dort zum Download)
    • Vorteil: einfach!
    • Nachteil: man muss sich in die Plotfunktionen einlesen (geht aber unheimlich schnell, da es wie die Matlab-Plots funktioniert, außerdem ist gute Doku vorhanden)
    • Nachteil: es sind nicht alle Matlab-Plots verfügbar, aber für die meisten Anwendungen reicht es aus. Es sind auch 3D-Erweiterungen erhältlich!

Die schnellste und einfachste Möglichkeit ist, sofern man nicht Matlab-Plots haben muss, sicherlich die 3. Variante.


Links