c++2013.07.03 21:46

개발환경 : C++/STL/Linux/gcc

프로그램을 짜다 보면 잘 못 짜서  어디선가 무한루프에 빠져서 헤어나질 못하는 경우가 종종 있는데, 이럴때 SIGALRM을 이용하여 이 녀석이 대체 무슨 짓을 하고 있었는지 자세하게 확인할 수 있다.

// signal handler

static void SigAlarm(int signo)

{

        ...

        closing_routine();

        ....

abort(); // exit with core_dump

}


int main(){

// 핸들러 설정

if(signal(SIGALRM, SigAlarm) == SIG_ERR) ERROR("signal ALARM error");

...

// main loop
while(1){

alarm(5); // 알람설정 5초

...

do_something();

...

alarm(0); // 알람 해제

}

}


SIGALRM에 대한 핸들러를 설정해두고, alarm(n)함수를 호출하면, n초후에 핸들러가 호출된다. 문제가 없을 경우 알람을 해제하고, 전체적으로 이 과정을 반복하도록 하였다. 

위 소스에서는 알람이 발생되면, 메인루프의 한 턴을 5초이상 쓰고 있다는 것인데, 이런 경우는 비정상적인 상황이라고 판단하여 코어 덤프하고 종료하도록 하였다. 나중에 gdb 를 이용하면 무슨짓을 하고 있었는지 상세하게 확인할 수 있다. 

앞서 포스트의 Call stack, Back trace글을 참고.


Posted by Jadumate