Debugger

Dieser Artikel beschäftigt sich mit den technischen Details des Debuggers. Wenn Sie auf der Suche nach Informationen zur Bedienung des Debuggers sind besuchen Sie die Seite „Fehlersuche in einem Skript“.

Das Hauptproblem bei der Anbindung eines Debuggers in die p2fSimply-Umgebung ist die Kommunikation mit dem zu debuggenden Skript. Die Möglichkeiten des Frontends sind hier, da es mithilfe von Javascript in einem Browser läuft, sehr begrenzt.

Generell steht als Mittel zur Kommunikation nach außen nur AJAX zur Verfügung. Durch einen AJAX-Aufruf kann ein einziges Skript gestartet werden, dass eine einzige Antwort liefern kann. Diese Antwort kann zwar beliebig lange auf sich warten lassen, ist sie aber erfolgt, ist die Verbindung beendet.

Das Frontend kann das zu debuggende Skript also nicht selbst starten, da es dann erst am Ende dessen Ausführung eine Antwort bekommt. Das Skript soll ja aber eben während seiner Ausführung anhalten und auf neue Befehle vom Frontend warten.

Das Frontend startet ein Skript des Backends, das dann in einer anderen Instanz des PHP- Interpreters das zu debuggende Skript startet. An jeder Stelle, an der das Skript halten soll, sind spezielle Haltebefehle platziert. Erreicht das Skript einen dieser Punkte, so wird ein Socket auf einem festen, konfigurierbaren, Port geöffnet. Dort wartet das Skript auf Befehle.

Das Frontend kann nun ein Backend-Skript nach dem Status des Debuggers fragen. So- bald sich dieses Skript auf den Socket verbinden kann, erhält das Frontend eine Rück- meldung auf seine Anfrage und kann nun die Variablendaten abfragen. Hier betreibt das Frontend beim Verbindungsaufbau und bei einem Continue-Befehl Polling. Dies ist die Zeit, die das Skript zum nächsten Halteblock oder zum Ende läuft.

Von Polling wird gesprochen, wenn ein Prozess auf eine Ressource wartet und dabei regelmäßig prüft, ob diese seit der letzten Prüfung verfügbar geworden ist. Ein Prozess, der Polling betreibt, verbraucht in seiner Wartezeit Rechenleistung.

Der Debugger hingegen betreibt kein Polling. Er öffnet nur einen Socket und blockiert dann, während er auf Verbindungen wartet.

Es gibt vier Befehle, die das Frontend über das Backend an den Debugger senden kann: continue, finish, terminate und data. Die ersten drei Befehle haben dabei sich selbst als Bestätigungsantwort. Dabei wird ein Abschlusszeichen an den Befehl gehangen, um das Ende der Kommunikation anzuzeigen.

Bei dem Data-Befehl funktioniert dies aber nicht. Das liegt daran, dass in der Antwort der Inhalt von Benutzervariablen übertragen wird. Diese können beliebige Inhalte um- fassen, und so ist nicht garantiert, dass ein, egal wie gewähltes Trennzeichen nicht im zu übertragenden Text vorkommt. Vor den eigentlichen Nutzdaten wird daher die Bytelänge der folgenden Nachricht mit einem Trennzeichen gesendet. Danach werden vom Backend dann genau diese Anzahl Bytes vom Socket gelesen. Auf diese Art und Weise können dann beliebige Nutzdaten übertragen werden.