Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mart412 en 19 Octubre 2016, 16:36 pm



Título: "Capturar" Violación de segmento (`core' generado)
Publicado por: 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


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: dato000 en 19 Octubre 2016, 17:09 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.


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: Eternal Idol en 19 Octubre 2016, 20:34 pm
https://en.wikipedia.org/wiki/C%2B%2B#Exception_handling

Código
  1. try
  2. {
  3. int *x = 0;
  4. *x = 666;
  5. }
  6. catch(...)
  7. {
  8. cout << "doh";
  9. }

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

PD. Depurar es otra cosa.


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: class_OpenGL en 19 Octubre 2016, 21:40 pm
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 :(


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: geeke en 19 Octubre 2016, 22:44 pm
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.


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: 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. Hubiera estado bien para ciertos casos.


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: geeke en 19 Octubre 2016, 23:09 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.


Título: Re: "Capturar" Violación de segmento (`core' generado)
Publicado por: Eternal Idol en 19 Octubre 2016, 23:32 pm
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
  1. __try
  2. {
  3. int *x = 0;
  4. *x = 666;
  5. }
  6. __except( EXCEPTION_EXECUTE_HANDLER)
  7. {
  8. cout << " doh";
  9. }

Y mas informacion para concluir: https://en.wikipedia.org/wiki/Segmentation_fault