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.
8TB Raid5 mit Raspberry Pi
25.04.2020
Ich habe mir neulich überlegt, ob man einen Pi als Raid benutzen könnte - aber nicht mit dem ewig gleichen Setup mit 4 USB-Sticks...
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...
Durch die Seite Open Culture bin ich auf diesen spektakulären Auftritt aufmerksam geworden:
WeiterlesenIch fand neulich einen sehr interessanten Artikel Zum Thema der algorithmischen Erzeugung von dekorativen (obwohl - das liegt im Auge des Betrachters) Bildern.
WeiterlesenIch habe vor einiger Zeit bereits zwei Vorträge gestaltet und dafür meine Ideen zur unkomplizierten Erstellung von Präsentationen genutzt - nun ist ein weiterer hinzugekommen.
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.