2011년 6월 20일 월요일

난 assert() 대신 int 3를 쓴다.


물론 C 언어에서 제공하는 assert() 함수가 있다. 하지만 난 이걸 사용하지 않는다. 이 함수가 제공하는 callstack 꼬라지가 맘에 안들어서... -_-  assert()에 실패한 코드라인이 callstack 젤 위에 등장해야 하는데 도무지 그러지가 않으니까.. 물론 callstack을 적당히 조작해서 assert()에 실패한 라인을 젤 위에 나오게 하는 꽁수도 있으나.. 매우 복잡해서 생락.... 대신 난 다음과 같은 ASSERT() 매크로를 만들어 사용한다.

#define ASSERT(expr, ...) if(!(expr)) __asm{ int 3 }

이 매크로가 하는일은 ASSERT에 실패할 때 그냥 코드 실행을 중지(break)하는 것... 이걸 사용하는 예는 다음과 같다.

ASSERT( life == sucks, "인생이 x같지 않다니 말이 되냐!?");

위의 문자열 메시지는 프로그래머가 코드 읽는데 도움이 되라고 있는 것.. 위 ASSERT()가 실패하면 디버거 에서 저 코드라인이 등장하니 그냥 문자열을 읽는 것만으로도 뭐가 문제인지 알수 있다.

이 방법은 하드웨어 인터럽트를 사용하므로.. PC에서만 돈다.. PowerPC 계열의 CPU에서 돌릴려면 다음과 같이 해야한단다.

#define ASSERT(expr, ...) if(!(expr)) asm{trap}

즐 코딩?

댓글 6개:

  1. 음?
    #define ASSERT(expr, ...) __asm{ int 3 }
    에서, expr 는 어디로...........?
    #define ASSERT(expr, ...) if(expr) __asm{ int 3 } 인가요?
    - Hybrid

    답글삭제
  2. 그게 맞네요.. 대충 쓰다보니 빼먹었어요. 고쳤습니다. 감사 ^^

    답글삭제
  3. 앗, 저도 !를 빼먹었군요 -ㅅ-;

    답글삭제
  4. 우리는 대충 사는 프로그래머? -_-

    답글삭제
  5. #define ASSERT(expr, ...) if(!expr) __asm{ int 3 }
    를 아래로 고치지 않으면 후회할일이 있을겁니다
    #define ASSERT(expr, ...) if(!(expr)) __asm{ int 3 }

    답글삭제
  6. @if1live: 아 그렇네요. 지적해주셔서 감사! 본문도 고치겠습니다 ^_^

    답글삭제