TIZEN Native 단계에서 LOG를 활용해보자!

공대생의 팁 2015. 6. 5. 23:59

 프로그래머로서 코딩을 할 때 가장 중요한 요소가 무엇이냐 누군가가 묻는다면 저는 자신의 결과물을 직접 확인할 수 있는 LOG를 보는 것이라고 말하고 싶군요. 프로그램을 제작하던 도중 잘못된 동작을 하는 부분이 어떠한 문제가 있는지 알고 싶을 때 이 LOG가 어떤 때보다 가장 빛을 발하게 되지요!

 특히 안드로이드의 경우 logcat(로그캣)이라는 기능이 있어 자신이 제작한 프로그램의 로그를 손쉽게 확인할 수 있는 기능을 갖추고 있습니다.


 이토록 편리한 로그캣과 같은 기능이 TIZEN에서도 사용이 가능할까요? 정답을 말씀드리자면 Yes입니다. 다만, Android의 로그캣을 쓰는 것 처럼 Java 단계에서 손쉽게 로그를 보는 방식이 아니라는 점이 상당히 아쉬운 부분입니다.




 어찌보면 타이젠의 SDK도 안드로이드의 로그캣을 밴치마킹한 듯 비슷해 보이지만 아무쪼록 TIZEN의 Native 단계에서 로그를 확인하는 방법을 살펴보도록 하겠습니다!


#include <dlog.h>

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 프로그레밍이 한층 더 수월하게 진행되셨으면 합니다!


/framework/system/deviced/src/display/core.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
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 단계에서 위와 같이 설정을 해주셨다면 아래와 같이 자신이 설정한 프로그램의 진행중인 값을 로그를 통해 실시간으로 확인하실 수 있습니다.

(아래 스크린샷의 경우 필자가 내용을 수정하였기 때문에 각자의 환경에서는 로그가 다른 결과로 출력됩니다.)




300x250