검색결과 리스트
글
TIZEN Native 단계에서 LOG를 활용해보자!
프로그래머로서 코딩을 할 때 가장 중요한 요소가 무엇이냐 누군가가 묻는다면 저는 자신의 결과물을 직접 확인할 수 있는 LOG를 보는 것이라고 말하고 싶군요. 프로그램을 제작하던 도중 잘못된 동작을 하는 부분이 어떠한 문제가 있는지 알고 싶을 때 이 LOG가 어떤 때보다 가장 빛을 발하게 되지요!
특히 안드로이드의 경우 logcat(로그캣)이라는 기능이 있어 자신이 제작한 프로그램의 로그를 손쉽게 확인할 수 있는 기능을 갖추고 있습니다.
이토록 편리한 로그캣과 같은 기능이 TIZEN에서도 사용이 가능할까요? 정답을 말씀드리자면 Yes입니다. 다만, Android의 로그캣을 쓰는 것 처럼 Java 단계에서 손쉽게 로그를 보는 방식이 아니라는 점이 상당히 아쉬운 부분입니다.
어찌보면 타이젠의 SDK도 안드로이드의 로그캣을 밴치마킹한 듯 비슷해 보이지만 아무쪼록 TIZEN의 Native 단계에서 로그를 확인하는 방법을 살펴보도록 하겠습니다!
TIZEN의 Native 단계에서 로그를 확인하고 싶을 때 해당 소스코드에 dlog.h를 include 해줍니다.
int dlog_print (log_priority prio, const char *tag, const char *fmt,...)
이 부분에서 자신이 출력하고자 하는 내용을 입력합니다.
log_priority prio
log_priority 부분에는 해당 로그의 속성을 설정합니다. 로그 속성의 종류는 다음과 같습니다.
DLOG_DEBUG : 개발자가 확인해보고자 하는 내용
DLOG_INFO : 일반적인 정보 메시지. 이 로그는 항상 출력됩니다.
DLOG_WARN : 에러는 아니지만 의도하지 않은 에러가 발생할 가능성이 있을 때 나타나는 메시지. 이 로그는 항상 출력됩니다.
DLOG_ERROR : 에러 발생시 출력. 이 로그는 항상 출력됩니다.
대략적으로 로그의 속성들은 위와 같이 정의되고 있습니다만, 자신이 쓰고 싶은 속성을 선택하시면 해당 선택사항대로 로그가 출력됩니다.
const char *tag
해당 로그의 태그를 입력합니다 태그를 설정해두면 이후 자신이 찾고자 하는 로그를 확인하는 것이 수월해집니다.
const char *fmt,...
해당 로그에서 출력하고자 하는 메시지를 입력합니다.
위에서 설명드린 dlog_print() 함수를 적절히 사용하신다면 TIZEN의 Native 환경에서 로그를 보는 것이 상당히 수월해질 것입니다. 혹시 출력하고자 하는 메시지가 있다면 sprintf() 함수를 통해 출력하고자 하는 내용을 설정해 주시면 되겠습니다.
아래는 dlog_print() 함수가 적용된 예제와 그 결과를 나타내고 있습니다. 아래의 소스코드를 참조하시고 여러분들도 TIZEN Native 프로그레밍이 한층 더 수월하게 진행되셨으면 합니다!
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <dlog.h> #include <signal.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <limits.h> #include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <vconf-keys.h> #include <Ecore.h> .... static int default_trans(int evt) { struct state *st = &states[pm_cur_state]; int next_state; next_state = (enum state_t)trans_table[pm_cur_state][evt]; sprintf(pbuffer,"current state : %d, next state : %d, evt : %d", pm_cur_state ,next_state, evt); dlog_print(DLOG_INFO, "USR_TAG", pbuffer); /* check conditions */ while (st->check && !st->check(next_state)) { /* There is a condition. */ if (standby_mode) { _D("standby mode, goto next_state %s", state_string[next_state]); break; } _I("%s -> %s : check fail", state_string[pm_cur_state], state_string[next_state]); if (!check_processes(next_state)) { /* this is valid condition - the application that sent the condition is running now. */ return -1; } } /* smart stay */ if (display_info.face_detection && (pm_status_flag & SMAST_FLAG) && hallic_open) { if (display_info.face_detection(evt, pm_cur_state, next_state)) return 0; } /* state transition */ pm_old_state = pm_cur_state; pm_cur_state = next_state; st = &states[pm_cur_state]; /* enter action */ if (st->action) { if (pm_cur_state == S_LCDOFF) update_lcdoff_source(VCONFKEY_PM_LCDOFF_BY_TIMEOUT); if (pm_cur_state == S_NORMAL || pm_cur_state == S_LCDOFF) if (set_custom_lcdon_timeout(0) == true) update_display_time(); if (check_lcdoff_direct() == true) { /* enter next state directly */ states[pm_cur_state].trans(EVENT_TIMEOUT); } else { st->action(st->timeout); } } return 0; } | cs |
/framework/system/deviced/src/display/device-interface.c
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <dlog.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <limits.h> #include <math.h> #include <journal/display.h> .... static int _bl_brt(PMSys *p, int brightness, int delay) { int ret = -1; int cmd; int prev; char pbuffer[100]; sprintf(pbuffer,"bright : %d, delay : %d", brightness, delay); dlog_print(DLOG_INFO, "USR_TAG", pbuffer); if (delay > 0) usleep(delay); if (force_brightness > 0 && brightness != p->dim_brt) { _I("brightness(%d), force brightness(%d)", brightness, force_brightness); brightness = force_brightness; } cmd = DISP_CMD(PROP_DISPLAY_BRIGHTNESS, DEFAULT_DISPLAY); ret = device_get_property(DEVICE_TYPE_DISPLAY, cmd, &prev); /* Update new brightness to vconf */ if (!ret && (brightness != prev)) { vconf_set_int(VCONFKEY_PM_CURRENT_BRIGHTNESS, brightness); } /* Update device brightness */ ret = device_set_property(DEVICE_TYPE_DISPLAY, cmd, brightness); _I("set brightness %d, %d", brightness, ret); return ret; } | cs |
Native 단계에서 위와 같이 설정을 해주셨다면 아래와 같이 자신이 설정한 프로그램의 진행중인 값을 로그를 통해 실시간으로 확인하실 수 있습니다.
(아래 스크린샷의 경우 필자가 내용을 수정하였기 때문에 각자의 환경에서는 로그가 다른 결과로 출력됩니다.)
'공대생의 팁' 카테고리의 다른 글
Ubuntu에서 특정 Unicode가 안보일 때 (0) | 2015.07.22 |
---|---|
GFDM(Generalized Frequency Domain Multiplexing) (0) | 2015.06.06 |
Tizen Mobile Native App Programming - 네이티브 센서 예제 분석 (0) | 2015.05.26 |
공유기에 연결된 Linux(Ubuntu) 컴퓨터를 외부에서 원격 데스크톱 연결을 통해 조작하기 (6) | 2015.05.07 |
TIZEN 소스코드 빌드 gbs가 설치되지 않을 때 수동으로 설치하기 (0) | 2015.05.02 |