Linux. Fehlerbehandlung Sebastian Maier. Aufgabe: concat Übung 7 Anhang

Ähnliche Dokumente
C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

1 Linux-Befehlsübersicht

X Anmelden am System. X System herunterfahren. X Grundlegendes zur Shell. X Das Hilfesystem. X Dateioperationen. X Bewegen im Verzeichnisbaum

Einführung in die C-Programmierung

182. stdio stdio. Eingabe. Ausgabe. Typisch für Zeileneingabe und Analyse: #include <stdio.h>

Linux Prinzipien und Programmierung

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Einführung Unix Shell

Linux I II III Res/Pro WN/TT Theorie Terminal Ein- und Ausgabe. Linux I. 1 Linux I. Theorie Terminal Ein- und Ausgabe. Ressourcen-Vorkurs

Sichere Programmierung in C 296

Wie man eigene Programme erstellt

int ConcatBuffers(char *buf1, char *buf2, size_t len1, size_t len2) {

Dr. Monika Meiler. Inhalt

Sichere Programmierung in C

Einführung in die Angewandte Bioinformatik

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

C/C++-Programmierung

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Zusätzliche Unterlagen

Linux Prinzipien und Programmierung

SCI Linux Einführung

Programmieren in C. Die C-Standardbibliothek. Prof. Dr. Nikolaus Wulff

PIWIN 1 Übung Blatt 5

L A TEX, Linux, Python

Tutorium 1 Systemadministration 2 - Linux Universität Hildesheim

1 Der Editor - eine Geschmacksfrage. 2 Kompilieren: Makefiles und Compiler. 2.1 Makefiles

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++ Dokumentation mit Doxygen

Linux Grundlagen. Wolfgang Scheicher 20. Mai Allgemeines Bootvorgang Verzeichnisstruktur... 2

Systemprogrammierung: Erste Schritte (P) Das Manpage-System (P) Versionsverwaltung mit Subversion (P)

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

C und Linux. Martin Gräfe. Die Möglichkeiten des Betriebssystems mit eigenen Programmen nutzen ISBN Inhaltsverzeichnis

Übung zu Grundlagen der Betriebssysteme. Einführungsveranstaltung

Übung zu Grundlagen der Betriebssysteme. 13. Übung

Linux das bessere Windows?

Material zum Grundlagenpraktikum ITS. eine kleine Linux-Befehlsreferenz. Stand: Oktober 2007 zusammengestellt von: Cornelia Menzel Version 1.

Eprog Starthilfe. 5. Oktober Einleitung 2

TCP/IP Programmierung. C# TimeServer Java6 TimeClient

Übung zu Grundlagen der Betriebssysteme. 3. Übung

Einführung in das wissenschaftliche Rechnen

Linux - a bit advanced

Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging

Seite Seite 2

Linux-Befehlsreferenz

Programmieren mit dem Java-Hamster-Modell. VP Orientierung Informatik WS 2008/09 H.Hagenauer

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Übung 4: Schreiben eines Shell-Skripts

Shell-Programmierung

Zusammenfassung des Handzettels für Programmieren in C

Praktikum ASP Blatt 2 6. LEHRSTUHL FÜR RECHNERTECHNIK UND RECHNERORGANISATION Aspekte der systemnahen Programmierung bei der Spieleentwicklung

Computer Algebra Plan der Vorlesung. erstes Drittel: linux, emacs, L A TEX zweites Drittel: Sage als Taschenrechner letztes Drittel: Python für Sage

Linux/Unix Systemprogrammierung

Erste Schritte mit Eclipse

Praktikum Betriebssysteme 1. Aufgabe (1)

Dateien und Verzeichnisse

LINUX Gesamtmitschrift

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Modellierung und Programmierung

C Überlebenstraining

Lösung Übungszettel 6

Heimetli Software AG HSWModule ... Senden und Empfangen von SMS-Meldungen mit einem GSM-Modul Version

2. Prozesssynchronisation

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization

Einführung Wissenschaftliches Rechnen. René Lamour. Sommersemester 2015

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C

1 Vorbemerkungen. 1.1 Vorraussetzungen und Ziele. 1.3 Homepage. 1.2 Übungsaufgaben. 1.4 Arbeiten am Computer. Es sind keine Vorkenntnisse nötig

Besprechung Aufgabe 5 (crawl) POSIX-Threads. Problem: UNIX-Prozesskonzept ist für viele heutige Anwendungen unzureichend

GCC 3.x Stack Layout. Auswirkungen auf Stack-basierte Exploit-Techniken. Tobias Klein, 2003 Version 1.0

Objektorientiertes Programmieren für Ingenieure

Systemnahe Software WS 2006/2007

Übersicht. Einführung in die Programmierung. Die Standardbibliothek. Ein- und Ausgabe. Ein- und Ausgabe. Dateioperationen.

Literatur. Einführung in Unix. Login. Passwort. Mag. Thomas Griesmayer. Benutzererkennung und Passwort Case-Sensitiv Prompt

Native Zeichenketten (C-Strings)

Eine Einführung in. für mathematisch- technische Assistenten / Informatik (IHK)

Softwareentwicklung 2 (ILV) Übung 1

Technische Praxis der Computersysteme I 3. Vorlesung

Betriebssystem Windows - SSH Secure Shell Client

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Grundlagen. Kapitel 1

Übung: Entwickeln eines Shell-Skripts

Fernwartung des Schulservers übers Internet Anleitung ssh - putty winscp - für Arktur v bzw. v

Kurs 6108 Programmierkurs C++ Wintersemester 2001/02. Prof. R. Schrader. Vorlesung freitags 15:15 16:45 Uhr

LAMP HowTo (Linux Apache MySQL PHP) Zugriff per SSH auf den Server. Servername: gyko.no-ip.info (Lokal: )

Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome

Der MS-DOS Standardmonitor und Debugger DEBUG

Inhaltsverzeichnis. Martin Gräfe. C und Linux. Die Möglichkeiten des Betriebssystems mit eigenen Programmen nutzen ISBN:

Java Programmierung auf der Konsole / unter Eclipse

Primitive Datentypen

Dienstspezifikation nach RFC

Enigma2 Plugin Entwicklung mit Eclipse

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Systemprogrammierung I - Aufgaben zur Erlangung der Klausurzulassung für Informatiker und Wirtschaftsinformatiker

Versionsverwaltung mit Mercurial für Einsteiger

Computergrundlagen Programmieren in C

Update Messerli MySQL auf Linux

GDI-Knoppix Erste Schritte. Werner Siedenburg werner.siedenburg@student.fh-nuernberg.de Stand:

Grundlagen von C. Ausarbeitung von Jonas Gresens

C und Linux HANSER. Martin Gräfe. Die Möglichkeiten des Betriebssystems mit eigenen Programmen nutzen. 3., aktualisierte Auflage

Transkript:

Übungen zu Systemnahe Programmierung in C (SPiC) Sebastian Maier (Lehrstuhl Informatik 4) Übung 7 Sommersemester 2016 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 2 23 Terminal - historisches (etwas vereinfacht) Terminal Arbeiten unter Arbeitsumgebung Manual Pages Als die Computer noch größer waren: Als das Internet noch langsam war: Seriell 1 Netzwerk DFÜ 1 Übungen zu SPiC (SS 2016) Server Farben, Positionssprünge, etc. werden durch spezielle Zeichenfolgen ermöglicht Lehrstuhl Informatik 4 Computer 2 23 Televideo 925 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 3 23

Terminal - Funktionsweise Terminal - Standardkanäle umleiten Drei Standardkanäle für Ein- und Ausgaben stdin Eingaben stdout Ausgaben stderr Fehlermeldungen stdin stdout stderr Prozess Standardverhalten Eingaben kommen von der Tastatur Ausgaben & Fehlermeldungen erscheinen auf dem Bildschirm stdout Ausgabe in eine Datei schreiben 1 find. > ordner.txt stdout wird häufig direkt mit stdin anderer Programme verbunden 1 cat ordner.txt grep tmp wc -l Vorteil von stderr Fehlermeldungen werden weiterhin am Terminal ausgegeben Übersicht > Standardausgabe stdout in Datei schreiben >> Standardausgabe stdout an existierende Dateien anhängen 2> Fehlerausgabe stderr in Datei schreiben < Standardeingabe stdin aus Datei einlesen Ausgabe eines Befehls direkt an einen anderen Befehl weiterleiten Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 4 23 Shell - Wichtige Kommandos Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 5 23 Shell - Programme beenden Wechseln in ein Verzeichnis mit cd (change directory) 1 cd /proj/i4spic/<login>/aufgabex 1 ls Verzeichnisinhalt auflisten mit ls (list directory) Datei oder Ordner kopieren mit cp (copy) 1 cp /proj/i4spic/pub/aufgabex/vorgabe.h /proj/i4spic/<login>/ aufgabex Per Signal: CTRL-C (Kann vom Programm ignoriert werden) Von einer anderen Konsole aus: killall cworld beendet alle Programme mit dem Namen cworld Von der selben Konsole aus: CTRL-Z hält den aktuell laufenden Prozess an killall cworld beendet alle Programme mit dem namen cworld Programme anderer Benutzer dürfen nicht beendet werden fg setzt den angehaltenen Prozess fort Wenn nichts mehr hilft: killall -9 cworld Datei oder Ordner löschen mit rm (remove) 1 rm test1.c 2 # Ordner mit allen Dateien löschen 3 rm -r aufgabe1 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 6 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 7 23

Arbeitsumgebung Übersetzen & Ausführen Unter : Kate, gedit, Eclipse cdt, Vim, Emacs,... Zugriff aus der Windows-Umgebung über SSH (nur Terminalfenster): Editor unter via SSH: mcedit, nano, emacs, vim Editor unter Windows: AVR-Studio ohne Projekt Notepad++ Dateizugriff über das Netzwerk Übersetzen und Test unter (z.b. via Putty) Programm mit dem GCC übersetzen 2 1 gcc -pedantic -Wall -Werror -O2 -std=c99 -D_XOPEN_SOURCE=500 -o cworld cworld.c Aufrufoptionen des Compilers, um Fehler schnell zu erkennen -pedantic liefert Warnungen in allen Fällen, die nicht 100% dem verwendeten C-Standard entsprechen -Wall warnt vor möglichen Fehlern (z.b.: if(x = 7)) -Werror wandelt Warnungen in Fehler um -O2 führt zu Optimierungen des Programms -std=c99 setzt verwendeten Standard auf C99 -D_XOPEN_SOURCE=500 fügt unter anderem die POSIX Erweiterungen hinzu, die in C99 nicht enthalten sind -o cworld legt Namen der Ausgabedatei fest (Standard: a.out) Ausführen des Programms mit./cworld 2 Abgaben werden von uns mit diesen Optionen getestet Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 8 23 Manual Pages Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 9 23 Das -Hilfesystem aufgeteilt nach verschiedenen Sections 1 Kommandos 2 Systemaufrufe 3 Bibliotheksfunktionen 5 Dateiformate (spezielle Datenstrukturen, etc.) 7 verschiedenes (z.b. Terminaltreiber, IP,... ) man-pages werden normalerweise mit der Section zitiert: printf(3) 1 # man [section] Begriff 2 man 3 printf Suche nach Sections: man -f Begriff Suche von man-pages zu einem Stichwort: man -k Stichwort Bibliotheksfunktionen Kommandozeilenparameter Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 10 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 10 23

Fehlerursachen Fehler können aus unterschiedlichsten Gründen im Programm auftreten Systemressourcen erschöpft malloc(3) schlägt fehl Fehlerhafte Benutzereingaben (z.b. nicht existierende Datei) fopen(3) schlägt fehl Transiente Fehler (z.b. nicht erreichbarer Server) connect(2) schlägt fehl Gute Software erkennt Fehler, führt eine angebrachte Behandlung durch und gibt eine aussagekräftige Fehlermeldung aus Kann das Programm trotz des Fehlers sinnvoll weiterlaufen? Beispiel 1: Ermittlung des Hostnamens zu einer IP-Adresse für Log : IP-Adresse im Log eintragen, Programm läuft weiter Beispiel 2: Öffnen einer zu kopierenden Datei schlägt fehl : Kopieren nicht möglich, Programm beenden Oder den Kopiervorgang bei der nächsten Datei fortsetzen Entscheidung liegt beim Softwareentwickler Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 11 23 Fehler in Bibliotheksfunktionen Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 12 23 Erweiterte Fehler treten häufig in Funktionen der C-Bibliothek auf erkennbar i.d.r. am Rückgabewert (Manpage!) Fehlerursache wird meist über die globale Variable errno übermittelt Bekanntmachung im Programm durch Einbinden von errno.h Bibliotheksfunktionen setzen errno nur im Fehlerfall Fehlercodes sind immer > 0 Fehlercode für jeden möglichen Fehler (siehe errno(3)) Fehlercodes können mit perror(3) und strerror(3) ausgegeben bzw. in lesbare Strings umgewandelt werden 1 char *mem = malloc(...); /* malloc gibt im Fehlerfall */ 2 if(null == mem) { /* NULL zurück */ 3 fprintf(stderr, "%s:%d: malloc failed with reason: %s\n", 4 FILE, LINE -3, strerror(errno)); 5 perror("malloc"); /* Alternative zu strerror + fprintf */ 6 exit(exit_failure); /* Programm mit Fehlercode beenden */ 7 } Signalisierung von Fehlern normalerweise durch Rückgabewert Nicht bei allen Funktionen möglich, z.b. getchar(3) 1 int c; 2 while ((c=getchar())!= EOF) {... } 3 /* EOF oder Fehler? */ Rückgabewert EOF sowohl im Fehlerfall als auch bei End-of-File Erkennung im Fall von I/O-Streams mit ferror(3) und feof(3) 1 int c; 2 while ((c=getchar())!= EOF) {... } 3 /* EOF oder Fehler? */ 4 if(ferror(stdin)) { 5 /* Fehler */ 6... 7 } Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 13 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 14 23

Kommandozeilenparameter 1... 2 int main(int argc, char *argv[]){ 3 strcmp(argv[argc - 1],... ) 4... 5 return EXIT_SUCCESS; 6 } Übergabeparameter: main() bekommt vom Betriebssystem Argumente argc: Anzahl der Argumente argv: Vektor aus Strings der Argumente (Indices von 0 bis argc-1) Rückgabeparameter: Rückgabe eines Wertes an das Betriebssystem Zum Beispiel Fehler des Programms: return EXIT_FAILURE; Aufgabenstellung Dynamische Speicherverwaltung Umgang mit Strings Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 15 23 Zusammensetzen der übergebenen Kommandozeilenparameter zu einer Gesamtzeichenfolge und anschließende Ausgabe Bestimmung der Gesamtlänge Dynamische Allokation eines Buffers Schrittweises Befüllen des Buffers Ausgabe der Zeichenfolge auf dem Standardausgabekanal Freigabe von dynamisch allokiertem Speicher Implementierung eigener Hilfsfunktionen: 1 size_t str_len(const char *s) 2 char *str_cpy(char *dest, const char *src) 3 char *str_cat(char *dest, const char *src) Wichtig: Korrekte Behandlung von Fehlern (!) Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 15 23 Dynamische Speicherverwaltung 1 void *malloc(size_t size); 2 void free(void *ptr); malloc(3) allokiert Speicher auf dem Heap reserviert mindestens size Byte Speicher liefert Zeiger auf diesen Speicher zurück malloc(3) kann fehlschalgen Fehlerüberprüfung notwendig 1 char* s = (char *) malloc(strlen(...) + 1); 2 if(s == NULL){ 3 perror("malloc"); 4 exit(exit_failure); 5 } Speicher muss später mit free(3) wieder freigegeben werden 1 free(s); Was ist ein Segfault? Zugriff auf Speicher der dem Prozess nicht zugeordnet ist Speicher der reserviert ist Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 16 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 17 23

Umgang mit Strings (1) Umgang mit Strings (2) "hallo" h a l l o \0 Repräsentation von Strings Zeiger auf erstes Zeichen der Zeichenfolge null-terminiert: Null-Zeichen kennzeichnet Ende strlen(s)!= Speicherbedarf printf(3) Formatierungsstrings %s String %d Dezimalzahl %c Character %p Pointer... size_t strlen(const char *s) Bestimmung der Länge einer Zeichenkette s (ohne abschließendes Null-Zeichen) Rückgabewert: Länge Dokumentation: strlen(3) char *strcpy(char *dest, const char *src) Kopieren einer Zeichenkette src in einen Buffer dest (inkl. Null-Zeichen) Rückgabewert: dest Dokumentation: strcpy(3) Gefahr: Buffer Overflow ( strncpy(3)) char *strcat(char *dest, const char *src) Anhängen einer Zeichenkette src an eine existierende Zeichenkette im Buffer dest (inkl. Null-Zeichen) Rückgabewert: dest Dokumentation: strcat(3) Gefahr: Buffer Overflow ( strncat(3)) Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 18 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 19 23 Arbeiten im Terminal Arbeiten im Terminal Debuggen Valgrind Navigieren & Kopieren: 1 cp /proj/i4spic/pub/aufgabex/vorgabe.h /proj/i4spic/<login>/ aufgabex 2 # oder 3 cd /proj/i4spic/<login>/aufgabex 4 cp /proj/i4spic/pub/aufgabex/vorgabe.h. Kompilieren: 1 gcc -pedantic -Wall -Werror -O2 -std=c99 -D_XOPEN_SOURCE=500 -o cworld cworld.c Bereits eingegebene Befehle: Pfeiltaste nach oben Besondere Pfadangaben:. aktuelles Verzeichnis.. übergeordnetes Verzeichnis Home-Verzeichnis des aktuellen Benutzers Eine Verzeichnisebene nach oben wechseln: cd.. Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 19 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 20 23

Debuggen Valgrind 1 gcc -g -pedantic -Wall -Werror -O0 -std=c99 -D_XOPEN_SOURCE=500 - o cworld cworld.c -g aktiviert das Einfügen von Debug-Symbolen -O0 deaktiviert Optimierungen Standard-Debugger: gdb 1 gdb./cworld schönerer Debugger: cgdb 1 cgdb --args./cworld arg0 arg1... Kommandos b(reak): Breakpoint setzen r(un): Programm bei main() starten n(ext): nächste Anweisung (nicht in Unterprogramme springen) s(tep): nächste Anweisung (in Unterprogramme springen) p(rint) <var>: Wert der Variablen var ausgeben Debuggen ist (fast immer) effizienter als Trial-and-Error! Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 21 23 Informationen über: Speicherlecks (malloc/free) Zugriffe auf nicht gültigen Speicher Ideal zum Lokalisieren von Segmentation Faults (SIGSEGV) Aufrufe: valgrind./cworld valgrind --leak-check=full --show-reachable=yes --track-origins =yes./cworld Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 22 23 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 22 23 Passwortgeschütztes Programm 1 # Usage:./print_exam <password> 2 $./print_exam spic 3 Correct Password 4 Printing exam... Ungeprüfte Verwendung von Benutzereingaben Buffer Overflow 1 long check_password(const char *password) 2 char buff[8]; 3 long pass = 0; 4 5 strcpy(buff, password); // buffer overflow 6 if(strcmp(buff, "spic")!= 0){ 7 pass = 1; 8 } 9 return pass; 10 } Mögliche Lösungen Prüfen der Benutzereingabe und/oder dynamische Allokation des Buffers Sichere Bibliotheksfunktionen verwendeten z. B. strncpy(3) Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2016) 23 23