2011-08-28 11 views
9

Tengo curiosidad acerca de cómo es posible que Java JVM a veces incorpore métodos que tienen el potencial de generar excepciones. Supongo que es posible alinear al menos algunos de esos métodos (como los que tienen acceso a la matriz y, por lo tanto, la posibilidad de lanzar ArrayIndexOutOfBoundsException s). El problema que veo es que si la excepción realmente ocurre, ¿cómo se muestra el seguimiento de pila correcto si se ha introducido el método? Dado que diferentes métodos se pueden insertar en máquinas diferentes, ¿cómo la línea no rompe el mecanismo de seguimiento de la pila?¿Cómo pueden incluirse los métodos que arrojan excepciones?

+2

En C++, inline casi garantiza la pérdida de información de la pila. Sin embargo, el hecho de que una traza de pila de excepción carezca de un marco no es el fin del mundo; es solo una consecuencia aceptada de la creación de líneas (y una de las razones por las que los compiladores ofrecen opciones de modo de depuración para suprimir toda la alineación). No sé si Java se comporta igual o no. –

+0

Quise decir que esta era una pregunta de Java, pero interesante saber cómo funciona esto también en C++. – Gravity

Respuesta

8

¿Cuál es el problema que prevé? Dado que es la propia JVM la que realiza la línea de entrada, no hay nada que le impida recordar dónde está en línea y corregirla cuando construye una traza de pila para instalarla en un objeto Throwable.

Cuando una excepción es tirado construido, la JVM caminará la pila de la CPU y averiguar si cada trama de pila de la máquina corresponde a bytecode interpretado, código compilados JIT, código nativo a partir de bibliotecas, etcétera. Para esto se refiere a las tablas que indican qué direcciones del código de máquina corresponden a qué instrucciones del bytecode (y más atrás a las líneas fuente, si esa información está presente en el archivo de la clase). Esta tabla puede especificar perfectamente que un cierto lugar en el código JITted puede corresponder a más de un marco de pila de nivel Java.

Sin embargo, una JVM no es requiere para hacer esto. También puede elegir simplemente construir rastros de pila con rupturas misteriosas en ellos. Vea el javadoc for Throwable.getStackTrace(). (Ni siquiera existe el requisito de que una JVM pueda generar trazas de pila en total).

3

Es posible que desee echa un vistazo a this document que explica cómo funciona el manejo de excepciones en la JVM:

Cada método que capturas excepciones se asocia con una tabla de excepción que es entregado en el archivo de clase junto con el secuencia bytecode del método . La tabla de excepciones tiene una entrada para cada excepción que es atrapada por cada bloque try. Cada entrada tiene cuatro elementos de información: los puntos de inicio y finalización, la compensación de PC dentro de la secuencia de códigos de bytes para ir a, y un índice de grupo constante de la clase de excepción que es capturado.

+0

Estaré interesado en echarle un vistazo. Sin embargo, estaba preguntando específicamente sobre la interacción de la creación de líneas con excepciones. Parece que si una función está en línea, la información de seguimiento de pila debe perderse, pero aún así no parece estar en un programa Java. – Gravity

+1

Recuerde que la incorporación en Java se lleva a cabo en tiempo de ejecución, no en tiempo de compilación como C/C++, por lo que no está "perdiendo" ninguna información. Cualquier información que esté optimizada y necesite ser recuperada se puede almacenar en una tabla de búsqueda/salto. –

+0

No almacenar información de excepción en tablas de búsqueda provocará un rendimiento inaceptable, especialmente para excepciones muy comunes como ArrayIndexOutOfBounds? – Gravity

Cuestiones relacionadas