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.
CI/CD mit shellcheck
13.10.2019
Ich habe mich entschlossen, in meinen diversen Shell-Projekten shellcheck als Mittel zur Qualitätssicherung einzusetzen.
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Git(lab|hub) Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In meinem $dayjob kam neulich die Frage auf, ob es möglich wäre, die aktuelle Softwareinstallation eines Linux-Systems als Software Bill of Materials (SBOM) zu exportieren.
Weiterlesen...Ich habe - motiviert durch meine Experimente zur Visualisierung von Paketabhängigkeiten in Linux-Installationen als interaktive Graphen - versucht, relationale Datenmodelle in ähnlicher Form zu visualisieren und dazu zwei Plugins für die sQLshell geschrieben.
Weiterlesen...Die Royal Institution hat in ihren Schätzen gegraben und die Christmas Lectures von Carl Sagan auf Youtube nochmals veröffentlicht. Meiner Ansicht nach unbedingt lohnenswert für alle, die Englisch verstehen!
Weiterlesen...Manche 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, muß 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 GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.