"Capturar" Violación de segmento (`core' generado)

Iniciado por mart412, 19 Octubre 2016, 16:36 PM

0 Miembros y 1 Visitante están viendo este tema.

mart412

Buenas, mi duda es sobre si es posible capturar de alguna forma un error de violacion de segmento para que el programa no 'explote'. Gracias

dato000

Cita de: mart412 en 19 Octubre 2016, 16:36 PM
Buenas, mi duda es sobre si es posible capturar de alguna forma un error de violacion de segmento para que el programa no 'explote'. Gracias

Claro que se puede, el proceso para eso se llama debug.



Eternal Idol

https://en.wikipedia.org/wiki/C%2B%2B#Exception_handling

Código (c++) [Seleccionar]
try
{
int *x = 0;
*x = 666;
}
catch(...)
{
cout << "doh";
}


Ahora podes investigar al respecto, te recomiendo leer el capitulo correspondiente de cualquier libro de C++.

PD. Depurar es otra cosa.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

class_OpenGL

Yo me había alegrado tanto cuando Eternal Idol había puesto ese código, creyendo yo que se podría manejar una excepción de acceso de memoria no permitido... pero no funciona, el programa ese se cuelga (crash) en Windows 8.1... Lástima :(

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

geeke

No puedes usar los bloques try/catch para capturar un segmentation fault, porque no es una excepción mas bien es una señal que el sistema operativo envía como consecuencia al intentar acceder en alguna zona de memoria no permitida. Además no veo razón para hacer esto, porque continuar el programa después no es posible se invocaría comportamiento indefinido y esto no es nada seguro.

class_OpenGL

Hablando de CPU, si que se trataría de una excepción (lanzada por la CPU). Otra cosa es lo que considera C++/Sistema Operativo. Hubiera estado bien para ciertos casos.

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

geeke

Cita de: class_OpenGL en 19 Octubre 2016, 22:56 PM
Hablando de CPU, si que se trataría de una excepción (lanzada por la CPU). Otra cosa es lo que considera C++/Sistema Operativo.

Tienes razón es una excepción lanzada por la CPU, pero el sistema operativo la envía como una señal de que ocurrió algún error a nivel hardware.

Eternal Idol

#7
Ese es el mecanismo standard que provee el lenguaje C++ para capturar excepciones lo cual no implica que esta en particular sea controlada por C++. En Windows, donde no hay ninguna señal, el codigo funciona perfectamente con VC++ (aunque lo ideal seria usar SEH). En POSIX tenes: https://en.wikipedia.org/wiki/Sigaction

Código (c++) [Seleccionar]
__try
{
int *x = 0;
*x = 666;
}
__except( EXCEPTION_EXECUTE_HANDLER)
{
cout << " doh";
}


Y mas informacion para concluir: https://en.wikipedia.org/wiki/Segmentation_fault
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón