Inhalt
• Anlass | Was mich denn umtrieb ... |
• Entwurf | Was kann man machen? |
• Einsatz | Wie mache ich es? |
• Einblick | Wie sieht die Benutzerschnittstelle aus? |
• Quellcode | Der Ada-Quellcode als GPS-Projekt |
Anlass
Was mich denn umtrieb ...
Ich suchte ein einfach einzusetzendes Hilfsmittel, mit dem ich in echtzeitnahen Programmen etwa bei der Fehlersuche Daten sammenln kann, um diese dann (oft) fix mit Excel auszuwerten.
So brachte ein Kollege einmal CentOS ins Haus - als Kandidat für den Ersatz eines proprietären Betriebssystems. Ich wollte wissen, wie stabil eine 10ms-Schleife über Nacht denn unter CentOS läuft.
Ein Einsatzfall für mein Logs_To_Ram. Ich protokollierte über Nacht die Ausreißer und hatte am Morgen das Ergebnis - ein Ausreißer um 21 Uhr, ein famoses Ergebnis. Ein normales Suse-Linux verhielt sich da wesentlich unruhiger.
Entwurf
Was kann man machen?
Das Werkzeug stellt 5 Puffer bereit, die Zahl der Puffer kann ohne weiteres erhöht werden - so steht etwa für jede Anwendertask ein Puffer zur Verfügung, oder aber auch für unterschiedliche Daten auch unterschiedliche Puffer.
Für die Puffer verwende ich die ‘Booch'schen Collections’.
Die Daten werden als Zeichenketten, getrennt mit einem Trenner, hier das Zeichen '|', in die Puffer geschrieben. Auf Befehl werden schließlich die Pufferinhalte - samt Puffernummer und Eingangsreihenfolge - zeitlich sortiert in eine Datei geschrieben.
Bei meinem oben erwähnten CentOS Testlauf wartete die Haupttask einfach vor einem 'Ada.Text_IO.Skip_Line' auf einen Tastendruck, woraufhin die Schreibprozedur ausgeführt wurde.
Das Werkzeug erwartet im Programmverzeichnis eine kleine cfg-Datei, in der ich Puffer ein- oder abschalten kann. Ist die cfg-Datei nicht vorhanden, wird auch nicht geloggt.
Einsatz
Wie mache ich es?
Zwei Möglichkeiten hat man: Man kann eine Zeichenkette als Ganzes sofort in einen Puffer schreiben, oder man sammelt sich die Zeichenkette erst aus Teilketten zusammen, um erst am Ende in den Puffer zu schreiben. Die Zeilen
i1:=123;
f2:=4.56789;
Do_Log_To_Ram (1, Str (i1) & Str (f2));
schreiben die aufgeführten Zahlen mitsamt
dem Trennzeichen in den Puffer '0', die Funktionen 'Str'
sind Hilfsroutinen. Eine Zeile wird nach 240
Zeichen abgeschnitten.
Nun die Ausgabe einer Zeile in zwei Teilen
Float_Array := (1.234, 10000.0, -200.0003);
Append_To_Log_Item (2, Put_Floating_Constrained_Array
(Float_Array));
Append_To_Log_Item (2, Sep & "an array");
Do_Log_Item_To_Ram (2);
Put_Floating_Constrained_Array ist die Ausprägung einer
generischen Hilfsroutine,
die Funktion Sep gibt einfach das Zeichen '|' zurück.
Die Prozedur
Save_Logs_To_File;
schreibt die Pufferinhalte schließlich in eine Datei,
die im Programmverzeichnis
abgelegt wird. Man kann auch ein wenig filtern:
Do_Log_To_Ram (1, "5a- abcdefghi", "def");
Do_Log_To_Ram (1, "5b- abcdefghi", "345");
Im zweiten Fall (5b) wird nichts in den Puffer geschrieben,
weil das vorgegebene Muster "345" nicht
in der Nutz-Zeichenkette enthalten ist. Weitergehendes Filtern
mit einfachen regulären Ausdrücken
ist über ein Ergänzungspaket möglich, hierzu wird ein GNAT-Paket
verwendet, in dem die Regeln knapp erläutert werden. Im Beispiel
sähe das so aus:
Re.Compile (Pos => 3, P => "[a-z]+");
Append_To_Log_Item (3, "14- ");
Re.Append_To_Log_With_Re (3, "match: ", "noarray");
Do_Log_Item_To_Ram (3);
Append_To_Log_Item (3, "15- ");
Re.Append_To_Log_With_Re (3, "no match: ", "12346789");
Do_Log_Item_To_Ram (3);
Ergebnis
Nachfolgend ein Ausschnitt der Ausgaben meines wüsten Testprogramms, die Zeilen habe ich gekürzt. Jede Zeile beginnt mit zwei Zeitstempeln, es folgt der Puffername und eine laufende Nummer für jeden Puffereintrag.
09:53:31,455|35611,455206|0_Buff|1|123456789
09:53:31,455|35611,455218|0_Buff|2|abcdefghi
09:53:31,455|35611,455220|1_Buff|2|123456789
09:53:31,455|35611,455220|1_Buff|3|abcdefghi
09:53:31,455|35611,455221|1_Buff|4|abcDEFghi
09:53:31,455|35611,455231|1_Buff|7|123|4,56789E+00|
09:53:31,455|35611,455237|0_Buff|3|1,23400E+00|1,00000E+04|-2,00000E+02|
09:53:31,455|35611,455247|2_Buff|1|1,23400E+00|1,00000E+04|-2,00000E+02||
09:53:31,455|35611,455250|2_Buff|2|1,23400E+00|1,00000E+04|-2,00000E+02||
Quellcode
• Logs-To-Ram - der vollständige Ada-Quellcode als GPS-Projekt, gezippt