[C++] Segmentation Fault를 예외처리할수 있나요?

kuaaan의 이미지

Segmentation Fault가 떴을때 최소한 어디서 떴다 정도라도 기록하게 하고 싶습니다.
Segmentation Fault를 try ~ catch나 기타 적당한 방법으로 핸들링할수 있는지 궁금합니다.

#include <stdlib.h>
#include <stdio.h>
int main()
{
try
{
        printf("test : %d\n", atoi(NULL));
} catch( ... )
{
        printf("Fault!!!\n");\
}

}

[root@fedora a]# ./a.out
세그멘테이션 오류
[root@fedora a]#

안되네요... ^^;;;

익명 사용자의 이미지

kuaaan wrote:
Segmentation Fault가 떴을때 최소한 어디서 떴다 정도라도 기록하게 하고 싶습니다.
Segmentation Fault를 try ~ catch나 기타 적당한 방법으로 핸들링할수 있는지 궁금합니다.

#include <stdlib.h>
#include <stdio.h>
int main()
{
try
{
        printf("test : %d\n", atoi(NULL));
} catch( ... )
{
        printf("Fault!!!\n");\
}

}

[root@fedora a]# ./a.out
세그멘테이션 오류
[root@fedora a]#

안되네요... ^^;;;

#include <exception>
using namespace std;

int
main(int,char**)
{
  try { int i=1/0; }
  catch(const exception& e)
  { cout << e.what() << endl; }

  return 0;
}
김정태의 이미지

memory access violation의 경우 VC++에서는 위와 같은 방식의 exception 처리가 가능하지만 UN*X 계열의 경우에는 catch가 되지 않는 것으로 기억하고 있습니다.

구지 하시려면 signal () 함수 쪽을 이용해야 하지 않을까 생각됩니다.

cinsk의 이미지

좀 까다로운 부분인데, 간단히 말해서, C++에서 signal handler로 쓸 수 있는 함수는, C 언어의 기능만을 써서 구현된 함수(POF, Plain Old function)이어야 합니다.

어디까지 C 언어의 기능을 쓸 수 있는냐? 이건 또 다른 문제입니다. 전웅님과 같은 분이 대답해 주시길 바랍니다. ISO C++ 표준이 1998에 제정된 것을 보면, C99 이전의 표준을 기준으로 한 것 같습니다.

안전하게 하려면.. for (int i = 0; ...) 등과 같은 식도 써서는 안되고, C 언어에 없는 C++ 기능, 예를 들어 throw/catch 등을 쓸 수도 없습니다.

물론 잘 알려진 것처럼 _Exit(), abort()를 제외한 나머지 표준 함수들도 쓸 수 없습니다.

결국 C++ exception으로 만들기는, 표준에 따르면 불가능하고, 실제 구현할 수 있느냐도 불투명합니다. C++ and Signal Handling도 참고하기 바랍니다.