천재태지의 세상 돌려보기

seoz.egloos.com

- About Me... - Enlightenment, EFL - 타이젠 Tizen



[EFL] Enlightenment 크래시 알고보니 Edje 버그 ├ Enlightenment, EFL

[ EFL 게시물 목차 : http://seoz.egloos.com/3458699 ]


안녕하세요? 천재태지 서주영입니다.

낚시 뉴스기사 같은 제목을 붙였는데, 사실 제목이 모든 걸 설명해주네요 ^^

어젯밤 퇴근 후 여느때와 같이 EFL 소스 코드를 업데이트하고 Enlightenment를 재시작했는데, 똬~악~~!!!!
이런 에러 메시지가 뜨면서 Enlightenment의 아무 모듈도 로드되지 않았습니다.



Enlightenment에서 크래시가 발생하고 있었는데, 저는 단지 왜 모듈이 로드가 되지 않는지만 고민했습니다.
이 문제로 새벽에 약 한시간 가량 헤맸는데, 디버깅을 해볼걸 그랬습니다.
디버깅을 해보면 쉽게 고칠 수 있는 것을...

알고보니 Edje 라이브러리에 NULL 체크를 안 하는 코드가 있어서 죽은 것이었습니다.
그게 마침 어제 commit되었던게 문제였습니다.
Enlightenment에 gdb를 붙이자 쉽게 backtrace를 확인할 수 있었고 원인을 발견했습니다.
고맙게도 Cedric이 문제를 수정[1]해줬네요.
평소에는 버그를 만들던 Cedric이... (아래 그림 참고)


Cedric이 수정한 코드는 다음과 같습니다.


NULL 체크가 얼마나 중요한지 보여주는 순간입니다.
위 그림의 마지막부분에 있는 5130 라인을 보면 strcmp로 문자열을 비교하고 있습니다. 이 때 첫 번째 인자인 evas_object_type_get(rp->swallowed_object)가 NULL이기 때문에 크래시가 발생하는 것이었습니다.
이는 결국 rp->swallowed_object가 NULL이었기 때문에 생긴 문제입니다.

문제가 발생한 상황에서 얻은 backtrace는 다음과 같습니다.

Program received signal SIGSEGV, Segmentation fault.
0x005c5df7 in _edje_real_part_swallow_clear (rp=0x85c6eb0) at edje_util.c:5128
(gdb) bt
#0 0x005c5df7 in _edje_real_part_swallow_clear (rp=0x85c6eb0) at edje_util.c:5128
#1 0x005c5f43 in _edje_user_definition_free (eud=0x865af18) at edje_util.c:96
#2 0x005c61fb in _edje_user_def_del_cb (data=0x865af18, e=0x84d1f18, child=0x8529ad0, einfo=0x0) at edje_util.c:136
#3 0x00396e0f in evas_object_event_callback_call (obj=0x8529ad0, type=EVAS_CALLBACK_DEL, event_info=0x0, event_id=35628) at evas_callbacks.c:232
#4 0x003b5838 in evas_object_del (obj=0x8529ad0) at evas_object_main.c:442
#5 0x0364db41 in _item_set_icon (it=0x86c5870) at ng_taskbar.c:611
#6 0x0364e352 in _cb_border_event (data=0x877d4a0, type=176, event=0x84041e0) at ng_taskbar.c:303
#7 0x0049752c in _ecore_call_handler_cb (event=, type=, data=, func=0x364e1a0 <_cb_border_event>) at ecore_private.h:319
#8 _ecore_event_call () at ecore_events.c:559
#9 0x0049c12a in _ecore_main_loop_iterate_internal (once_only=0) at ecore_main.c:1900
#10 0x0049c6b7 in ecore_main_loop_begin () at ecore_main.c:934
#11 0x080732e4 in main (argc=1, argv=0xbfffeaa4) at e_main.c:1118
(gdb)

사실 이번에는 Enlightenment의 모듈에 문제가 있어서 이런 문제가 생겼다고 판단했는데, 그 원인이 Enlightenment 크래시라는 것을 몰랐습니다;;;
(에러 메시지에도 Enlightenment에서 크래시가 발생했다고 말을 해주고 있는데...)

아... 이것 때문에 새벽에 한 시간을 소비했지만, 다음부터는 Enlightenment에서 크래시가 발생하면 반드시 gdb를 붙여서 확인해봐야겠다는 중요한 교훈을 얻었습니다.

이렇게 Enlightenment는 EFL 라이브러리를 사용하고 있기 때문에 EFL에 영향을 많이 받습니다.
EFL은 많은 커미터들이 하루에도 수십개의 commit을 하기 때문에 최신 코드를 사용하면 이런 문제가 있을 수 있습니다.

혹시나 EFL이나 Enlightenment를 사용하시다가 문제가 있거나 원하는 동작이 되지 않는 경우 꼭 (저에게) 알려주시기 바랍니다~
가급적이면 빠른 시일 내에 해결할 수 있도록 하겠습니다.

감사합니다.




핑백

  • EFL 한국 사용자 모임 : EFL 한국 사용자 모임 2012-10-21 23:49:46 #

    ... 하이츨러의 EFL 발표 자료 (Linux Collaboration Summit 2012)[EFL] 'EFL 한국 사용자 모임(efl.or.kr)'을 소개합니다 Enlightenment 크래시 알고보니 Edje 버그Daum DevOn 2012 컨퍼런스에서 EFL 관련 내용 발표 예정 [IRC]irc.freenode.net(6667), #e, #edevelop, #e. ... more

덧글

댓글 입력 영역