# Eclipse Debugger: Variablen-Anzeigen nur mit Breakpoint



## wave (7. Jan 2010)

Hallo,

ich bin dabei, ein kleines Programm mit Swing-Oberfläche nach dem MVC-Konzept zu schreiben und verwende dafür Eclipse. Dabei wäre es sehr hilfreich, während des Programmablaufs ständig die aktuellen Variablen-Werte meiner Model-Klasse sozusagen "live" im Blick zu haben, um zu sehen, wie sich diese beim Drücken bestimmter Buttons ändern. 

Benutze ich jedoch den Debugger, so bleibt das Variablen-Fenster oben rechts leer. Erst, wenn ich das Programm durch Setzen eines Breakpoints anhalte, erscheinen die lokalen Variablen mit ihren momentanten Werten. Ich bin mir schon fast sicher, dass das anders auch gar nicht geht, aber falls ich recht habe wäre zumindest eine Erklärung für diese Einschränkung sehr hilfreich.

Gruß, wave


----------



## maki (7. Jan 2010)

> . Ich bin mir schon fast sicher, dass das anders auch gar nicht geht, aber falls ich recht habe wäre zumindest eine Erklärung für diese Einschränkung sehr hilfreich.


Erklärung: Variablen ändern ihren Wert, meist sehr sehr schnell.
Welchen Wert sollte denn der Debugger anzeigen wenn du ihm nicht sagt zu welchem Zeitpunkt??


----------



## wave (7. Jan 2010)

Er soll ja gerade die Anzeige immer aktuell halten, also den Wert angeben, den die Variable in diesem Moment hat. Die Variablen in meiner Model-Klasse ändern sich doch nur, wenn ich einen Button der GUI drücke. Bis dahin sollte ihr Wert eigentlich unverändert bleiben. Es handelt sich ja nicht um eine Konsolenanwendung, die ohne Unterbrechung alle Codezeilen durchläuft, sondern um ein Programm mit grafischer Oberfläche, das erst durch Ereignisse weiterarbeitet.


----------



## maki (7. Jan 2010)

wave hat gesagt.:


> Er soll ja gerade die Anzeige immer aktuell halten, also den Wert angeben, den die Variable in diesem Moment hat. Die Variablen in meiner Model-Klasse ändern sich doch nur, wenn ich einen Button der GUI drücke. Bis dahin sollte ihr Wert eigentlich unverändert bleiben. Es handelt sich ja nicht um eine Konsolenanwendung, die ohne Unterbrechung alle Codezeilen durchläuft, sondern um ein Programm mit grafischer Oberfläche, das erst durch Ereignisse weiterarbeitet.


Selbst dann kann der Debugger ja nicht davon ausgehen dass sich Variablenwerte nur beim Klick auf einen Button ändern 
Oder woher sollte denn ein Debugger sowas wissen?


----------



## wave (7. Jan 2010)

Aber bei einem Breakpoint schafft es der Debugger ja offenbar auch, sozusagen als übergeordnete Instanz die Variablen im Speicher irgendwie zu überwachen. Instanzvariablen müssten sich doch bei einem konkreten, während der gesamten Laufzeit vorhandenen Objekt immer an der selben Stelle im Speicher befinden. Kann der Debugger dann nicht einfach diesen Vorgang des Auslesens/Überwachens (meinetwegen jede Sekunde) automatisch wiederholen und somit die Anzeige fast aktuell halten (öfter wird ja ein Button sowieso nicht gedrückt und somit würde ich alle Änderungen mitbekommen).


----------



## maki (7. Jan 2010)

Du scheinst Breatungsresistent zu sein...

also nochmal:
Vaariablenwerte können sich sehr schnell ändern, woher soll der Debugger wissen wann er welche Werte anzeigen soll?
DU musst ihm schon sagen wann er etwas anzeigen soll, mit dem Breakpoint.

Alles andere wäre Quatsch


----------



## wave (7. Jan 2010)

