• Keine Ergebnisse gefunden

Nutzung von Environment-Variablen

Im Dokument Benutzerhandbuch EMS-Graphenlabor V. (Seite 39-44)

2.2 Ubersetzen und Binden von Anwendungssoftware

2.3 Nutzung von Environment-Variablen

Das Verhalten des Graphenlabors wird durch einige Environment-Variable beeinut.

Z.B. existiert eine Variable

G NMAX

, die angibt, wieviele Knoten ein Graph zunachst enthalten kann. Falls diese Variable nicht deniert sind, wird mit Defaultwerten gearbei-tet. Die Defaultwerte sind als Konstante gleichen Namens in graphconfig.h deniert.

Welche Variablen durch diesen Mechanismusbehandelt werden und welche Bedeutung sie haben, kann man Anhang D, S. 90 entnehmen.

2.4 Meldungen

Die Funktionen des EMS-Graphenlabor erzeugen Warn- bzw. Fehlermeldungen auf dem Standardfehlergerat stderr, sofern sie eine unerwartete oder eine Fehlersituation er-kennen. Dies ist z.B. der Fall, wenn eine Datei nicht geonet werden oder der Inhalt einer Datei nicht interpretiert werden kann. SofernChecking (siehe Abschnitt 2.6, S. 43) eingeschaltet ist, erzeugen Graphenlaborfunktionen auch bei oensichtlich unsinnigen Parametern Fehlermeldungen.

Die Meldungen werden in drei Klassen eingeteilt:

Warnungen werden bei unerwarteten Situationen ausgegeben, die jedoch nicht notwen-digerweise einen Fehler darstellen.

Fehlermeldungen werden in Fehlersituationen ausgegeben, in denen das System evtl.

noch sinnvoll die Abarbeitung fortsetzen kann. Diese Fehlersituationen werden in der statischen Variable

G msg::errorCount

gezahlt und das Programm solange fortgesetzt, bis eine maximale Fehlerzahl (in der statischen Variable

G msg::max-ErrorCount

, initialisiert mit der Environment-Variable

G MaxError

) erreicht ist. Dann wird das Programm (mit exit(1)) abgebrochen.

39

fatale Fehlermeldungen treten auf, wenn die Fehlersituation so schwerwiegend ist, da die Fortsetzung des Programms wahrscheinlich sinnlos ist. In diesem Fall wird das Programm unverzuglich (mit exit(2)) abgebrochen.

Jede Fehlermeldung besteht aus folgenden Teilen:

die Art (Warnung, Fehler oder fataler Fehler) des Fehlers

die Funktion, die die Fehlersituation erkannt hat

die Beschreibung der Fehlersituation (dazu konnen evtl. aktuelle Parameter der die Fehlersituation feststellenden Funktion zahlen)

das Verhalten des Programms in dieser Fehlersituation

eine Empfehlung, wie diese Fehlersituation vermieden werden kann

Eine Meldung wird durch eine Modulbezeichnung17 und eine Fehlernummer identi-ziert. Dadurch wird es ermoglicht, dieselben Nummern in unterschiedlichen Moduln fur unterschiedliche Fehler zu verwenden.

Versucht man zum Beispiel, einen Knoten mit einer bereits vergebenen Identikati-onsnummer zu erzeugen, gibt das Labor folgende Fehlermeldung aus:

****** ERROR grf002 in G_graph::createVertex(1)

****** Condition found : vertex 1 already exists

****** Action taken : no vertex created, G_VertexNull returned

****** Reaction proposed: use unique numbers

Die erste Zeile gibt die Fehlerart (hier: ERROR), die den Fehler feststellende Funktion (G graph::createVertex) sowie Modulbezeichnung (grf) und Fehlernummer (002) an.

Die zweite Zeile beschreibt das Verhalten des Systems, namlich den Abbruch der Funktion mit dem Ruckgabewert

G VertexNull

. Die dritte Zeile gibt eine Empfehlung, wie dieser Fehler zu vermeiden ist: man sollte eindeutige Identikationsnummern verwenden.

