일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- sw
- RapidCheck
- 지능형
- Linux
- 영상분석
- 머신러닝
- tracking
- Python
- Raspberry
- Video
- 서버
- 디버그모드
- Object Detection
- MySQL
- 데이터
- 라즈베리파이
- C언어
- IMAGE
- keras
- 안드로이드
- detection
- 정리
- 고급C
- tensorflow
- 가상환경
- php
- Deep Learning
- FLASK
- Android
- Machine Learning
- Today
- Total
건프의 소소한 개발이야기
[고급 C] Debug Message 잘 보는 방법 (4) - 디버그모드 동적으로 정의하기 본문
안녕하세요, 건프입니다.
이전 장에서 DBGMSG 매크로 함수를 정의해서 사용하는 방법에 대해서 알아보았습니다.
이번에는, 좀 더 유동적으로
컴파일시 디버그 옵션을 주면서, 디버그 메세지를 찍을지 말지를 선택할 수 있는 예를 알아보려고 합니다.
힌트는 매크로의 #ifdef endif 를 이용하는 겁니다 :)
코드는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> #ifdef DEBUG #define ANSI_COLOR_RED "\x1b[31m" #define ANSI_COLOR_RESET "\x1b[0m" #define DEBUG_PREFIX ANSI_COLOR_RED " << DEGMSG >> " #define DEGMSG(msg,...) fprintf(stderr, DEBUG_PREFIX "[%s %s %d] : " msg "\n" ANSI_COLOR_RESET, \ __FILE__, __func__, __LINE__, ##__VA_ARGS__) #else #define DEGMSG(...) #endif void example( int e){ e += 20; DEGMSG( "e : %d\n" , e); } int main(){ int val1 = 2; int val2 = 10; DEGMSG( "Let's start!" ); printf ( "val1+val2 : %d\n" , val1+val2); DEGMSG( "val1 : %d, val2 : %d\n" , val1, val2); example(val1); return 0; } |
DEBUG 라는 매크로가 정의되어 있다면, 이전 코드와 같이 정의하고,
만약 아니라면, 비어있는 DEGMSG 함수를 정의해둡니다.
이렇게 짜둔 프로그램은 다음과 같이 활용이 가능합니다.
> gcc dmesg.c -Wall -o dmesg
-Wall : 모든 Warning message 를 출력해달라
-o : other name : 컴파일을 하고 실행파일 이름을 뒤에 오는 이름으로 정의해달라
결과를 보시면, DEGMSG로 출력되는 내용이 찍히지 않습니다. 디버그 모드를 주지 않았기 때문이에요.
그렇다면?
> gcc dmesg.c -Wall -o dmesg -DDEBUG
-D : 컴파일시 동적으로 매크로를 정의한다
컴파일을 하면서 동적으로 DEBUG를 정의해주었으니, 컴파일할때는 DEGMSG 함수의 내용물이 들어간 상태로 컴파일됩니다.
즉 디버그 메세지를 찍게되는 프로그램을 만들어 내는 것이죠.
훨씬 세련되게 프로그램을 짤 수 있지 않나요? ㅎㅎ
한가지를 더 확인해봅니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> #include <unistd.h> #ifdef DEBUG #define ANSI_COLOR_RED "\x1b[31m" #define ANSI_COLOR_RESET "\x1b[0m" #define DEBUG_PREFIX ANSI_COLOR_RED " << DEGMSG >> " #define DEGMSG(msg,...) fprintf(stderr, DEBUG_PREFIX "[%s %s %d] : " msg "\n" ANSI_COLOR_RESET, \ __FILE__, __func__, __LINE__, ##__VA_ARGS__) #else #define DEGMSG(...) #endif int main(){ int i; for (i=0;i<=20;i++){ DEGMSG( "%d job processing" , i); if (i%3==0) printf ( "i:%d\n" , i); sleep(1); } printf ( "program completed!\n" ); return 0; } |
위 프로그램을 그냥 실행시키면 다음과 같습니다.
표준 출력으로 나오는 것만 콘솔창에 찍히겠죠.
그런데 만약에,
디버그모드를 설정해주고,
그 표준 에러 메세지를 리다이렉트시켜, 로그파일에 쓰도록 만들고
그 로그파일을 다른 콘솔창에서 추적해 보여주도록 만든다면,
실시간 상태 감시 상황을 만들 수 있습니다.
> gcc tail.c -o tail -DDEBUG
> ./tail 2> stderr_log
> tail -f stderr_log
tail : 파일의 끝을 추적하는 프로그램
-f : 실시간으로 그때그때 추적하는 옵션
동영상으로 보여드리지 못하는게 굉장히 아쉬운데
실행시켜보시면, 왼쪽(표준출력) 은 3초마다 한번씩 콘솔창에 찍히고
오른쪽(표준에러) 로그파일을 찍는 프로그램은 1초마다 그 내용물을 찍고 추적하는 모습을 확인할 수 있습니다.
준비한 것은 여기까지입니다.
보시면 알겠지만, 서버프로그램 같은 것을 돌리면서, 유저가 어떤 요청을 날리는지, 어떤 상태인지를 실시간으로 확인하는 방법 등으로 활용이 가능할 것 같습니다.
고맙습니다 :)
' 개발 이야기 > 고급 C 이야기' 카테고리의 다른 글
[고급 C] Debug Message 잘 보는 방법 (3) - 매크로함수 정의하여 사용하기 (0) | 2016.05.01 |
---|---|
[고급 C] Debug Message 잘 보는 방법 (2) - 표준 입력/출력 (0) | 2016.05.01 |
[고급 C] Debug Message 잘 보는 방법 (1) - 미리 정의된 매크로 이용 (0) | 2016.05.01 |