2012-04-20 18 views
7

sto cercando di creare un punto di interruzione condizionale nel codice decompilato, ma Eclipse mi continua a dare l'errore:Punti di interruzione condizionale Eclipse rotti?

Conditional breakpoint has compilation error(s)

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

Il mio caso è abbastanza semplice, solo cercando di confrontare con un valore stringa. Ho provato tutte le caratteristiche seguenti e ottengo gli errori di ogni singolo:

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

Ho anche provato ogni combinazione di avere o non avere un punto e virgola alla fine della riga (s) e ogni combinazione di spaziatura e newline e ogni combinazione di avere o non avere {} che circonda la mia condizione. Fondamentalmente, non ho idea del perché questo non funziona ...

Il codice che sto cercando di eseguire il debug è all'interno di un jar che viene decompilato con JD-Eclipse. I breakpoint normali funzionano bene in questo codice.

Qualcuno sa cosa sta succedendo qui ???

+0

Hai ricompilato il jar dalla sorgente decompilata, altrimenti il ​​codice non corrisponderà al jar, ad es. nomi delle variabili locali – vickirk

+0

Hmm ma ottengo un errore diverso nel dire che i nomi delle variabili sono errati quando provo ad usare un nome di variabile che non esiste nel codice sorgente ... – kand

+0

Il primo passo è capire se il problema è la decompilazione. L'impostazione di un punto di interruzione condizionale nel codice "normale" in un progetto Eclipse funziona? – sharakan

risposta

2

Questa pagina Eclipse FAQ contiene la sintassi della corretta definizione di CBP e le ragioni più comuni per cui non funzionano. Nel tuo caso, penso che vale quanto segue:

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 potrebbe aver fabbricato i nomi delle variabili, mentre decompilazione vostro vaso, in modo da utilizzare "myObj" in un'espressione condizionale produce un errore di compilazione.

+2

I suoni promettenti, ma OP ha apparentemente provato true == true, che dovrebbe funzionare anche se la variabile i nomi sono mutilati! – sharakan

+0

@sharakan Hai ragione! È strano. Non sei sicuro di cosa potrebbe essere sbagliato con true == true. – mazaneicha

+0

@mazaneicha Sembra non esserci alcun contenuto in quella pagina delle FAQ. C'è un modo in cui posso effettivamente vedere la tabella prodotta per il mio file di classe? – kand

2

Forse i breakpoint condizionali sono inferiori rispetto al funzionamento generale. Si consideri, ad esempio:

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

+0

FYI, Questo è stato fatto un duplicato di https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232 che è elencato come risolto in 4.3 M6. – studgeek

1

Può essere un bug in Eclipse. Quello che fa l'eclisse è tessere un nuovo metodo o alcuni di questi nel sorgente del file in cui si imposta il punto di interruzione e compilarlo. Se qualcosa va storto in questo processo, il punto di interruzione condizionale fallirà misteriosamente.

Si potrebbe seguire l'approccio che ho usato qui di seguito, in esecuzione Eclipse in debug per cercare di rintracciare il problema: -

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

0

In caso di "vera == true" condizione si deve solo aggiungere ritorno dichiarazione:

return true == true; 

Per il resto dei problemi manca la tabella delle variabili locali dovrebbe essere la spiegazione. +1 a Mazaneicha per quello.

0

In caso di "vera == true" condizione si deve solo aggiungere istruzione return:

return true == true; 

Per il resto dei problemi mancanti tabella delle variabili locali dovrebbe essere la spiegazione. +1 a Mazaneicha per quello.

Se stai cercando di fare riferimento un argomento del metodo con il suo nome poi basta cercare di cambiare il nome in "arg0", "arg1", ecc

Per esempio, si può fare in questo modo:

arg0 == null 

È facile indovinare il nome della variabile.Basta inserire un punto di interruzione non condizionale e visualizzare l'elenco delle variabili nella vista Variabili.

0

Solo sommando ciò che potrebbe aiutare gli altri come ho appena risolto questo dopo un po 'di tempo. Sto usando JD-Eclipse anche per il debug, quando ho questo problema.

Assicurarsi che tutti i file jar necessari siano in Classpath. La tua dichiarazione condizionale può essere molto semplice, come "return true"; ma una volta che la checkbox "breakpoint condizionale" è spuntata, potrebbe essere che (non posso esserne sicuro) Eclipse debugger controllerà che il classpath del progetto Eclipse sia contro l'ambito più grande e non solo quella "return true".

Poiché utilizzo JD-Eclipse, non mi sono preoccupato di aggiungere tutti i file jar necessari. Il problema è stato risolto dopo aver aggiunto i file jar nel classpath del progetto

Se si utilizza il debug remoto, è anche possibile provare a configurare in modo che il JDK del progetto Eclipse sia compatibile con JRE JVM di destinazione.

Problemi correlati