Einleitung

Der Brick-Debugger unterstützt den Entwickler von Bricks mit einer Reihe von Werkzeugen, um ihm die Arbeit bei der Erstellung und Fehlersuche zu erleichtern:

  • Direkter Aufruf von Bricks und Ordnern, optional mit Parametern.
  • Anzeige des generierten HTML Codes eines Bricks.
  • Speichern und Verwalten von benutzerbezogenen Aufrufkonfigurationen.
  • Setzen von Breakpoints im Brick und Schrittweises abarbeiten des Bricks.
  • Analyse von Feldern und Datenobjekten während der Brickausführung.

Das Debugger-Fenster gliedert sich in zwei Hauptbereiche. Oben sind zwei Tabreiter "Ausführen" und "Debugger". Unten ist der Bereich für die Brickausgabe.

Im Folgenden werden die einzelnen Möglichkeiten erläutert.

Aufgerufen wird das Debuggerfenster mit der URL

 

http://localhost:7090/dle/ide/rest/debug/brick

Host und Port sind natürlich der entsprechenden Installation anzupassen.

Das Debugger Fenster kann auch über das IDE Menü geöffnet werden:

Neu ist auch die Möglichkeit, das Fenster über den Editor zu öffnen:

Über den Startknopf wird das Debugger Fenster geöffnet und der Brick gestartet. Ist im aktuellen Brick ein Breakpoint gesetzt, ist der "Debugger" Tab aktiv, sonst der "Ausführen" Tab. Über das Käfer Symbol wird nur das Debugger Fenster geöffnet, mit dem "Debugger" Tab auf aktiv. Der Brick wird aber nicht gestartet.

Bricks und Ordner aufrufen

Das Tab-Fenster "Ausführen", um Bricks und Ordner auszuführen gliedert sich in 2 Bereiche: Links die Auswahliste der Konfigurationen und rechts die Konfigurationseinstellungen:

Wenn man links eine Konfiguration wählt, werden die Konfigurationsparameter rechts aktualisiert.

Über die Toolbar lassen sich die Konfigurationen verwalten. Geänderte Konfigurationen können gespeichert werden, neue hinzugefügt werden, bestehende können dupliziert werden, oder auch gelöscht werden. Über das Start- und Stop Icon werden die Konfigurationen gestartet bzw. gestoppt werden.

Startet man einen Brick direkt aus dem Brickeditor, wird automatisch eine Konfiguration für den Brick angelegt und gestartet, falls es noch keine gibt. Falls es schon eine gibt, wird diese (bzw. die erste, die gefunden wird) gestartet.

Grundsätzlich gibt es zwei Arten des Aufrufs: Brickaufruf oder Ordneraufruf. Dies wird in der Konfigurationsliste durch ein entsprechendes Symbol auch angezeigt.

Brickaufruf: Der Brick, der im Feld „Brick ID“ mit seiner Brick-ID (numerisch) angegeben ist, wird direkt aufgerufen, ohne dass vorher die normale DLE Aufruflogik (Ordner, Schlüsseldefinition, Schlüssel, Bedingung, Version) abgearbeitet wird. Dem Brick werden die unter „Felder“ definierten Feldwerte als Parameter mitgegeben.

Ordneraufruf: Im Feld „Ordner Name“ wird der interne Ordnername angegeben, der aufgerufen werden soll. Auch hier werden die unter „Felder“ angegebenen Feldwerte dem Aufruf mitgegeben. Es wird nun der normale Prozess eines DLE Aufrufs, ausgehend vom angegebenen Ordner, durchgeführt.

Die Konfigurationsparameter:

Name: Hier kann der Konfiguration ein beliebiger Name gegeben werden. Konfigurationen werden zum aktuellen Benutzer gespeichert und können nur von diesem gesehen und geändert werden.

Sprache/Land: Hier kann optional die Spracheinstellung angegeben werden, in der Form sprache_LAND (Beispiel: de_AT).

Aufrufart: Hier kann man zwischen Brick- und Ordneraufruf wählen (Erklärung siehe oben).

Batchmodus: Hier kann die interne Variable „BASE:Batchmode“ gesetzt werden.

Brick ID: Nur bei Modus Brickaufruf aktiv. Hier wird die interne Brick-ID angegeben. (Nicht der Brickname!).

