NM 과 같은 별도의 프로세스도 동작하는 프로그램의 경우, 수행 도중 죽었을 때(ex: Segmentation fault) 이에 대한 디버깅이 쉽지 않다. 기본적으로 DTV 프로세스 안에서 Thread 로 동작하는 경우에는 Latch-up 화면(노란색 바탕에 call stack 정보를 출력함)이 나타나기 때문에 문제의 원인 및 디버깅이 비교적 용이하다.
문제는 별도로 동작하는 프로세스들(ex: NM, Addon, DLNA 등)의 경우에는 이러한 정보를 출력해주지 않는다는 것이다. 여기서는 기존의 DTV 프로세스와 같이 해당 프로세스가 죽었을 때, 이에 대한 call stack 을 출력해주는 lgexc 라이브러리의 사용법에 대해 설명한다.

lgexc 사용하기

소프트웨어 센터에서 만든 디버그 라이브러리로서, 빌드시 이를 포함하여야 해당 프로세스가 죽었을 때, call stack 정보를 볼 수 있다.
라이브러리 위치는 gp3/src/common/osa/tools/lib/bcm35230.linux 아래에 있다.
NM 의 경우, nm/networkmanager/Makefile 을 아래와 같이 추가 했다.

...
LFLAGS = -lpthread -lrt -L../../../common/osa/tools/lib/bcm35230.linux -llgexc             # 추가
...

디버깅 심볼 파일 생성하기

lgexc 라이브러리 링크한 것만으로도 프로세스가 죽었을 때, call stack 정보는 출력된다. 하지만, 메모리 주소값이 찍히기 때문에 정확히 어떤 루틴을 호출했는지는 알 수가 없다. 의미있는 정보를 보기 위해서는 심볼 테이블이 필요하다. 심볼 테이블에서는 각 메모리 주소와 함수 명이 매핑되어 있기 때문에 해당 프로세스가 죽었을 때 정확한 지점의call stack 정보를 볼 수 있다.
심볼 파일을 생성하기 위해서는 NM 의 경우, nm/networkmanager/Makefile 을 아래와 같이 추가 하면 된다.

...
MKBIZ = $(PWD)/../../../utils/mkbiz -a 0x47                    # 추가
...
 @$(MKBIZ) NetworkManager.basic                       # 추가
 @cp NetworkManager.basic.sym ../../../apps/platform/bcm35230/NetworkManager.sym          # 추가

심볼 파일은 실행 파일과 같은 디렉토리, 그리고 파일명은 '실행파일과 같은 이름.sym' 로 해야 한다. 따라서 NetworkManager.sym 으로 했다.
이를 .epk 파일에 포함시키기 위해서, build.mk 파일을 아래와 같이 추가한다.

...
COPY_DRV_FILES  += $(call cond_assign, YES, INCLUDE_NM, NetworkManager.sym,)       # 추가
...

새롭게 생성된 .epk 파일을 올리면, 해당 프로세스가 죽었을 때, call stack 정보가 출력된 시리얼 메세지를 볼 수 있다.

  • computer/lg/lgexc_라이브러리_사용하기.txt
  • Last modified: 3 years ago
  • by likewind