El manejo de excepciones estructuradas de Windows (SEH) tiene una estructura de dos fases. Cuando se produce una excepción, Windows busca primero un controlador para la excepción siguiendo la cadena de manejador de excepciones registradas (cuyo encabezado está almacenado en fs: [0] en x86, es decir, el primer dword en el segmento apuntado por el segmento FS) registrarse - toda esa fea lógica de desplazamiento de segmento de 16 bits no desapareció en 32 bits, simplemente se volvió menos relevante).
La búsqueda se realiza llamando a una función con una bandera particular, un puntero que se almacena en cada marco de excepción en la pila. fs: [0] apunta al cuadro superior. Cada cuadro apunta al cuadro anterior. En última instancia, el último cuadro de la lista es uno que ha sido proporcionado por el sistema operativo (este controlador mostrará un cuadro de diálogo de bloqueo de aplicación si lo alcanza una excepción no controlada).
Estas funciones normalmente verifican el tipo de la excepción y devuelven un código para indicar qué hacer. Uno de los códigos que pueden devolverse es básicamente "ignorar esta excepción y continuar". Si Windows ve esto, restablecerá el puntero de la instrucción al punto de la excepción y reanudará la ejecución. Otro código indica que este marco de excepción debe manejar la excepción dada. Un tercer código es "No voy a detectar esta excepción, sigo buscando". Windows sigue llamando a estas funciones de filtro de excepciones hasta que encuentra una que maneje la excepción de una manera u otra.
Si Windows encuentra uno que maneja la excepción al capturarlo, procederá a desenrollar la pila de nuevo a ese controlador, que consiste en llamar a todas las funciones nuevamente, solo pasando una bandera diferente. Es en este punto que las funciones ejecutan la lógica finally
, hasta que el controlador que ejecuta la lógica except
.
Sin embargo, con la excepción de protector de página de pila, el proceso es diferente. Ninguno de los manejadores de excepciones del idioma elegirá manejar esta excepción, porque de lo contrario se rompería el mecanismo de crecimiento de la pila.En su lugar, la búsqueda de filtros se filtra hasta el manejador de excepción base proporcionado por el sistema operativo, que aumenta la asignación de la pila al comprometer la memoria apropiada y luego devuelve el código de retorno apropiado para indicar que el sistema operativo debe continuar donde lo dejó. en lugar de desenrollar la pila.
La herramienta y la infraestructura de depuración están diseñadas para permitir que estas excepciones particulares funcionen correctamente, por lo que no tiene que preocuparse por su manejo.
Puede leer más sobre SEH en Matt Pietrek's excellent article in MSJ from over a decade ago.
Copia de seguridad un momento. ¿Para qué necesita llamar a una de las funciones de IsBadXXXPtr? – jmucchiello
No necesito nada de IsBadXXXPtr (estoy de acuerdo con Raymond, es mejor bloquearse en estos casos). Acabo de enterarme de que no sé cómo se maneja esta situación en Delphi. Es por eso que pregunto, solo por curiosidad. – Alex
¿Qué código "conoce" inserta Delphi para expandir la pila al acceder a grandes arreglos estáticos? Nunca he visto nada por el estilo. –