[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도 참고하기 바랍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.