Suchdatum: Das Suchdatum (BASE:SearchDate), mit dem in die Brick/Ordnerausführung gegangen wird.

Ordner Name: Nur bei Modus Ordneraufruf aktiv. Hier wird der interne Ordnername (Paket:Ordner) angegeben, der aufgerufen werden soll.

Nach Ausführung: Bei Commit werden alle offenen Transaktionen mit einem Commit festgeschrieben, bei Rollback wird ein Rollback gemacht. Manuelle Commits/Rollback, die im Brick gemacht wurden, werden natürlich davon nicht mehr erreicht.

Felder:

Hier können für den Aufruf die Felder und Werte definiert werden, die als Parameter mitgegeben werden. Die Feldauswahl erfolgt wie im Brickeditor. Über die Symbole rechts können einzelne Zeilen entfernt bzw. hinzugefügt werden. Änderungen werden nicht automatisch gespeichert. Hier muss im linken Auswahlbereich der Konfigurationen mit "Speichern" die Konfiguration gesichert werden.

 

 

Brickausgabe

Der Brickausgabebereich gliedert sich in zwei Unterbereiche: Brickausgabe und HTML Ausgabe.

Brickausgabe: Hier wird nach Ende der Brickausführung der Brickstatus ausgegeben. Im Erfolgsfall auch der durch das Kommando "Ergebnis" eingestellte Ergebnistext. Im Fehlerfall wird die Fehlermeldung samt Fehlerdetails (Stacktrace) ausgegeben.

HTML Ausgabe: Hier erfolgt eine eventuelle HTML Ausgabe, wenn diese im Brick erfolgt ist. (Z.B. durch das Kommando HTML Block oder HTTP Daten senden). Im Fenster sind schon die üblichen DLE Skripte und CSS Definitionen geladen, so dass eine rudimentäre Anzeige auch von gestylten Elementen möglich ist. Hier werden auch Dialoge und Meldungen aus dem Brick angezeigt.

Debugger

Das Tab Fenster "Debugger" gliedert sich in drei Bereiche.

Links ist eine Liste der derzeit zum debuggen angehaltenen Bricks. In der Liste ist jeder Brick mit Benutzer, Sitzungsnummer, Brickname und Zeile gelistet, der derzeit auf eine Debug-Aktion wartet.

In der Mitte wird der gewählte Brick angezeigt, wobei die aktuelle Zeile gelb markiert ist. Haltepunkte (Breakpoints) sind auf der Zeilennummer blau hinterlegt markiert.

Rechts werden die aktuellen Feldwerte und Datenobjekte angezeigt.

Im Bereich links befindet sich zudem eine Toolbar, mit der die Brickausführung gesteuert werden kann. Die Toolbar bietet dabei folgende Funktionen:

Aktualisieren: Die Informationen in den Fenstern werden neu geladen, die aktuelle Selektion bleibt dabei bestehen.

Eine Zeile weiter springen: Im Brick die aktuelle Zeile ausführen und in der nächsten wieder anhalten.

Weiter laufen lassen: Die Brickausführung läuft normal weiter, bis zum nächsten Haltepunkt oder bis zum Brickende.

Brickausführung sofort stoppen: Die Brickausführung wird sofort gestoppt, ohne das die aktuelle Brickzeile noch ausgeführt wird.

Im Fenster rechts sind zwei Tabreiter definiert. Der erste Zeigt die aktuellen Feldwerte an, wie sie derzeit im Brick gesetzt sind. Die Felder sind mit ihrem internen Namen, alphabetisch sortiert, aufgelistet. Kommt ein neues Feld nach einem Ausführungsschritt hinzu, wird die gesamte neue Feldzeile rot markiert. Ändert sich ein Wert nach einem Ausführungsschritt, wird nur der Wert rot markiert. Die Markierungen werden nach dem nächsten Schritt wieder zurückgesetzt.

Die Anzeige der Feldwerte ist auf 200 Zeichen begrenzt. Hat ein Wert mehr als 200 Zeichen, wird die Mitte des Wertes abgeschnitten und durch ein „(…)“ ersetzt. Über das Lupensymbol kann jedoch der gesamte Text in einer Analyseansicht als Popupfenster angezeigt werden:

