Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB...
-
Upload
alois-altermatt -
Category
Documents
-
view
106 -
download
0
Transcript of Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB...
![Page 1: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/1.jpg)
Programmieren in C
Signale, Bitfelder, UnionenFehler, Debugging, Profiling
Hochschule Fulda – FB AI
Sommersemester 2013/14
http://c.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, DVZ
![Page 2: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/2.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Signale 1
• Signal Systemnachricht an einen Prozess• vergleichbar mit einem Interrupt• ausgelöst z.B. vom Nutzer ...
– Abbruch (Ctrl-C, SIGINT)– Programmstop (SIGKILL)
• ... oder vom System– Timer (SIGALRM)– Programmende (SIGTERM)
• #include <signal.h>
![Page 3: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/3.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Signale 2
• einige Signale:– SIGINT – Unterbrechung (meist Ctrl-C)– SIGHUP – Programmende– SIGKILL – Programm beenden– SIGALRM – Timer abgelaufen
• Signale können abgefangen werden:
void handler(int sig) { ...}...signal(SIGALRM, handler);
![Page 4: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/4.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Signale 3
• signal.c
![Page 5: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/5.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Signale 4
• Timerfunktionen• alarm(int nsec)• löst nach nsec Sekunden ein Signal SIGALRM aus:void alrmhandler() { printf("SIGALRM!\n");}...signal(SIGALRM, alrmhandler);alarm(5);...
![Page 6: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/6.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Signale 5
• alarm.c
![Page 7: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/7.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Signale 6
• Feinere Auflösung mit Intervall-Timer• #include <sys/time.h>• Datentypenstruct timeval { time_t tv_sec; /* Sekunden */ suseconds_t tv_usec; /* Microsek. */};struct itimerval { struct timeval it_interval; struct timeval it_value;};
![Page 8: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/8.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Signale 7
• Funktionensetitimer(int w, struct itimerval *v, struct itimerval *ov)getitimer(int w, struct itimerval *v)
• Werte für wITIMER_REAL Systemuhr/-zeitITIMER_VIRTUAL Prozesszeit
• Beispiel:struct itimerval it;it.it_value.tv_sec = 2; /* 2 Sek. */it.it_value.tv_usec = 0; /* Start */it.it_interval.tv_sec = 0; /* 0,5 Sek */ it.it_interval.tv_usec = 500000; /* Interv. */setitimer(ITIMER_REAL, &it, NULL);
![Page 9: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/9.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Bitfelder 1
• Bitfelder Elemente vom struct-Typ• Einzelelemente: int oder unsigned int • gedacht für hardwarenahe Programmierung• Problem: compilerabhängig nicht portabel!• Beispiel:
typedef struct _iodev { /* Bitfeld */ unsigned int rflag:1; /* 1 Bit: Writeflag */ unsigned int wflag:1; /* 1 Bit: Readflag */ unsigned int d1:2; /* Dummy */ unsigned int type:2; /* 2 Bit: Geraetetyp */ unsigned int d2:2; /* Dummy */ unsigned int data:8; /* 8 Bit: Datenbyte */} iodev;
![Page 10: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/10.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Bitfelder 2
• Speicherung eines Bitfelds
![Page 11: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/11.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Bitfelder 3
• bitfeld.c
![Page 12: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/12.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Unionen 1
• union: spezielle Art von struct• anderer Name: varianter Rekord• Speichern der Elemente in union nicht
nacheinander, sondern übereinander• union-Elemente teilen sich Speicherplatz• sinnvoll bei gleichartigen Objekten, die aber
verschiedenen Typs sein können
union { /* Union: */ char c; /* char */ short s; /* short */ int i; /* int */} u; /* teilen sich Platz */
![Page 13: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/13.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Unionen 2
• Speicherung von struct und union
![Page 14: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/14.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Unionen 3
• union.c
![Page 15: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/15.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Unionen 4
• union oft Element in einem struct• Typ des Elements in union muss definiert
sein eigenes Typelement im struct• Beispiel
struct number { /* Struct Zahl */ byte typ; /* Typ union-Element */ union { /* Union: */ byte b; /* byte */ short s; /* short */ int i; /* int */ } u; };
![Page 16: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/16.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Unionen 5
• Zugriff auf union:
struct number n;...
switch(n.typ) { case BYTE: dobyte(n.u.b); break; case SHORT: doshort(n.u.s); break; case INT: doint(n.u.i); break;}
![Page 17: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/17.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Unionen 6
• Beispiel: mydraw4.c#define LINE 0x01 /* Typ Linie */#define RECT 0x02 /* Typ Rechteck */ #define CIRCLE 0x04 /* Typ Kreis */ ... typedef struct _obj { /* Objekt allgemein */ int n; /* Objektnummer */ int f; /* Loeschflag */ int t; /* Typ des Objekts */ union { line l; /* Linie */ rect r; /* Rechteck */ circle c; /* Kreis */ } o;} object;
![Page 18: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/18.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
Unionen 7
• mydraw4.c
![Page 19: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/19.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Syntaxfehler 1
• C hat kein sinnvolles error recovery eine sehr schlechte Fehlerbehandlung beim
Übersetzen nach Auftreten von Syntaxfehlern• der C-Compiler setzt nach einem Fehler nicht
neu auf und tut so, als ob es keinen Fehler gegeben hat, sondern produziert eine Anzahl, manchmal eine wahre Fülle von Folgefehlern
tatsächliche Fehler oft schwer zu finden Fehlererkennung und –korrektur mühsam
![Page 20: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/20.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Syntaxfehler 2
• treten nur ein oder ganz wenige Fehler auf Fehlersuche in oder vor der Zeile, die in der Fehlermeldung angegeben ist
• treten viele und oft unsinnig erscheinende Fehler auf Fehlersuche im Umfeld vor der Zeile, die in der Fehlermeldung angegeben ist dann erneut kompilieren
• ... oder viel Glück!!
![Page 21: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/21.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
Laufzeitfehler 1
• oft ist es mühsam, Syntaxfehler zu finden • noch mühsamer Laufzeitfehler finden• intuitives Herangehen: zusätzliche Ausgaben
in den Programmtext einstreuen• ggfs. mit CPP-Direktiven#ifdef DEBUGprintf("copy: %p %p\n", s1, s2);#endif
• übersetzen dann mitgcc –DDEBUG file.c
![Page 22: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/22.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Laufzeitfehler 2
• debug1.c
![Page 23: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/23.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Laufzeitfehler 3
• debug2.c - debug1.c mit CPP-Direktiven
![Page 24: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/24.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Laufzeitfehler 4
• das Verfahren ist mühsam und zeitaufwendig• Alternative Debugger nutzen• Debugger: Werkzeug, unter dessen Kontrolle
ein Programm gestartet und während des Programmslaufs untersucht werden kann
• für gcc (und CodeBlocks) Debugger gdb• Kode muss für Debugging instrumentiert
werden: gcc –g file.c –o file• dann Debugger aufrufen:gdb file
![Page 25: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/25.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Laufzeitfehler 5
• gdb – interaktive Shell mit vielen schönen Features
• innerhalb CodeBlocks weitgehend durch die grafische Oberfläche angesteuert
• wichtige Kommandos– help– help topic– run
• wenn das Programm läuft, alles ok!• bei Fehlern ???
![Page 26: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/26.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Laufzeitfehler 6
• Wichtige Mechanismen• Breakpoints – Unterbrechung an definierten
Stellen (z.B. Zeilennummer, Funktion)– break file.c:12– break func
• Watchpoints – Unterbrechung bei Änderung des Werts einer Variablen– watch varname
• Anzeigen von Variablenwerten– print varname
![Page 27: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/27.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Laufzeitfehler 7
• Breakpoint setzen und starten– break func– run
• Unterbrechung bei Breakpoint– print varname– continue
• schrittweises Vorgehen– step
• Debugger beenden– quit
![Page 28: Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling Hochschule Fulda – FB AI Sommersemester 2013/14 Peter.](https://reader036.fdocuments.net/reader036/viewer/2022081518/55204d8049795902118d3058/html5/thumbnails/28.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Profilanalyse
• oft notwendig: Laufzeitverhalten von Programmen zu überprüfen– wo wird die Laufzeit verbraucht?– wo ist Optimierung notwendig / möglich?
Profilanalyse des Programms• Instrumentierung mit -pg bei Neucompilieren
gcc -pg prog.c -o prog
• Starten des Programms gmon.outprog
• Profilanalyse mit gprof, prog, gmon.outgprof prog