2012-04-20 26 views
7

estoy tratando de establecer un punto de interrupción en el código condicional descompilación, pero Eclipse me sigue dando el error:Puntos de interrupción condicional Eclipse roto?

Conditional breakpoint has compilation error(s)

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

Mi caso es muy sencillo, basta con tratar de comparar con un valor de cadena. He intentado todo lo siguiente y me da errores con todos y cada uno:

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

También he probado todas las combinaciones de tener o no tener un punto y coma al final de la línea (s) y todas las combinaciones de espaciamiento y nuevas líneas y cada combinación de tener o no {} rodeando mi condición. Básicamente, no tengo idea de por qué esto no está funcionando ...

El código que estoy tratando de depurar está dentro de un jar que se descompila con JD-Eclipse. Los puntos de corte normales funcionan bien en este código.

¿Alguien sabe lo que está pasando aquí ???

+0

¿Ha recompilado el contenedor desde el origen descompilado, de lo contrario, el código no coincidirá con el contenedor, p. nombres de variables locales – vickirk

+0

Hmm pero recibo un error diferente al decir que los nombres de las variables son incorrectos cuando trato de usar un nombre de variable que no existe en la fuente ... – kand

+0

El primer paso es averiguar si el problema es descompilar. ¿Funciona el establecimiento de un punto de interrupción condicional en el código 'normal' en un proyecto de Eclipse? – sharakan

Respuesta

2

esta página Eclipse FAQ contiene la sintaxis de la definición correcta de CBP y las razones más comunes para que no funcionen. En su caso, creo que se aplica lo siguiente:

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 puede haber fabricado los nombres de variables, mientras que la descompilación de su frasco, por lo que el uso de "myObj" en la expresión condicional produce un error en tiempo de compilación.

+2

Suena prometedor, pero OP aparentemente intentó con verdadero == verdadero, lo que debería funcionar incluso si la variable los nombres están destrozados! – sharakan

+0

@sharakan ¡Tienes razón! Eso es extraño. No estoy seguro de qué podría estar mal con verdadero == verdadero. – mazaneicha

+0

@mazaneicha No parece haber contenido en esa página de Preguntas frecuentes. ¿Hay alguna forma en que realmente pueda ver la tabla producida para mi archivo de clase? – kand

2

Quizás los puntos de interrupción condicionales sean menos que funcionales en general. Consideremos, por ejemplo:

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

+0

FYI, Esto se hizo un duplicado de https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232 que se muestra como arreglado en 4.3 M6. – studgeek

1

Puede ser un error en eclipse. Lo que hace eclipse es tejer un nuevo método o algo así en la fuente para el archivo en el que estableces el punto de interrupción y compilarlo. Si algo sale mal en este proceso, su punto de interrupción condicional fallará misteriosamente.

Se podría seguir el enfoque utilicé a continuación, se ejecuta en el eclipse de depuración para tratar de localizar el problema: -

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

0

En caso de "verdadero == true" condición que sólo debe añadir retorno declaración:

return true == true; 

Para el resto de los problemas que faltan tabla de variables locales debe ser la explicación. +1 a Mazaneicha por eso.

0

En caso de "verdadero == true" condición que sólo debe añadir instrucción de retorno:

return true == true; 

Para el resto de los problemas que faltan tabla de variables locales debe ser la explicación. +1 a Mazaneicha por eso.

Si usted está tratando de derivar a un argumento de un método por su nombre a continuación, sólo tratar de cambiar el nombre a "arg0", "arg1", etc.

Por ejemplo, se puede hacer así:

arg0 == null 

Es fácil adivinar el nombre de la variable.Simplemente coloque un punto de corte incondicional y vea la lista de variables en la vista Variables.

0

Simplemente agregando lo que podría ayudar a otros, ya que acabo de resolver esto después de un tiempo. También estoy usando JD-Eclipse para la depuración cuando tengo este problema.

Asegúrese de que todos los archivos jar necesarios estén en Classpath. Su declaración condicional puede ser muy simple, como "return true"; pero una vez que se marca la casilla de verificación "punto de corte condicional", podría ser que (tampoco estoy seguro) el depurador de Eclipse verificará la ruta de clases del proyecto de Eclipse en comparación con el alcance más amplio y no solo con la línea "devolver verdadero".

Como uso JD-Eclipse, no me molesté en agregar todos los archivos jar necesarios. El problema se resolvió después de agregar los archivos jar en classpath del proyecto

Si está utilizando la depuración remota, también puede intentar configurar para que el JDK de su proyecto Eclipse sea compatible con el JRE de la JVM de destino.

Cuestiones relacionadas