En los detalles de una idea hilos depurador pestaña Código para aprender a programar

I. Antecedentes

grupo de la tecnología de hoy en los párrafos @ estudiantes planteado una pregunta muy interesante, cuando la tarjeta de opción de depuración de IDEA, hilos, la parte trasera del Digital ¿Qué quiere decir? ?


Algunos estudiantes dijeron que el número de líneas de código. Sin embargo, se encontró que una parte del código no es el número de líneas de código, sino también -1, que es lo que el infierno? ?

Tenemos mucho de este problema, a decir cómo analizar, cómo aprender.

 

En segundo lugar, la investigación

2.1 adivinanzas

Hemos especulado contexto, en primer lugar se está depurando interfaz, al parecer para darle un poco de depuración de referencia.

Y antes de que el número es un colon, por lo que este número debe representar la función y la función o relación, debe apreciarse que el más fuente directa número de línea o la función de código de bytes.

Pero -1 ah inexplicable?

 

2.2 Acceso a la información

En este momento, de acuerdo con nuestro estilo, sin duda, va a comprobar JLS y JVM (creo que esto es un ingeniero de JAVA dos especificaciones de mano de obra necesaria, pero yo creo que hasta uno o dos años de trabajo, hicieron lo necesario, embarazoso ).

https://docs.oracle.com/javase/specs/index.html

 

Pero esto es claramente las características proporcionadas por IDEA , sacrificar pollos Yanyong helicóptero, a partir de idea en sí misma, para empezar.

 

herramienta de depuración 2.3 idea en sí misma

Por supuesto, el más sencillo es comprobar directamente la parte utilización depurador idea del documento, debería ser capaz de encontrar la respuesta.

https://www.jetbrains.com/help/idea/debug-tool-window-threads.html

https://www.jetbrains.com/help/idea/customize-threads-view.html

No fingió vemos, su propio análisis:

Generalmente desea modificar una función o realizar alguna operación adicional, puede llamar a la derecha del menú, así que tratamos.

Encontramos Drop Frame (muy importante, muy bueno, pero no dentro del alcance de esta discusión), Hilos de exportación, la opción Agregar Stepping el filtro .., Personalizar Temas Ver .. cuatro opciones.

Brilla, "Personalizar Temas Ver" o "Temas personalizados ver," no lo hará así que ¿qué pistas?

Al parecer la opción "Mostrar el número de línea" el más sospechoso, ya que esta opción es digital y puntos de vista relacionados .

Después de observar los hilos para que podamos eliminar esta opción se muestra el efecto, que los números hacen antes de la desaparición.

Por lo tanto se puede concluir que esta figura es una función del número de línea (número de línea).

Además, recuperamos la espalda, haga doble clic en la correspondiente correspondencia entre la función de número de línea observada y código fuente.

Podemos ver que el número de líneas en un paquete tarro de terceros o código nativo, el número de línea es el código fuente de número de línea correspondiente.

Pero para el código fuente del JDK, el número de línea de código fuente y el número de línea no se corresponde con el doble-clic en la función correspondiente en la figura 62, el salto a la línea de código fuente 27 , que es el Editor de hacer?

Por lo que suponemos, será la función de números de código de bytes línea de la misma?

Javap que requiere el desmontaje mirar el número de código fuente de línea:

javap -c -l sun.reflect.NativeMethodAccessorImpl

Compiled from "NativeMethodAccessorImpl.java"
class sun.reflect.NativeMethodAccessorImpl extends sun.reflect.MethodAccessorImpl {
  sun.reflect.NativeMethodAccessorImpl(java.lang.reflect.Method);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method sun/reflect/MethodAccessorImpl."<init>":()V
       4: aload_0
       5: aload_1
       6: putfield      #2                  // Field method:Ljava/lang/reflect/Method;
       9: return
    LineNumberTable:
      line 39: 0
      line 40: 4
      line 41: 9

