2012-10-30 2 views
1

나는 stack unwinding에 대한 지식을 얻으 려하고 this page을 보았습니다. 아래 예제를 통해 알 수 있습니다. 이 cpp 코드 조각은 어떻게 덤프합니까?

#include <iostream> 
using namespace std; 

struct E { 
    const char* message; 
    E(const char* arg) : message(arg) { } 
}; 

void my_terminate() { 
    cout << "Call to my_terminate" << endl; 
}; 

struct A { 
    A() { cout << "In constructor of A" << endl; } 
    ~A() { 
    cout << "In destructor of A" << endl; 
    throw E("Exception thrown in ~A()"); 
    } 
}; 

struct B { 
    B() { cout << "In constructor of B" << endl; } 
    ~B() { cout << "In destructor of B" << endl; } 
}; 

int main() { 
    set_terminate(my_terminate); 

    try { 
    cout << "In try block" << endl; 
    A a; 
    B b; 
    throw("Exception thrown in try block of main()"); 
    } 
    catch (const char* e) { 
    cout << "Exception: " << e << endl; 
    } 
    catch (...) { 
    cout << "Some exception caught in main()" << endl; 
    } 

    cout << "Resume execution of main()" << endl; 
} 

내가 컴파일 할 때이 코어 덤프있어 그러나 그램 ++ 다음과 같이 /*clang++*.The 출력은 다음과 같습니다

In try block 
In constructor of A 
In constructor of B 
In destructor of B 
In destructor of A 
Call to my_terminate 
已放弃 (核心已转储) #core dump 

사람이 나에게 몇 가지 힌트를 줄 수 있습니까?

+2

글쎄, 당신의'terminate'는 ... 프로그램을 종료하지 않았습니다! – avakar

답변

2

대답은 예외를 throw하는 동안 예외가 발생한다는 것입니다.

main()에서 A 인스턴스를 생성합니다. 그런 다음 예외가 발생합니다. 전에는 A::~A이 호출되었으므로 이 예외를 throw합니다. 동시에 두 개의 예외가 발생하면 terminate() (또는 사용자가 제공하는 해당 함수)가 호출됩니다 (기본적으로 abort()가 호출되어 코어가 삭제됨).

옆으로 : 이것이 프로그램을 죽이지 않는다면 예외를 던져서는 안되는 일반적인 모범 사례 규칙입니다.

+0

*는 terminate가 호출되도록합니다 (기본적으로 abort()를 호출하여 코어를 삭제합니다.) 코드를 제대로 보지 못했습니다 .OP에 종료 처리기가 있습니다. –

+0

@Als 그래, 그랬어. –

+0

@KazDragon 'my_terminate()'가 지정되어 있어도 프로그램을 복구 할 수 없다는 것을 의미합니까? –

0

set_terminate()은 기능을 제공 할 것으로 예상합니다. terminate 프로그램.

매개 변수를 사용하지 않고 void를 반환하는 함수. 함수는을 반환하지 않으며 프로그램을 종료합니다. terminate_handler는 매개 변수를 사용하지 않고 void를 반환하는 함수 포인터 유형입니다.

set_terminate는 제공된 함수에서 종료하지 않으면 종료 함수를 호출 한 후 자동으로 abort()를 호출합니다. 이 abort() 메시지가 표시되지 않도록 my_terminate()exit(0);을 입력하기 만하면됩니다.

+0

그럼이 세그먼트를 어떻게 수정할 수 있습니까? –

+0

C++ 표준 (18.6.3.3) **은 프로그램을 종료하기 위해'terminate()'를 요구하지 않습니다 **. –

+0

@Als 왜 내가 인용 한 것을 읽었습니까? [here] (http://www.cplusplus.com/reference/std/exception/set_terminate/)에서 – tomahh

관련 문제