Die Texte aller Fehlermeldungen sind nicht im Quelltext des Graphenlabors fest vor-gegeben. Die fur alle Meldungen gleichen Texte (also hier "****** ERROR\, "******

Condition found : \, "****** Action taken : \ und "****** Reaction proposed:

\) sowie das Format (gema printf), in dem Fehlermeldungsdatei, Fehlernummer und Funktion ausgegeben werden (" %s%3d in %s\), werden der Datei msgems in einem der in der Environmentvariable

G MsgLibs

angegeben Verzeichnisse entnommen. Mit der Methode

G msg::addDirectory

konnen weitere Verzeichnisse angegeben werden. Die fur den Fehler spezischen Texte (diese enthalten je nach Fehler ebenfalls Formatangaben gema printf fur die Ausgabe von Parametern etc.) benden sich in einer der Dateien

msgmodule (im Beispiel also msggrf). Jedes Modul hat also eine eigene Fehlermeldungs-datei. Dort werden die Texte anhand der Fehlernummer (im Beispiel 2) gesucht. Zum Format dieser Dateien siehe Anhang C.3, S. 87.

17Unter einem Modul ist hier (nur) eine logisch zusammenhangende Menge von Funktionen und Metho-den zu verstehen.

40

Sollen die Meldungen in einer anderen Sprache als Englisch erfolgen, sind die Texte in diesen Dateien entsprechend zu andern oder ein Verzeichnis mit entsprechenden geander-ten Dateien in der Environment-Variable

G MsgLibs

anzugeben.

Das Graphenlabor stellt dem Benutzer Funktionen zur Verfugung, mit denen er in sei-nem Programm Meldungen in analoger Weise erzeugen kann. Zu Details siehe Abschnitt 8.2, S. 75.

2.5 Tracing

Das Graphenlabor enthalt einige Funktionen und Makros, die eine Laufzeitverfolgung (im weiteren nur Tracing genannt) einer EMS-Anwendung wahrend ihrer Entwicklung ermoglichen. Einige Funktionen geben dann zur Laufzeit in eine Datei aus, in welcher Reihenfolge sie mit welchen Parametern in welcher Schachtelungstiefe aufgerufen werden und welchen Wert sie zuruckgeben. Dabei ist zu beachten, da jeweils fur alle Funktionen, die in derselben Quelltextdatei xxx.c deniert sind, nur zusammen Tracing ein- bzw.

ausgeschaltet werden kann.

2.5.1 Wie kann Tracing eingeschaltet werden ?

Zunachst mu die Anwendung, fur die Tracing genutzt werden soll, mit der Bibliothek

libgraphUdebug.a gebunden werden (siehe Abschnitt 2.2.2, S. 39). Dann kann mit der Methode

G trace::set

fur einzelne Quelltextdateien Tracing ein bzw. ausgeschaltet werden. Die Methode erwartet einen Dateinamen (Der Name darf auch die ublichen Jo-kerzeichen "*\ fur beliebige Zeichenfolgen und "?\ fur ein beliebiges Zeichen enthalten) und einen logischen int-Wert. Ist derint-Wert gleich true, wird Tracing fur den oder die angegebenen Quelltextdateien ein-, andernfalls ausgeschaltet. Mit einer gleichnami-gen Methode mit nur einem logischen int-Parameter kann Tracing auch ganz aus- bzw.

eingeschaltet werden.

Die Tracing-Ausgaben konnen mit der Methode

G trace::setFile

auch in eine Datei umgeleitet werden.

2.5.2 Wie konnen Funktionen Tracing-fahig programmiert werden ?

Das Graphenlabor stellt (ubergraph.h) die Makros

G TrcDeclaration

,

G trcEnter

,

G trcLeave

und

G trc

zur Verfugung. Das Makro

G TrcDeclaration

deniert lokal in der .c-Datei ein Steuerobjekt, in dem zur Laufzeit festgehalten wird, ob Tracing fur diese Quelltext-Datei ein- oder ausgeschaltet ist.

Die ubrigen Makros werden mit einem Stuck C-Code verwendet: G trcEnter( code-Fragment),G trcLeave(codeFragment) bzw. G trcEnter(codeFragment). Die Makros testen dann zur Laufzeit, ob momentan Tracing fur die aktuelle Funktion (bzw. die Quell-textdatei, in der diese deniert wird) eingeschaltet ist. Ist dies der Fall, werden gema der Schachtelungstiefe von Funktionsaufrufen viele Einruckungszeichen in die Tracing-Datei ausgegeben und dann werden die incodeFragment angegeben C-Anweisungen ausgefuhrt (Dies werden in der Regel Ausgabeanweisungen in den Tracing-Stream sein, der uber die

41

Zeigervariable

G trace::out

vom Typ ostream * erreicht wird.) Zusatzlich verwalten

G trcEnter und G trcLeave noch einen internen Zahler fur die Schachtelungstiefe.

Dazu ein Beispiel:

Gegeben sei folgende Funktion exampleFunc:

G_TrcDeclaration ...

int exampleFunc ( int x, char *txt) {

int result;

FILE *fp;

G_trcEnter( *G_Trace.out << "exampleFunc("

<< x << ", " << txt

<< ')'; ) ...

name="xyz.dat";

fp=fopen(name, flags);

if (fp==NULL) {

G_trc( *G_Trace.out << "cannot open file \""

<< name << '"'; ) }

...

result = ... ;

G_trcLeave( *G_Trace.out << result; ) }

Wenn Tracing fur diese Funktion eingeschaltet ist und sie in der Schachtelungs-tiefe 3 mit den Parametern x=4, txt="abcdef" aufgerufen wird, die Datei

xyz.datnicht onen kann und den Wertresult=12berechnet, werden in die Tracing-Datei folgende Ausgaben geschrieben:

| | | exampleFunc(4, abcdef))

