2012-04-20 12 views
7

Ich versuche, einen bedingten Haltepunkt in dekompiliert Code einzurichten, aber Eclipse-mir die Fehler weiterhin geben:Eclipse Bedingte Breakpoints kaputt?

Conditional breakpoint has compilation error(s)

Reason: Evaluations must contain either an expression or a block of well-formed statments

Mein Fall ist ziemlich einfach, nur gegen einen String-Wert zu vergleichen versuchen. Ich habe alle der folgenden versucht, und ich bekomme Fehler mit jedem einzelnen:

myObj.toString() == "abc123" 
myObj.toString().equals("abc123") 
if(myObj.toString() == "abc123"){ return true; } 
true == true 

Ich habe auch versucht, jede Kombination von mit oder ohne ein Semikolon am Ende der Zeile (n) und jede Kombination mit von Abständen und Zeilenumbrüchen und jeder Kombination von Haben oder Nichtumgeben meiner Bedingung. Im Grunde habe ich keine Ahnung, warum das nicht funktioniert ...

Der Code, den ich versuche zu debuggen ist in einem Jar, der mit JD-Eclipse dekompiliert wird. Normale Breakpoints funktionieren in diesem Code einwandfrei.

Weiß jemand, was hier vor sich geht ???

+0

Haben Sie das Jar aus der dekompilierten Quelle neu kompiliert, andernfalls stimmt der Code nicht mit dem Jar überein, z. Lokale Variablennamen – vickirk

+0

Hmm, aber ich bekomme einen anderen Fehler sagen Variablennamen falsch sind, wenn ich versuche, einen Variablennamen, der nicht in der Quelle existiert zu verwenden ... – kand

+0

Schritt eins ist herauszufinden, ob das Problem mit der Dekompilierung ist. Funktioniert das Setzen eines bedingten Knickpunkts in 'normalem' Code in einem Eclipse-Projekt? – sharakan

Antwort

2

Diese Seite Eclipse FAQ enthält die Syntax der richtigen CBP-Definition und die häufigsten Gründe dafür, dass sie nicht funktionieren. In Ihrem Fall, ich denke, das gilt:

This can happen if you are setting a breakpoint in a class whose class file does not contain a local variable table. For example, let's say you want to set a conditional breakpoint on Class.forName(String). If you have a source attachment for rt.jar the content assist will allow you to refer to the argument by its variable name, className. However, at debug runtime, the variable name will only be known if the class file contains a local variable table. Depending on the options used at compilation time, this information may have been stripped from the class file.

JD hergestellt haben kann Variablennamen während decompiling Ihr Glas, so „myObj“ in bedingtem Ausdruck verwendet erzeugt einen Fehler bei der Kompilierung.

+2

Klingt vielversprechend, aber OP hat anscheinend true == true versucht, was auch bei der Variable funktionieren sollte Namen sind verstümmelt! – sharakan

+0

@sharakan Sie haben Recht! Das ist seltsam. Nicht sicher, was mit True falsch sein könnte == wahr. – mazaneicha

+0

@mazaneicha Es scheint keinen Inhalt auf dieser FAQ-Seite zu geben. Gibt es eine Möglichkeit, die Tabelle für meine Klassendatei tatsächlich zu sehen? – kand

2

Vielleicht sind bedingte Breakpoints weniger als im Allgemeinen arbeiten. Betrachten wir zum Beispiel:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=278146

+0

FYI, Dies wurde ein Duplikat von https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232 gemacht, die in 4.3 M6 als behoben aufgeführt ist. – studgeek

1

Es kann ein Fehler in Eclipse sein. Was Eklipse tut, ist eine neue Methode oder ähnliches in die Quelle für die Datei zu weben, in der Sie den Breakpoint gesetzt haben, und sie zu kompilieren. Wenn dabei etwas schief geht, wird Ihr bedingter Breakpoint auf mysteriöse Weise fehlschlagen.

Sie den Ansatz folgen konnte ich unten verwendet, Eclipse im Debug laufen, das Problem zu versuchen, die Spur zu kommen: -

https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232#c21

0

Bei „true == true“ Zustand sollten Sie nur Rückkehr hinzufügen Anweisung:

Für den Rest der Probleme fehlende lokale Variablentabelle sollte die Erklärung sein. +1 für Mazaneicha dafür.

0

Bei „true == true“ Bedingung sollten Sie nur return-Anweisung hinzufügen:

return true == true; 

Für den Rest der Probleme lokale Variablentabelle fehlen sollte die Erklärung sein. +1 für Mazaneicha dafür.

Wenn Sie versuchen, eine Methode Argument durch seinen Namen zu verweisen dann nur versuchen, den Namen in „arg0“ zu ändern „arg1“ usw.

Zum Beispiel können Sie wie folgt tun:

arg0 == null 

Es ist leicht, den Variablennamen zu erraten.Setzen Sie einfach einen nicht vorhandenen Haltepunkt und sehen Sie sich die Liste der Variablen in der Variablenansicht an.

0

Hinzufügen nur, was anderen helfen könnte, wie ich dies nach einiger Zeit nur gelöst haben. Ich verwende JD-Eclipse auch zum Debuggen, wenn dieses Problem auftritt.

Stellen Sie sicher, dass sich alle erforderlichen JAR-Dateien im Classpath befinden. Ihre bedingte Anweisung kann sehr einfach sein, z. B. "return true"; Aber sobald das Kontrollkästchen "bedingter Haltepunkt" aktiviert ist, kann es sein, dass (ich kann auch nicht sicher sein) der Eclipse-Debugger den Klassenpfad des Eclipse-Projekts gegen den größeren Bereich und nicht nur die "Return True" -Zeile prüft.

Da bin ich mit JD-Eclipse Ich habe nicht die Mühe, alle erforderlichen JAR-Dateien hinzuzufügen. Das Problem wurde gelöst, nachdem ich die JAR-Dateien im Klassenpfad des Projekts hinzugefügt hatte

Wenn Sie Remotedebugging verwenden, können Sie auch versuchen, zu konfigurieren, dass das JDK Ihres Eclipse-Projekts mit der JRE der Ziel-JVM kompatibel ist.