2011-01-14 3 views
3

Ich frage mich, welchen Unterschied es zum Debugger (Intellij IDEA + Scala Plug-in) macht, wenn ich Scala-Code und nicht Java-Code debugge. Nach meinem Verständnis ist ein Debugger eng mit der Sprache gekoppelt, d. H. Ein Java-Debugger kann nicht mit Scala-Code umgehen, aber anscheinend steht hier die JVM im Mittelpunkt, was bedeutet, dass jeder Debugger ausreichen würde, solange es sich um Bytecode handelt. Recht ?Macht es für den Debugger einen Unterschied, dass es Scala-Code ist, den ich debugge?

WICHTIGER UPDATE: Das Problem bestand darin, ein Beispiel zu geben, wie ein Bytecode-Debugger für Scala einschränkend sein kann. Angenommen, ein Unterbrechungspunkt ist erreicht, und ich möchte nicht zur nächsten Zeile gehen, aber ich möchte, dass der Debugger einen Scala-Ausdruck im Kontext der Anwendung auswertet (z. B. möchte ich eine Operatormethode von einem Singleton-Objekt aufrufen). Der Debugger ist blockiert, weil er Scala nicht verstehen kann. Ich muss die Transformation selbst durchführen und das resultierende Java in den Debugger eingeben. Das Problem ist, dass nur "Haltepunkt Zeug" in Byte-Code-Ebene behandelt werden konnte. Was, wenn Sie einen Ausdruck unter Beobachtung stellen wollen? Debugger muss Scala verstehen, um den beobachteten Ausdruck zu bewerten, oder? Dieses Mal bin ich mir sicher, dass ich recht habe. Rache ist mein, sagt der Herr ;-)

Antwort

8

Kurze Antwort Ihre Annahmen sind falsch.

Der Grund ist der Debugger kümmert sich nicht, welche Sprache Ihr Debuggen. Es stoppt an Haltepunkten, die wiederum die Zeile einer bestimmten Quelldatei enthalten. Beachten Sie, dass die Quelldatei nur Text ist, den Sie lesen können - der Debugger scannt die Quelldateien nie. Wenn Sie die Stelle ändern, an der die Quelldateien in ein anderes Verzeichnis mit einer Textdatei im richtigen Verzeichnis mit dem richtigen Dateinamen als gesetztem Haltepunkt verschoben werden, zeigt der Debugger sie gerne an, wenn der Haltepunkt auftritt. Jedes Mal, wenn Sie einen Haltepunkt setzen, teilt Ihre IDE dem Debugger mit, dass sie diese Klasse nach jedem Bytecode in dieser Zeile durchsucht und stoppt, wenn Sie sie drücken. Dies funktioniert natürlich nicht, wenn Ihre IDE versucht, die gleiche Textdatei in eine Klassendatei zu kompilieren - aber es wird funktionieren, wenn Sie gefälschte Textdateien als Quelle für eine JAR-Datei erstellen und die Quelldatei-Mapping-Funktion ausführen.

Wenn man darüber nachdenkt, ist das Schreiben einer einfachen Vorlage und das Kompilieren während des Debuggens nicht so schwierig. Verwenden Sie einfach asm, um alle Druckanweisungen zu erstellen, und geben Sie an, dass diese Druckanweisung aus der Vorlagendatei in dieser Zeile stammt. Danach kannst du clevereres Zeug hinzufügen, während die Dinge debuggbar bleiben.

+0

Das ist richtig, aber es stellt eine Herausforderung mit Scala dar, weil eine Zeile des Scala-Codes normalerweise viele Schritte enthält, weil sie expressionsbasierter ist. Daher ist das Debuggen auf Zeilenebene weit weniger nützlich als das Debuggen auf Line-Ebene in Java , die dazu neigt, mehr singuläre Aktionen in jeder Zeile zu haben. Es gibt einige Leute an der EPFL, die zusätzliche Debug-Informationen zu Scala-erzeugten Klassendateien hinzufügen, um besser spezialisierte Scala-Debugger zu unterstützen. –

+1

Ein weiteres Argument, um jede Zeile so einfach wie möglich zu machen und definitiv ein Argument dafür, so viel Scheiße wie möglich auf eine Zeile zu legen. –

+0

@mP Sorry, aber ich stimme nicht zu, dass ein Mangel in der Tooling als "Argument" für eine bestimmte Art von Code zählen sollte. –

Verwandte Themen