2011-10-16 11 views
10
if (true) { 
    String a = "foo"; 
    String b = "bar"; 
} 

Si fijo un punto de interrupción en String a = "foo"; Eclipse se detendrá, y puedo pasar por encima y ver el valor de a dentro de la ventana variables. Pero no puedo pasar de la segunda declaración, simplemente deja el bloque de código y nunca veo el valor de b.punto de ruptura de la última declaración de un bloque de código en Eclipse

Esto me obliga a agregar una instrucción noop después de String b = "bar"; para que pueda ver qué contiene b. Tampoco puedo agregar un punto de interrupción en el cierre } que creo que son problemas relacionados.

Sé que Visual Studio lo permite, ¿hay alguna forma de hacerlo en Eclipse?

+1

¿Está absolutamente seguro de que está depurando la misma * versión * de la clase? Por ejemplo, dependiendo de su herramienta de compilación, si tiene varios proyectos y su principal está en otro proyecto que esta fuente, puede estar ejecutando una copia anterior que tiene diferentes líneas de código – Bohemian

+0

El ejemplo anterior ha sido probado y estoy seguro de eso, puedes intentarlo tú mismo. Establezca el punto de interrupción en 'String a =" foo ";' use F6 para pasar, verá el valor de 'a', use F6 nuevamente y saltará del bloque de código. Nunca se llega a ver el valor de 'b' – rtaranu

+0

Duplicado de http://stackoverflow.com/questions/7785887/cant-breakpoint-the-last-statement-of-a-code-block-in-eclipse – Stefan

Respuesta

-1

Honestamente, no estoy seguro de lo que está sucediendo en su instalación de Eclipse. Estoy trabajando en Java y simplemente intenté todo lo que puedo pensar. Comprobé un método estático para el punto de interrupción en la última línea que es no a } y funciona muy bien. Comprobé lo mismo para un método no estático.

Se desglosa de esta manera: no se puede romper en un extremo de la rizadora, pero se ajustará por defecto a debajo de la llave, en línea. Así que si usted tiene una función anidada:

public int DoesStuff(int x, int y) { 
    if(x > y) { 
     DoThing; 
    } 
    else { 
     DoOtherThing; 
    } 
} 

A continuación, los dos últimos aparatos ortopédicos no se pueden romper puntas, pero DoThing y DoOtherThing lata. ¿Tener sentido?

+0

Creo lo que dices es correcto, pero no responde la pregunta. Su problema parece ser que el último enunciado * antes * del corchete final '}' no puede tener un punto de quiebre y se salta cuando se avanza. – Rob

+0

Puedo interrumpir 'DoThing' o' DoOtherThing', por lo que se detiene antes de que se ejecute la función. Pero si esas funciones devuelven un valor asignado ex: 'int myInt = DoThing()' y lo paso, no puedo ver el valor asignado a 'myInt'. El próximo "descanso" estará fuera del bloque de código. – rtaranu

+1

@Duckies En realidad, usted * puede * punto de interrupción en un método de cierre de llaves - ver mi respuesta. –

4

Puede resaltar la expresión en el lado derecho de la asignación y pulse Ctrl +Shift +I (por 'inspeccionar' creo). Evaluará la expresión y te dará el resultado. De esta forma, puede conocer el valor de b sin necesidad de un punto de interrupción después de la asignación.

+1

Gracias, esto funciona, solo se siente como un obstáculo. – rtaranu

+0

@rtaranu: No creo que sea un kludge, me parece muy sensato. Como el depurador no puede romper un '}', y debido a que la última declaración de asignación aún no se habrá ejecutado cuando se rompe, es muy lógico que se rompa en ese punto de todos modos y que el depurador evalúe la mano derecha. lado de la expresión para ti. – Rob

+0

@robjb: es un kludge, porque si el lado derecho de las asignaciones tiene efectos secundarios (función que modifica el estado del programa), entonces se evaluará una vez para que pueda ver el valor, y luego otra vez deja que el programa continúe. Entonces modifico el comportamiento del programa cuando lo inspecciono. – rtaranu

-1

Si la sentencia final es una asignación y está en la variable local, ¿por qué quiere ver su valor porque ya no estará en el alcance y no puede tener efecto?

Si está configurando el mismo atributo de clase, puede verlo cuando regrese de esta llamada y tiene el objeto sobre el que opera este método.

Aunque esto no responde la pregunta, pero estoy tratando de entender el caso de uso de su problema.

+0

El caso de uso es que estoy llamando a una función mal documentada en una biblioteca de terceros y quiero ver qué devuelve. O estoy escribiendo un código y quiero verificar el valor antes de continuar escribiendo. – rtaranu

+0

Para la función que está en la biblioteca de un tercero, puede simplemente evaluar la llamada a la función poniendo watch o doing inspect. Entonces cuando estés escribiendo el código, este problema estará allí :). – Aman

+0

No está relacionado con el alcance de las variables (bueno, un poco, ya que el punto de interrupción debe establecerse en un lugar antes de que se haya realizado la limpieza). Si Eclipse no puede establecer un punto de interrupción en un '}', ese es un problema de Eclipse y no una limitación técnica. Los depuradores en general pueden romper un '}', p. Visual Studio lo hace. –

14

Para establecer un punto de interrupción al final de un bloque arbitrario no es posible (sin pirateo de código de bytes).

Si se trata de un cuerpo método, entonces es posible: se puede establecer un método punto de interrupción. Para ello, haga doble clic sobre la línea método de definición:

sample code with simple method breakpoint

(aviso de la pequeña flecha?) y luego en los puntos de interrupción ver, seleccionar el punto de interrupción para ver tanto un Entry y un Exit opción de marcar casillas en las propiedades que se muestran:

modifying the breakpoint

La pequeña flecha indica que, por defecto, hemos establecido un punto de interrupción en entrada al método.

Ahora selecciona Exit (y anular la selección de Entry) y verá esto en los puntos de interrupción Vista:

exit breakpoint in breakpoints view

(Hay una pequeña flecha diferentes, lo que indica un punto de interrupción de salida.)

Ahora ejecute el depurador en este pequeño interruptor ('Depurar como una aplicación Java') y se detendrá en la llave de salida del método:

debugger stopped

y las variables locales (solamente a en este caso) son ahora visibles (con los valores correctos) en los variables vista:

variables just before exit

Vale la pena Notando que este tipo de punto de ruptura atrapa la salida del método, sin embargo esto sucede, incluso, por ejemplo, si salimos lanzando una excepción.

+0

Ver [esta respuesta] (http://stackoverflow.com/questions/198041/eclipse-beakpoint-stop-before-leaving-a-java-method?rq=1) que no descubrí hasta que miré: - (Es un viejo consejo, y el mío es ligeramente diferente, para Eclipse 3.7.2. –

+0

En IntelliJ puedo colocar puntos de corte al final de bloques de código arbitrarios (no necesariamente métodos). Deben estar haciendo el " código de bytes piratería "debajo del capó? –

Cuestiones relacionadas