2016년 5월 11일 수요일

Tizen Gear S2에서 지역에 따른 date 출력 방법

Tizen Gear S2에서 locale에 따른 date를 출력하기 위해 찾아봄

i18n (Internationalization)
: https://ko.wikipedia.org/wiki/%EA%B5%AD%EC%A0%9C%ED%99%94%EC%99%80_%EC%A7%80%EC%97%AD%ED%99%94

Tizen i18n Tutorial & Guide
: https://developer.tizen.org/ko/development/api-tutorials/native-application/base/i18n#dates
 : https://developer.tizen.org/ko/development/guides/native-application/base/i18n?langredirect=1

Get System Settings for Current Locale, Time Zone
 : https://developer.tizen.org/ko/development/tutorials/native-application/system/system-settings
 : https://developer.tizen.org/ko/development/guides/native-application/system/system-settings?langredirect=1

Date, Time Display Guide by Time Zones
 : https://developer.tizen.org/ko/development/api-tutorials/web-application/tizen-features/system/time



<샘플코드>

#include <utils_i18n.h>
#include <system_settings.h>

bool print_loca_date()
{
i18n_udatepg_h pattern_generator = NULL;
char *locale;

if (SYSTEM_SETTINGS_ERROR_NONE != system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, &locale))
return false;
dlog_print(DLOG_INFO, LOG_TAG, "Current Locale Country : %s\n", locale);

i18n_udatepg_create(locale, &pattern_generator);
if (!pattern_generator)
return false;

i18n_uchar bestPattern[64] = {0,};
char bestPatternString[64] = {0,};
int bestPatternLength, len;
const char *custom_format = "EEE, MMM d, yyyy 'at' HH:mm:ss zzz";
i18n_uchar uch_custom_format[64];

i18n_ustring_copy_ua(uch_custom_format, custom_format);
len = i18n_ustring_get_length(uch_custom_format);
i18n_udatepg_get_best_pattern(pattern_generator, uch_custom_format, len, bestPattern, 64, &bestPatternLength);
i18n_ustring_copy_au_n(bestPatternString, bestPattern, 64);
dlog_print(DLOG_INFO, LOG_TAG, "BestPattern(char[]) : %s \n", bestPatternString);
i18n_udatepg_destroy(pattern_generator);

i18n_udate_format_h formatter_Current = NULL;
i18n_uchar formatted[64] = {0,};
char result[64] = {0,};
int formattedLength;
i18n_udate date;
char *timezone_Current;
i18n_uchar utf16_timezone_Current[64] = {0,};

if (SYSTEM_SETTINGS_ERROR_NONE != system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_Current))
return false;

i18n_ustring_copy_ua_n(utf16_timezone_Current, timezone_Current, strlen(timezone_Current));
if (I18N_ERROR_NONE != i18n_udate_create(I18N_UDATE_PATTERN , I18N_UDATE_PATTERN , locale,
utf16_timezone_Current, -1, bestPattern, -1, &formatter_Current))
return false;

if (utf16_timezone_Current)
{
i18n_ucalendar_get_now(&date);
i18n_udate_format_date(formatter_Current, date, formatted, 64, NULL, &formattedLength);
i18n_ustring_copy_au_n(result, formatted, 64);
dlog_print(DLOG_INFO, LOG_TAG, "Current Date : %s\n",result);
}
i18n_udate_destroy(formatter_Current);
return true;
}

<결과>

Current Locale Country : en_US
BestPattern(char[]) : EEE, MMM d, yyyy, h:mm:ss a zzz
Current Date : Thu, May 12, 2016, 11:22:56 AM GMT+9

Current Locale Country : de_DE
BestPattern(char[]) : EEE, d. MMM yyyy HH:mm:ss zzz
Current Date : Do., 12. Mai 2016 11:23:33 GMT+9

Current Locale Country : ko_KR
BestPattern(char[]) : yyyy년 MMM d일 (EEE) a h시 m분 s초 zzz
Current Date : 2016년 5월 12일 (목) 오전 11시 24분 13초 GMT+9

Current Locale Country : zh_CN
BestPattern(char[]) : yyyy年M月d日EEE zzzah:mm:ss
Current Date : 2016年5月12日星期四 GMT+9AM11:24:48

Current Locale Country : ja_JP
BestPattern(char[]) : yyyy年M月d日(EEE) H:mm:ss zzz
Current Date : 2016年5月12日(木) 11:25:13 GMT+9

Current Locale Country : hi_IN
BestPattern(char[]) : EEE, d MMM yyyy h:mm:ss a zzz
Current Date : गुरु, 12 मई 2016 11:26:29 AM GMT+9

2016년 5월 6일 금요일

Tizen Native app 개발 시 crash information에서 crash point file, line number 확인 방법

Tizen Native App의 crash 발생 시
crash information을 통해 crash가 발생된 file과 위치(line number)를 확인하는 방법을 정리함.

Native app 개발 하다 보면 Crash를 자주 보게 되는데
그냥 log만 사용해서 확인하자니 빌드 및 실행, 로그 추가로 좀 비효율적임.

다른 디버깅 방법으로 crash 발생 시 생성되는 crash information 중  callstack과
linux에서 개발을 하여 shell을 사용할 수 있다면
간단하게 crash가 발생한 위치를 addr2line을 사용하여 파악할 수 있다.



[Crash information 획득]


Tizen SDK를 사용하고 단말(Gear S2)가 연결이 되어 있는 상태라면
Crash 발생 시 자동으로 SDK에서 call stack view(Window > Show View > Call Stack)를 통해서 보여주게 된다.

Call Stack View를 통해 Crash information, Call stack, Crash 발생 당시 Log를 확인 가능하며
아래 사진은 Sample app을 사용하여 crash를 발생 시킨 것이라 다소 call stack depth가 얕다.

그리고 call stack 내에 app의 binary(ex basicuiw)의 실행 내역이 포함되어 있어야 해당 실행 주소를 사용하여 위치를 확인할 수 있다.




Callstack Information (PID:32525)
Call Stack Count: 1
 0: create_base_gui + 0x1c9 (0x4155e13a) [/opt/usr/apps/org.example.basicuiw/bin/basicuiw] + 0x113a
End of Call Stack


Call Stack에서 basicuiw 앱의 create_base_gui 함수에서 발생되었고 주소는 0x113a임을 알 수 있다.
이를 addr2line을 사용하여 확인하려면 다음과 같이 실행한다.
* 다만 여기서 사용하는 앱 바이너리(basicuiw) crash가 발생된 bianry와 같아야 한다.
   만약 crash 발생 이후 다시 컴파일을 했다면 위치를 확인하기가 어렵다.

hhh@:~/workspace_tizen/BasicUIw/Debug$ pwd
/home/hhh/workspace_tizen/BasicUIw/Debug
hhh@:~/workspace_tizen/BasicUIw/Debug$ addr2line -C -f -e basicuiw 0x113a
create_base_gui
/home/hhh/workspace_tizen/BasicUIw/Debug/../src/basicuiw.c:71

Crash는 basicuiw.c의 71번 line에서 발생한 것을 확인하였고
해당 위치를 확인하면 다음과 같이 crash가 발생하도록 작성한 코드가 맞음을 알 수 있음.




참고로 crash information들은 다음의 위치들에 저장이 된다.
SDK가 설치된 host pc의 app project 내 crash-info 폴더(연결 중 crash가 발생했다면)나
단말내 /opt/usr/share/crash/report 에서 확인할 수 있다.