반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[안드로이드] call stack 로그로 출력. (java, c, kernel 영역) 본문

IT/Android

[안드로이드] call stack 로그로 출력. (java, c, kernel 영역)

현무랑 니니 2014. 11. 19. 02:07
반응형












1. 안드로이드 장치 구성 개요


위 그림처럼 안드로이드는 다양한 계층으로 이루어져 있다.

응용과 프레임웍은 자바로 만들어졌고 HAL과 라이브러리는 C, C++언어로 써졌다.

리눅스 커널은 C로 작성되었지만 커널의 특성을 알아야 한다.

마지막으로 하드웨어와 인터페이스는 물리적인 장치간 규격을 따라 어셈블리어나 C언어로 구현한다.

2. 각 계층 별 call stack 보는 방법

JAVA

안드로이드 어플 또는 프레임웍 단에서 개발 중 콜 스택을 알아야 할 때가 있다.


원하는 곳에 콜 스택을 보고 싶을 때 아래 코드 한 줄을 추가한다.

Log.d(LOG_TAG, "Stack:", new Throwable("stack dump"));


try/catch 를 이용할 때 아래 코드를 추가한다.

try {

...

} catch(Exception e) { Log.d("Some tag", Log.getStackTraceString(e.getCause().getCause())); }


C

원하는 곳에 콜 스택을 보고 싶을 때 아래 코드 한 줄을 추가한다.

int backtrace(void **buffer, int size);


C++

JB 버전까지 아래 코드로 가능하다.

#include 

CallStack stack;
stack.update(0, 31);
stack.dump();

KK 이후 버전에서는 위 코드는 오류가 나며 다른 방법으로 지원된다.



Kernel

아래와 같이 다양한 콜 스택 출력 방법이 있다.

 dump_stack()

 BUG_ON(), WARN_ON()

 save_stack_trace()

 dump_trace()

  backtrace()

개인적으로 즐겨쓰는 두 가지 예를 아래에 설명한다.


1) dump_stack

헤더를 포함하고 dump_stack() 추가하면 끝.

#include <linux/kernel.h> 

dump_stack();


2) WARN_ON 사용

조건 필요 없이 콜 스택 표시하고 싶을 때 사용하는 코드.

WARN_ON (0);


조건을 검사하여 콜 스택 표시하는 코드.

WARN_ON (!sdio_claimed);



반응형
Comments