debug용으로 출력하는 code를 손쉽게 on/off 하는 법?
글쓴이: aeronova / 작성시간: 금, 2006/08/11 - 12:31오후
안녕하세요,
제가 프로그램을 짜면서 중간 중간 체크를 위해 debug용으로 이런 저런 정보를 출력하도록 만들어 두었습니다.
근데, 사실 나중에 실제 사용할 때 이런 출력값들이 줄줄이 나오는 것을 원치 않아서 출력용으로 만든 부분을 일일히 comment로 처리하기엔 너무 번거로울 듯 합니다. 그래서 약간의 트릭 같은 것으로 손쉽게 처리 할 수 있는 방법이 없는지 알고 싶습니다. 일단 제가 아는 방법은 다음과 같이 컴파일시 debug 모드에 따라 코드 부분이 선택적으로 사용되는 것입니다.
#if _DEBUG ...execute this code #else ...execute in release mode #endif
근데 이 방식은 code 자체가 지저분해 보여서 좀 망설여지더군요. 좋은 방법 있으시면 추천 부탁드립니다.
감사합니다.
Forums:
저 부분을 함수로
저 부분을 함수로 만들어서 함수 안에서
를 하도록 하면 어떨까요?
어차피 릴리즈 모드에서는 최적화로 내용이 없는 함수 호출은 자동으로 삭제가 될테니까요..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
#if defined(DEBUG)? ?
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
제가쓰는건...int
제가쓰는건...int Log_write
가 가변인자 함수 이기때문에...
세가지 방법중 가운데를 선택합니다..
#ifdef DEBUG
#define DLOG_WRITE Log_write
#else
/*
#define DLOG_WRITE no_work__
*/
#define DLOG_WRITE if( 0 )
/* Pro*C error
#define DLOG_WRITE( x... )
*/
#endif
----------------------------------------------------------------------------
답변들 감사합니다.
답변들 감사합니다. 일단 다음과 같이 처리하면 될 듯 하네요.
근데 염려되는 것은 release mode에선 printMSG가 내용이 없는 함수가 되는데, 컴파일러가 알아서 없애는지 궁금합니다.
최적화 옵션을 주어야(O1 정도?) 컴파일러가 처리해 주나요?
It's better to burn out than to fade away. -- Kurt Cobain.
넵.. 최적화 옵션을
넵.. 최적화 옵션을 주셔야지만 처리가 됩니다..
그리고 저런식의 함수를 최적화 해주는건 구현체 마음이기 떄문에 100% 없앤다고는 말씀드리기는 힘듭니다.
그래도 요즘 컴파일러 성능상 저정도는 최적화 해줄거라고 믿을 뿐입니다 -_-);;
정말 최적화를 해주는지 안해주는지는 직접 어셈코드를 뽑아서 보시면 확실할 것 같습니다..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
저는 이렇게
저는 이렇게 합니다.
전 릴리스시에만 따로 지정합니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
// DEBUG mode : g++
원글쓴님 의도대로는 이렇게 해도 되겠네요.
그런데 이런 식으로는 "가변 인자를 못받지 않나요?"
printMSG("Here we go! " << 123 << 'a' << "OKAY")
라고 해서된다는 이야기는 못 들어봤거든요.
하지만 매크로를 쓸 경우 고정인자 없이 가변인자 사용가능
(ISO/IEC 9899:1999, 약칭 C99표준 의거)이라는 엄청난 장점이 있고,
va_start 등이 필요없이 바로 그냥 때려주면 끝납니다.
(그리고 C99가 주는 보너스, __func__가 있지요.)
어쨌든 위 소스에서 윗님이 제시하는 해법보다
좋은 점은 printMSG(__LINE__)등이 가능하다는 점이네요,
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
나중에 또 볼 필요가 있다면..
테스트베드에서는 문제가 발생하지 않다가 실제로 외부에서
동작하는 경우 문제가 생길 경우도 있지요.. 이런 경우
디버그 코드를 모두 배제해 버렸다면 대략 난감일 수 있습니다.
그래서 저는 데몬과 통신할 수 있는 통로를 확보한 후
데몬에게 메시지를 보내 디버그 출력에 대한 것을 조절하지요..
만약 pty를 사용하게 데몬을 작성했다면...
echo "d [on/off] [on level]" > /debug/control/interface
디버그 메시지를 출력해주는 함수를 on/off 여부 그리고 디버그 레벨을
보고 기 약속된 방식에 따라 출력할 수 있도록 작성하면 되지요..
성능에 민감하지 않다면 저른 방법을 써 보시는 것두..
댓글 달기