Ich bemühe mich wirklich, deine Argumente zu verstehen, aber bisher leuchtet mir das nicht richtig ein. *Haben nicht alle Instanzvariablen zu jedem Zeitpunkt t einen fest definierten Zustand (= Wert), der theoretisch ausgelesen werden kann?* Ich könnte dem Debugger gerne die Variablen nennen, für deren Werte ich mich interessiere, aber ich möchte eben nicht ständig das Programm anhalten. 

Daher dachte ich an eine Möglichkeit, bei der der Debugger selbst in gewissen Abständen (z.B. alle zwei Sekunden ab Programmstart; das wäre doch dann das "wann") den Wert überprüft und mir anzeigt. Die Tatsache, dass sich Variablen theoretisch sehr schnell ändern können, verhindert doch nicht, den Momentanwert zu einem bestimmten Zeitpunkt auszulesen, oder? Wenn der Wert dann eine ms später schon wieder anders ist, macht das ja nichts, da das in meinem Fall wie beschrieben sowieso nicht vorkommt.


----------



## maki (7. Jan 2010)

> Haben nicht alle Instanzvariablen zu jedem Zeitpunkt t einen fest definierten Zustand (= Wert), der theoretisch ausgelesen werden kann?


Ja, den haben sie.
Du musst aber festlegen welcher Zeitpunkt t ist 



> Ich könnte dem Debugger gerne die Variablen nennen, für deren Werte ich mich interessiere, aber ich möchte eben nicht ständig das Programm anhalten.


Die Variable musst du ihm auch nennen, aber eben auch den Zeitpunkt 



> Daher dachte ich an eine Möglichkeit, bei der der Debugger selbst in gewissen Abständen (z.B. alle zwei Sekunden ab Programmstart; das wäre doch dann das "wann") den Wert überprüft und mir anzeigt.


Das wäre Quatsch, die Werte können sich sehr schnell ändern, im Nanosekundenbereich.
In deinem konkreten simplen Fall mag das nicht vorkommen, ist aber eher eine Ausnahme, generell gilt:
Was nutzen einem die Werte wenn man den Zeitpunkt nicht kennt? -> Gar nix

Du willst wahrscheinlich gar keinen Debugger (sind sowieso überbewertet imho), du willst eine Loggingausgabe 
Dafür kannst du Frameworks nehmen, oder ein simples System.out.


----------



## byte (7. Jan 2010)

Du kannst Watchpoints auf die Variablen legen (rechtsklick auf Variable in Outline View). Dann hält der Debugger automatisch an, wenn sich die Variable ändert. Du brauchst dann keinen Breakpoint setzen. Alternativ kannst Du auch Watch Expressions benutzen. Ganz ohne Suspend gehts aber AFAIK nicht.


----------



## wave (7. Jan 2010)

Danke, so langsam verstehe ich, warum das zumindest generell nicht viel bringt. Ich dachte halt, in meinem Fall wäre das wie beschrieben kein Problem, denn hier könnte ich ja sehr wohl deutlich erkennen, ob der Wert vor oder nach einem Knopfdruck erschienen ist (genauer brauche ich es ja gar nicht).

@byte: Kann man den Debugger auch so konfigurieren, dass er bei einem solchen Watchpoint nur kurz anhält, den neuen Wert anzeigt (im Variablenfenster z.B.) und dann automatisch mit der Ausführung des Programms bis zum nächsten Watchpoint fortfährt?


----------



## byte (7. Jan 2010)

Kommt drauf an von welchem "Debugger" Du sprichst. In Eclipse und IntelliJ IDEA gibts das afaik nicht. 

Was ist so schlim daran, einfach Resume (F8) zu drücken?


----------



## wave (7. Jan 2010)

Naja, wenn man mehrere Variablen überwachen will, wäre eine Gesamtliste etwas übersichtlicher, aber ich werde es jetzt wohl wie beschrieben machen. Danke euch beiden!


----------



## byte (7. Jan 2010)

Das kannst Du mit Watch Expressions erreichen (siehe Expressions View). Finds aber eher umständlich.

An Deiner Stelle würde ich das einfach mit Logging lösen. Du könntest einfach einen Thread laufen lassen, der alle paar Sekunden ein Dump alle Values loggt. Das hast Du in ein paar Minuten implementiert und es erfüllt genau den Zweck.


----------