  public java.lang.Object invoke(java.lang.Object, java.lang.Object[]) throws java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
    Code:
       0: aload_0
       1: dup
       2: getfield      #3                  // Field numInvocations:I
       5: iconst_1
       6: iadd
       7: dup_x1
       8: putfield      #3                  // Field numInvocations:I
      11: invokestatic  #4                  // Method sun/reflect/ReflectionFactory.inflationThreshold:()I
      14: if_icmple     94
      17: aload_0
      18: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      21: invokevirtual #5                  // Method java/lang/reflect/Method.getDeclaringClass:()Ljava/lang/Class;
      24: invokestatic  #6                  // Method sun/reflect/misc/ReflectUtil.isVMAnonymousClass:(Ljava/lang/Class;)Z
      27: ifne          94
      30: new           #7                  // class sun/reflect/MethodAccessorGenerator
      33: dup
      34: invokespecial #8                  // Method sun/reflect/MethodAccessorGenerator."<init>":()V
      37: aload_0
      38: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      41: invokevirtual #5                  // Method java/lang/reflect/Method.getDeclaringClass:()Ljava/lang/Class;
      44: aload_0
      45: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      48: invokevirtual #9                  // Method java/lang/reflect/Method.getName:()Ljava/lang/String;
      51: aload_0
      52: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      55: invokevirtual #10                 // Method java/lang/reflect/Method.getParameterTypes:()[Ljava/lang/Class;
      58: aload_0
      59: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      62: invokevirtual #11                 // Method java/lang/reflect/Method.getReturnType:()Ljava/lang/Class;
      65: aload_0
      66: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      69: invokevirtual #12                 // Method java/lang/reflect/Method.getExceptionTypes:()[Ljava/lang/Class;
      72: aload_0
      73: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      76: invokevirtual #13                 // Method java/lang/reflect/Method.getModifiers:()I
      79: invokevirtual #14                 // Method sun/reflect/MethodAccessorGenerator.generateMethod:(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;I)Lsun/reflect/MethodAccessor;
      82: checkcast     #15                 // class sun/reflect/MethodAccessorImpl
      85: astore_3
      86: aload_0
      87: getfield      #16                 // Field parent:Lsun/reflect/DelegatingMethodAccessorImpl;
      90: aload_3
      91: invokevirtual #17                 // Method sun/reflect/DelegatingMethodAccessorImpl.setDelegate:(Lsun/reflect/MethodAccessorImpl;)V
      94: aload_0
      95: getfield      #2                  // Field method:Ljava/lang/reflect/Method;
      98: aload_1
      99: aload_2
     100: invokestatic  #18                 // Method invoke0:(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
     103: areturn
    LineNumberTable:
      line 49: 0
      line 50: 21
      line 51: 30
      line 53: 41
      line 54: 48
      line 55: 55
      line 56: 62
      line 57: 69
      line 58: 76
      line 53: 79
      line 59: 86

// 看这里!
      line 62: 94

  void setParent(sun.reflect.DelegatingMethodAccessorImpl);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #16                 // Field parent:Lsun/reflect/DelegatingMethodAccessorImpl;
       5: return
    LineNumberTable:
      line 66: 0
      line 67: 5
}

Después de desmontar una palabra obvia saludó: "LineNumberTable" Está claro que un número de línea en la tabla.

El número de fila de la tabla muestra claramente, la línea correspondiente 62 94 en el código de seguridad.

Y se desplaza de 94 a 27 líneas de código que corresponden a la función indicada por la fuente 103.

Por lo tanto, se puede ver el número de línea correspondiente al número de línea de código JDK está el número de línea de la fuente de desensamblado en lugar de.

Así -1 y representa qué? 

Haga doble Invoke0 en el código fuente correspondiente al método encontró, doble fuente de JDK nativa entra ejecutar, descubre el trastorno desconocido.

Por lo tanto presume, -1 representa una función nativa desconocida o función de la posición (por ejemplo, la sintaxis de expresiones lambda).

 

En este punto de volver a leer la sección oficial del documento 2.2

https://docs.oracle.com/javase/specs/index.html

Encuentra "lineNumber" JVM capítulos correspondientes: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.12

 

El  LineNumberTable atributo es un atributo de longitud variable opcional en la  attributes mesa de un  Code atributo ( §4.7.3 ). Se puede utilizar por los depuradores para determinar qué parte de los  code corresponde matriz a un número de línea especificado en el archivo fuente original.

