¿Cómo pueden insertarse los métodos que arrojan excepciones?

Solo tengo curiosidad por saber cómo es posible que Java JVM a veces utilice métodos en línea que tienen el potencial de generar excepciones. Supongo que es posible alinear al menos algunos de estos métodos (como los que tienen acceso a la matriz y, por lo tanto, el potencial de lanzar ArrayIndexOutOfBoundsExceptions). El problema que veo es que si la excepción realmente ocurre, ¿cómo muestra el seguimiento de pila adecuado si ha incluido el método en línea? Dado que se pueden insertar diferentes métodos en diferentes máquinas, ¿cómo es que la inserción no rompe el mecanismo de seguimiento de la pila?

preguntado el 28 de agosto de 11 a las 01:08

En C ++, la inserción casi garantiza la pérdida de información de la pila. Sin embargo, el hecho de que a un seguimiento de pila de excepción le falte un marco no es el fin del mundo; es solo una consecuencia aceptada de la inserción (y una de las razones por las que los compiladores ofrecen opciones de modo de depuración para suprimir todas las inserciones). No sé si Java se comporta igual o no. -

Quería que esta fuera una pregunta de Java, pero es interesante saber cómo funciona esto también en C ++. -

2 Respuestas

¿Cuál es el problema que vislumbra? Dado que es la propia JVM la que realiza la inserción, no hay nada que le impida recordar qué está en línea y dónde corregir esto cuando construye un seguimiento de pila para instalar en un objeto Throwable.

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

Sin embargo, una JVM no es son requeridos para hacer esto. También puede optar simplemente por construir rastros de pila con misteriosos cortes en ellos. Ver el javadoc para Throwable.getStackTrace (). (Ni siquiera existe el requisito de que una JVM pueda producir seguimientos de pila en absoluto).

Respondido 28 ago 11, 07:08

Es posible que desee revisar este documento que explica cómo funciona el manejo de excepciones en la JVM:

Cada método que detecta excepciones está asociado con una tabla de excepciones que se entrega en el archivo de clase junto con la secuencia de código de bytes del método. La tabla de excepciones tiene una entrada para cada excepción capturada por cada bloque try. Cada entrada tiene cuatro piezas de información: los puntos de inicio y finalización, el desplazamiento de la PC dentro de la secuencia de código de bytes a la que saltar y un índice de grupo constante de la clase de excepción que se está detectando.

Respondido 28 ago 11, 06:08

Me interesaría comprobarlo. Sin embargo, estaba preguntando específicamente sobre la interacción de la inserción con excepciones. Parece que si una función está insertada, la información de seguimiento de la pila debería perderse, pero no parece estar en un programa Java. - Gravedad

Recuerde que la inserción en Java tiene lugar 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 deba recuperarse se puede almacenar en una tabla de búsqueda / salto. - jonathan.cone

El almacenamiento de información de excepciones en tablas de búsqueda, ¿no causaría un rendimiento inaceptable, especialmente para excepciones muy comunes como ArrayIndexOutOfBounds? - Gravedad

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.