12월 27, 2015

assert(..) 함수란? 그리고 용도

용도

플로우 상 발생 가능한 예외 처리를 다하고, 그러고도 프로그래머가 미처 예측하지 못한 예외가 있을 수 있다고 생각될 때 사용.
보통 사용자의 입력에 의해 발생하는 예외는 (assert() 를 통해서가 아니라) 일반적인 예외 처리를 통해 모두 처리하고, 개발자가 미처 생각지 못한 에러나 시스템 상에서 발생 가능한 에러 등 '모든 경우를 검토했지만 그래도 혹시 있을지 모르는 예외'에 대비하여 사용. '디버깅 페이즈에서 벗어나면 assert() 함수는 보통 disable 되기 때문에, 이 함수는 사용자나 런타임 에러를 잡기 위한 것이 아니라 프로그램 에러를 잡기 위한 것이다.' (cplusplus)
또한 디버깅 시에 assert() 함수를 사용하고 실제 릴리즈되는 코드에선 assert() 함수를 빼고 컴파일할 수 있어 성능에 거의 미치지 않음..

사용 예시

assert(stmt)의 stmt가 0이면 'stmt'를 출력하고 프로그램 중지.
컴파일 시 #define NDEBUG를 정의하면 모든 assert() 함수를 제외하고 컴파일하게 됨.

처리

보통 서버 사이드의 경우 assert(..)를 삽입해두고 테스트를 돌리면 하루에도 몇번씩 서버가 멈추어 재시작하게 됨.
따라서 서버 사이드 개발 과정에서는 assert(..)로 인해 서버가 멈추는 경우 자동으로 크래쉬 덤프를 남기고 재시작하도록 자동화하고, 남는 시간에 크래시 덤프를 분석하고 디버깅하는 것이 일반적.

참고

assert() 에 대하여 ..... |KLDP
assert 주어진 조건 확인
assert |cpluscplus

댓글 없음:

댓글 쓰기