Pregunta sobre debugging, java – ¿Hay asm nop equivalente en java?

30

Cuando programo C / C ++ con Visual Studio, uso a menudo__asm nop; comando para insertar unnoop Código para tener algo sobre lo que romper. Por ejemplo:

if (someCondition())
{
  __asm nop;
}

No tengo idea de qué hacer cuando se produce la condición, pero quiero detener la ejecución y examinar el estado actual. Algunas vecessomeCondition() es lo suficientemente simple como para crear un punto de interrupción condicional, pero los puntos de interrupción condicionales ralentizan significativamente la ejecución, además no siempre es posible.

Ahora, en C # entro al depurador directamente ya sea llamandoSystem.Diagnostics.Debugger.Break() oSystem.Diagnostics.Debugger.Launch().

Ahora me veo forzado a programar Java y hasta ahora no he encontrado una mejor alternativa que simplemente hacerSystem.out.println("bla-bla") y establecer un punto de interrupción allí. Nuevamente, considere el caso cuando un punto de interrupción condicional no es factible.

Entonces, me pregunto - ¿hay un__asm nop oSystem.Diagnostics.Debugger.Break() alternativa en Java?

@Neil - si no me equivoco,DEBUG_BREAK() es solo__asm int 3 - Otro mas de mis favoritos. mark
@mark es correcto en el caso de x86, pero para otras arquitecturas es lo que usan. Neil
No es relevante para tu pregunta, pero en C / C ++ puedes usar DEBUG_BREAK (); macro que entrará en el depurador automáticamente sin que tenga que agregar un punto de interrupción manual. Neil
Yo uso System.out.println () en este caso. ¿Por qué no quieres usar esto? Sandro

Tu respuesta

5   la respuesta
33

En bytecode tienes unnop instrucción, pero no haynop Declaración en el lenguaje Java.

Puedes añadir un extra; en una línea por sí misma y el código aún se compilará, pero eso no es mucho más significativo que agregar una línea vacía.

Otra declaración de "no hace nada" podría ser:

assert true;

que no tiene efectos secundarios, y puede desactivarse al ejecutar el programa.

Como resulta,assert true no parece generar ninguna instrucción de código de bytes, lo que hace que los puntos de interrupción de aseverar sean omitidos por completo. Eclipse es, sin embargo, capaz de romper en una declaración como

assert Boolean.TRUE;

que es bastante similar.

A partir de 2018, ningunoEclipse (4.7) niIDEA (2017.3) se puede romper en;. Bass
En realidad, inclusojdb no soporta esto, e. sol.:VM Started: Unable to set deferred breakpoint com.example.Class1:11 : No code at line 11 in com.example.Class1. Bass
Otra buena técnica es hacer un método ficticio, usarlo en todas partes y poner el punto de interrupción en el método:stackoverflow.com/a/26172741/895245 Ciro Santilli 新疆改造中心996ICU六四事件
+1, las afirmaciones parecen ser lo que necesitas (ruptura de depuración) keyser
5

Puede simplemente colocar cualquier instrucción de asignación arbitraria que no haga nada, por ejemplo.

if (someCondition()) {
  int t=0;
}

El depurador estará feliz de romper con esto. Ya quet es local al bloque, posiblemente no puede tener ningún efecto secundario (y hará que JIT esté compilado en el código de producción).

Alternativamente, puede escribir una función estática que tenga un punto de interrupción establecido permanentemente, así que simplemente puede hacer:

if (someCondition()) {
  breakPoint();
}
No creo que puedas establecer un punto de interrupción en un; en eclipse. aioobe
o simplemente añadir operador; mishadoff
Tampoco puede hacerlo en otros IDE, por ejemplo en IntelliJ IDEA. gvlasov
En Eclipse Mars, con "eliminar corchetes innecesarios" habilitado en el formateador o guardar pasos, el primer ejemplo se convierte en 'if (someCondition ()) int t = 0;' que es un código inválido simpleuser
4

Java interpreta esto como una declaración vacía:

;

Aunque, como se indica en los comentarios, Eclipse no le permitirá establecer un punto de interrupción aquí. Si quieres algo inútil en el que puedes poner un punto de interrupción que también sea agradable y fácil de escribir, te sugiero:

if(false){}

Su compilador puede advertirle que esto nunca se ingresa, lo que puede ser útil para recordarle que lo saque antes de compilar para producción. ¡Espero que esto ayude!

2

Estoy separando esto en una nueva respuesta porque me sorprende que nadie haya dicho esto todavía.Los IDE modernos le permiten agregar lógica a los puntos de interrupción. En lugar de compilar un dedicadoif solo para la depuración, coloque el punto de interrupción en un lugar que realmente le interese, luego haga clic derecho y seleccione Propiedades de punto de interrupción.

Por "IDE modernos", me refiero a aquellos con los que trabajé actualmente: Eclipse, Xcode, NetBeans, IntelliJ y Visual Studio. Otros probablemente también tienen esta característica. Ben Leggiero
Meta: Gracias, quien votó esto, porempujándome por el borde para ser un miembro de confianza 😄 Ben Leggiero
2

No encontré la solución perfecta para esto, pero aquí está la solución que más me gusta. Probablemente no sea eficiente, pero le permite ubicar un punto de interrupción, Eclipse no se queja ni advierte, y desde el punto de vista del lector de códigos es obvio lo que quiere hacer.

    // Silly method that allows me to make noop
    private static void noop() {

    }

    public otherMethod() { 
            // Here I need breakpoint
            noop();
    }

Si quiero precondicionar el punto de interrupción, coloco la condición antes:

    public otherMethod() { 
            // Here I need breakpoint
            if(someCondition())
                noop();
    }

Preguntas relacionadas