ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알람 시그널을 이용하여 의도하지 않은 무한루프 디버깅
    c++ 2013. 7. 3. 21:46
    728x90
    반응형

    개발환경 : 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글을 참고.


    'c++' 카테고리의 다른 글

    The language server crashed. Restarting...  (0) 2024.02.21
    string을 sprintf, printf 형식으로 사용하기  (0) 2013.07.04
    디버깅, call stack back trace  (0) 2013.07.03
Designed by Tistory.