uso - que es un puntero en c++
¿Hay alguna manera de obtener el puntero al que se accedió durante el manejo de una señal? (1)
Aproximadamente el código es este:
#include <signal.h>
void SegmentationFaultHandler( int signal ) {
if ( signal == SIGSEGV ) {
// how to check here if it''s actual null pointer?
Throw( NullPointerException, "Object pointer not set to an instance of an object." );
}
else
Throw( InvalidOperationException, "Signal has been intercepted by wrong function." );
}
int main( ) {
signal( SIGSEGV, SegmentationFaultHandler );
try {
int *i = null;
*i = 0;
...
¿Cómo puedo verificar si no revisé dos veces un puntero, o simplemente accedí a los datos no inicializados y lo deferencia?
Sé que es posible, porque los depuradores pueden saber a qué dirección intentó acceder el programa.
Parece que puede recuperar PEXCEPTION_POINTERS dentro de su controlador utilizando la variable global _pxcptinfoptrs que se declara dentro de signal.h. Luego use este puntero como en los ejemplos a continuación.
static void sigsegv_handler(int signo)
{
PEXCEPTION_POINTERS excptr = _pxcptinfoptrs;
if (excptr != NULL) {
}
// ...
}
Controlador de excepciones vectoriales
En Windows, puede usar el Controlador de excepciones de Vectored . Su controlador tendrá el siguiente aspecto:
LONG WINAPI ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionPointers ) {
entonces:
pExceptionPointers->ExceptionRecord->ExceptionCode
es usted el código de excepción, EXCEPTION_ACCESS_VIOLATION es cuando accede a la memoria no válida.
pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 0
es verdadero cuando se realizó la operación de lectura
pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 1
es para la operación de escritura
pExceptionPointers->ExceptionRecord->ExceptionInformation[1]
es la dirección que se estaba leyendo / escribiendo cuando ocurrió la excepción
Filtrado de excepciones estructuradas
Si no puede usar el manejador de excepciones vectorizadas, puede agregar __try / __ excepto en el nivel más bajo de su código, es decir. en main () o donde se está ejecutando la función de subprocesos:
__try {
// Code which might cause access violation or any other hardware exceptions
}
__except(ExceptionFilter(GetExceptionInformation())) {
}