-
알람 시그널을 이용하여 의도하지 않은 무한루프 디버깅c++ 2013. 7. 3. 21:46728x90반응형
개발환경 : 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 loopwhile(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