| | | | cannot open file "xyz.dat"

| | |

->12<-Um bei voll ausgetesteten und fur fehlerfrei befundenen Anwendungen volle Ausfuh-rungsgeschwindigkeit zu erreichen, ist es nicht notwendig, alle Tracing-Makros aus den Quelltexten zu entfernen. Es genugt, alle Quelltexte mit der zusatzlichen Denition

NO TRC zu ubersetzen (siehe Abschnitt 2.2.1, S. 38). Dann loscht der Praprozessor alle Tracing-Makros, so da zur Laufzeit in Bezug auf Tracing nichts mehr geschieht.

42

2.6 Checking

Um den Benutzer des Graphenlabor die Entwicklung seiner Anwendung zu erleichtern, pruft nahezu jede Laborfunktion ihre Aufrufparameter hinsichtlich ihrer Plausibilitat und erzeugt ggf. Fehlermeldungen. Damit Checking durchgefuhrt werden kann, mu die Anwendung mit der Bibliotheksversion liblabdebug.a gebunden werden. Checking ist dann eingeschaltet, kann aber zur Laufzeit uber die globale, logische Variable

G Chk

vom Typ int mit dem Wert falseaus- und mit dem Wert true eingeschaltet werden.

In eigenen Modulen kann derselbe Checking-Mechanismus verwendet werden. Dazu mussen die Prufanweisungen mit dem Makro

G chk

eingeklammert werden:

/* "normale" Anweisungen ...

*/

G_chk(

/* checking Anweisungen */

...

)

/* weitere normale Anweisungen */

...

*/

Das Makro

G chk

ist in graph.h deniert und sorgt dafur, da die geklammerten Anweisungen nur dann ausgefuhrt werden, wenn die Variable

G Chk

mit einem Wert

6= 0 belegt ist. Die geklammerten Anweisungen konnen mittels bedingter Compilierung geloscht werden, falls der Quelltext mit der Compileroption-DNO CHK ubersetzt wird, so da dann in Bezug auf Checking zur Laufzeit nichts mehr geschieht.

43

Im Dokument Benutzerhandbuch EMS-Graphenlabor V. (Seite 39-44)