Si hay varios  LineNumberTable atributos están presentes en la  attributes mesa de un  Code atributo, entonces pueden aparecer en cualquier orden.

Puede haber más de un  LineNumberTable atributo  por cada línea de un archivo de origen  en la  attributes tabla de un  Code atributo. Es decir,  LineNumberTable los atributos pueden juntos representan una línea dada de un archivo de origen, y no es necesario uno-a-uno con líneas de código.

// partes omitidas

line_number_table []

Cada entrada en la  line_number_table matriz indica que el número de línea en el archivo fuente original cambia en un punto dado en la  code matriz. Cada  line_number_table entrada debe contener los siguientes dos elementos:

start_pc

El valor del  start_pc artículo debe indicar el índice en la  code matriz en la que comienza el código para una nueva línea en el archivo fuente original.

El valor de  start_pc debe ser menor que el valor del  code_length elemento del  Code atributo del que este  LineNumberTable es un atributo.

número de línea

El valor del  line_number artículo debe dar el número de línea correspondiente en el archivo fuente original.

Se puede utilizar por los depuradores para determinar qué parte de los  code corresponde matriz a un número de línea especificado en el archivo fuente original.

Esta frase en la frase: se puede utilizar para la correspondencia entre el depurador y el número de línea de la matriz de código fuente asociado de .

Es decir: El depurador puede estar relacionado por LineNumberTable, código fuente y la correspondencia desmontado.

 

LineNumberTable un número de línea de grabación en el archivo de origen a la posición de inicio del código de mapeo.

Es decir, la línea 62 correspondiente al código de la línea 94 de desmontaje.

 

 

En tercer lugar, pensar

  • Una cuestión oscura puede ocultar una gran cantidad de conocimientos , para preguntar por qué algunos, la cosecha es completamente diferente.
  • la especulación negrita, medicina forense cuidadosas . Mucha gente va a especular hecho, hay una gran cantidad de personas que han solicitado los problemas directamente sin pensar. problemas primer encuentro en función del contexto y la conjetura existentes en el conocimiento más deberían ser similares, y después de verificar.
  • Estar familiarizado con IDEA, menú familiar para tener una cierta curiosidad
  • La publicación oficial puede decirse que los mejores materiales de referencia (incluyendo la especificación de Java el lenguaje, la especificación JVM, los documentos oficiales de la primavera, etc.) , pero, de hecho, mucha gente no, preste atención!
  • Para atreverse a salir de la zona de confort, intenta utilizar buenas herramientas, como desmontar javap, puede ayudar a aprender más y más en profundidad . Sin embargo, muchas personas ni siquiera trabajan unos años utilizan activamente este comando. Años de depuración de código utilizando un solo paso, no va a "volver roll" y no se podía depuración multiproceso, no lo hacen prestar atención a la esquina inferior izquierda de la pila de llamadas y así sucesivamente. Sólo múltiples conocimientos, y tienen más oportunidades para tratar una variedad de avance, en lugar de convertirse en dogma Camel Baidu Xia.
  • Solución de problemas de las ideas es muy importante, incluso más que la propia respuesta. Recuerde que la respuesta es sólo un mensaje, el método es capaz de conocimiento universal de la ley . Una gran cantidad de personas que tienen un problema indefensa, hay algunos que pueden tener N tipos de soluciones; mucha gente para resolver un problema por varias horas o incluso un día o dos y algunas personas puede encontrar rápidamente un gran avance en el problema. Principalmente si base sólida, ya sea lógica rigurosa.
  • Algunos de los problemas que muchas personas consideran indigno, lo más alarmante es que no saben que no saben, pero realmente no entienden realmente, habilidad real se refleja a menudo en pequeño problema . Debemos permanecer humilde aproximación al conocimiento, a perfeccionarse.

 

-------------------------------------------------- ---

Veo programadores RDCC 1024 Eventos

Si tengo un blog para ayudar a usted, y no hay tiempo para dar la bienvenida al navegador qué código de exploración de micro-canales a ayudarme a apoyar mi punto de elogio:

 

 

 

Publicados 379 artículos originales · ganado elogios 862 · Vistas 1,32 millones +

Supongo que te gusta

Origin blog.csdn.net/w605283073/article/details/102528646
Recomendado
Clasificación