In einem Kundenprojekt, das wir zur Zeit im Rahmen des Jobs bearbeiten, existiert ein Legacy-Framework, das aus den üblichen Gründen nicht abgeschafft werden kann. Dieses Framework setzt kräftig auf BeanShell. Das brachte mich dazu, eine Debug-Funktionalität für BeanShell-Skripte zu schaffen.
Der Autor des Frameworks hat es geschafft, aus einer streng typisierten Sprache (Java) eine typlose Sprache zu bauen, in der man nach jedem Methodenaufruf erstmal rauskriegen muss, was für einen Typ der Rückgabewert denn nun hat.
Die Anwendung wird über eine Java-GUI parametriert - die Parameter werden in einer relationalen Datenbank gehalten.
Es existieren diverse Stellen, wo simple Parametrierung nicht reicht - statt dessen müssen dort Codefragmente gebaut werden, die als scripted Java mittels Beanshell ausgeführt werden. Die dazu zur Verfügung stehende Editorkomponente hat noch nicht einmal grundlegende Fähigkeiten, wie etwa Syntax Highlighting eingebaut, was das Editieren und die Fehlersuche extrem erschwert: Bisher erschöpfte sich das Hilfsmittel im Einfügen von Debugausgaben im Script.
Nachdem meine Leidensschwelle überschritten war, überlegte ich mir, dass ich gerne in der Lage wäre, ein BeanShell-Skript zu debuggen. Die genauen Anforderungen waren:
Gelöst habe ich diese Anforderungen mit einer Klasse, die unten angehängt ist. Sie ist einfach zu integrieren: An allen Stellen, an denen sonst steht:
bsh.Interpreter inter=new bsh.Interpreter();
inter.eval("some code");
muss man eine Änderung wie folgt vornehmen:
bsh.Interpreter inter=new bsh.Interpreter();
de.elbosso.util.BeanShellDebugger.eval(inter,"some code");
Der BeanShellDebugger umgibt das übergebene Skript-Fragment mit Code zur Instrumentierung. Das Anhalten an Breakpoints wird realisiert, indem im Skript undefinierte Funktionen aufgerufen werden - Beanshell erlaubt es nämlich, nicht definierte Funktionsaufrufe abzufangen und darauf zu reagieren. Der BeanShellDebugger tut genau dies: Wann immer eine undefinierte Methode aufgerufen wird, ruft er seinerseits eine seiner eigenen Methoden auf und übergibt dieser den Namen der Methode, eventuell übergebene Aufrufparameter und den aktuellen Callstack. Über diesen kann man auf alle Skriptvariablen zugreifen und diese im Debugger der IDE analysieren.
Hier ein Beispiel-Skript um zu zeigen, wie es funktionieren kann:
//Switch, to enable (true) or disable (false) Debugging
___eb_debug_on___=true;
doFunc()
{
a=3+4;
//Next line causes Breakpoint - Callstack allows accessing Variables a and c
hallo();
b=a*2;
//Next line causes Breakpoint - Callstack allows accessing Variables a, b, and c
huhu(b);
System.out.println(this.variables);
}
c=5;
doFunc();
System.out.println("huhu");
c=null;
//Next line causes NullPointerException - because the Script does not handle it, it causes
a Breakpoint - Callstack allows accessing Variables exp and c - exp being the Exception being raised
print(c.toString());
19.10.2019
Ich habe den hier bereits vorgestellten BeanShellDebugger nochmals überarbeitet...
24.09.2016
Der vor einiger Zeit vorgestellte BeanShellDebugger funktioniert nur dann gut, wenn die Anwendung noch entwickelt wird und man noch Zugriff auf den Debugger der IDE hat.
Ticketsysteme sind lebende Wesen
29.03.2020
Hier zunächst wieder eine Triggerwarnung: Dieser Artikel wird meine Meinung abbilden. es kann sein, dass sie dem einen oder anderen nicht gefällt - das ist mir aber egal. Und wenn hier irgendwelche Schneeflocken mitlesen, dann sind die selber schuld.
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter JupyterBinder Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Präsentationen Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
Ich berichtete hier bereits über Experimente mit dem Clifford-Attractor, allerdings war ich noch Experimente unter geringfügig geänderten Parametern schuldig...
WeiterlesenEs wurde wieder einmal Zeit für ein neues Feature in meinem Static Site Generator mittels dessen ich ja auch meine Heimatseite im Zwischennetz gestalte und verwalte...
WeiterlesenEs kamen mehrere Faktoren zusammen: die Tatsache, dass ich nicht mehr ganz so kürzlich die 50 überschritten habe hatte ebenso darauf Einfluss wie das heutige trübe Wetter und auch der Fakt, dass ich bereits beinahe alle Wochenendpflichten erledigt habe. Der letzte Stein des Anstoßes war dann aber, dass sich heute zum 125. Mal der Geburtstag von Erich Fromm jährt.
WeiterlesenManche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.