Der Text wird dabei mit Zeileumbrüchen in einem Zeichensatz mit fixer Zeichenbreite (Courier) dargestellt. Oberhalb befindet sich ein "Lineal", mit dem man die Länge der einzelnen Zeilen und der Position ermitteln kann. Ein senkrechter grauer Strich bewegt sich dabei mit der Maus, wenn man über das Lineal fährt.

Die Anzeige der Datenobjekte listet alle aktuell geladenen Datenobjekte tabellarisch auf, sortiert nach Datenobjektname und Datenobjektschlüssel:

 Die Liste wird auch nach jedem Ausführungsschritt aktualisiert.

Haltepunkte setzen und aktivieren

Die wichtigste Funktion beim debuggen von Bricks ist das setzen und aktivieren von Haltepunkten.

Haltepunkte können am einfachsten im Brickeditor gesetzt und gelöscht werden. Dazu gibt es die entsprechende Editorfunktion, die in der Toolbar (das Pause-Symbol) und im Kontextmenü des Editors (Tastaturkürzel Strg-Q) zur Verfügung steht. Alternativ kann ein Haltepunkt durch einen Doppelklick auf die Zeilennummer gesetzt und entfernt werden. Haltepunkte werden als blau hinterlegte Zeilennummern angezeigt:

Zu beachten ist, dass Haltepunkte auf beliebigen Zeilen gesetzt werden können. In Kommentaren, Leerzeilen oder deaktivierten Zeilen haben sie aber keine Wirkung.

Aktivieren von Haltepunkten

Wird ein Brick direkt aus dem Editor, oder über das Debugfenster gestartet, sind alle Haltepunkte für diese Ausführung auch direkt aktiv. D.h. wenn der Brick an einen Haltepunkt kommt, wird die Brickausführung pausiert und es wird auf die nächste Aktion des Benutzers im Debugger gewartet. Diese Aktion kann sein: Brickausführung fortsetzen, Zur nächsten Zeile springen, oder Brickausführung anhalten. Gesteuert wird dies über den "Debugger" Tabreiter und die Toolbar des Debugger Fensters.

Wartet ein Brick auf eine Debugaktion, kann man dies zum einen in der Server-Konsole unter dem Punkt "Connections" erkennen:

In der Spalte "Call Info" wird dem Brick die Information "[Suspended] Debug" vorangestellt. In der Spalte "Brick ID (line)" wird die aktuelle Zeilennummer angezeigt.

Wechselt man nun auf das Debufenster in den Tab "Debugger", sieht man diese Bricks in der Liste "Angehaltene Bricks" und kann die Ausführung über die Toolbar steuern:

Aktivieren von Haltepunkten von außerhalb

Wurde der Brick nicht über den Editor bzw. den Debugger gestartet, sind die Haltepunkte nicht aktiv. Sie könnten ja das bestehende System stören, wenn diese sich an neuralgischen Punkten befinden, die von vielen Benutzern durchlaufen werden. Hier müssen die Haltepunkte explizit für einen Benutzer aktiviert werden. Dies geschieht über die Server-Console mit Hilfe des User-Loggings:

Hier gibt es eine neue Option "Breakpoints enabled", die für diesen Benutzer die Haltepunkte aktiviert. Ab jetzt wir für diesen Benutzer bei jedem Brick, der im Server läuft, die Ausführung angehalten, sobald ein Haltepunkt erreicht wird. Vergessen sie nicht, auf "Apply" zu drücken, wenn sie das Häkchen setzen oder entfernen, um die Einstellung zu übernehmen.

Informationen zu Haltepunkten

Haltepunkte werden pro DLE Server gespeichert. Bei einen Stopp des Servers gehen alle gesetzten Haltepunkte verloren und sind nach einem Neustart nicht mehr vorhanden. Ein Server Refresh hingegen löscht keine bestehenden Haltepunkte. Ein refresh löscht allerdings die bestehenden Logger-Konfigurationen. Damit sind die Haltepunkte dann zwar noch vorhanden, aber nicht aktiv.

Alle aktiven Haltepunkte werden auch in der ServerInfo über die Server-Konsole angezeigt:

Auch in der Connections-Übersicht werden diese, falls vorhanden, unterhalb angezeigt:

Hier besteht zudem die Möglichkeit, alle definierten Haltepunkte auf einmal zu löschen.