본문 바로가기

개발 개발/Android

임의로 Call stack(콜스택) 찍기

방법 1.
Exception ex 와 같이 객체를 하나 만들고, ex.printStackTrace() 하면 해당 위치의 Call stack을 볼 수 있습니다.

방법 2.
StringBuffer stacktrace = new StringBuffer();

StackTraceElement[] stackTrace = new Exception().getStackTrace();
for(int x=0; x<stackTrace.length; x++) {
 stacktrace.append(stackTrace[x].toString() + " ");
}
Log.e(TAG, "stacktrace");
Log.e(TAG, stacktrace.toString());




출처 : http://shadowxx.egloos.com/10816752
 

C의 경우

먼저 안드로이드가 제공하는 util 중에서 callstack 을 include 합니다.#include <utils/CallStack.h>

그리고 콜스택을 찍으려고 하는 곳에 다음과 같이 넣습니다.
CallStack stack;
stack.update(0, 31);
stack.dump();

위에서 한 내용은 최대 call stack 을 31개까지 찍겠다 (최대값이 31 입니다) 라고 한 것입니다. 
그런데 이렇게만 하면 안되고 CallStack.cpp 에서 dump() 함수에서 실제 call stack 을 LOGD 로 찍고 있는데 이것을 LOGE 로 바꿔줘야 call stack 이 로그로 출력이 됩니다.

이렇게 call stack 을 보면 
01-01 00:38:12.860: ERROR/CallStack(188): #00  0x0x4018c100: <_ZN7android9CallStack6updateEii>+0x0x4018c0e1
01-01 00:38:12.860: ERROR/CallStack(188): #01  0x0x400deaae: <_ZN7android12AudioFlinger10onFirstRefEv>+0x0x400dea81
01-01 00:38:12.860: ERROR/CallStack(188): #02  0x0x400df826: <_ZTv0_n16_N7android12AudioFlinger10onFirstRefEv>+0x0x400df819
01-01 00:38:12.860: ERROR/CallStack(188): #03  0x0x4018da58: <_ZNK7android7RefBase9incStrongEPKv>+0x0x4018da31
01-01 00:38:12.860: ERROR/CallStack(188): #04  pc 0000093a  /system/bin/mediaserver
01-01 00:38:12.860: ERROR/CallStack(188): #05  0x0x4010452e: <__libc_init>+0x0x40104505

이런 식으로 찍히게 되는데, 자세히 보면 위에 내용이 무엇인지 알 수 있습니다.
제는 위 코드를 AudioFlinger.cpp 에서 audio flinger 가 binding 되는 순간에 불리는 onFirstRef() 안에서 찍었는데 그것을 감안해서 보면,
mediaserver -> RefBase 소스에서 incStrong() -> AudioFlinger 소스에서 onFirstRef() 이렇게 호출된 것을 볼 수 있습니다.

'개발 개발 > Android' 카테고리의 다른 글

LOCAL_MODULE_TAGS  (0) 2012.02.09
CTS 정리  (0) 2011.12.20
PDK JNI 로그 log 나오게 하기  (0) 2011.12.13
[안드로이드] 네이티브 어플리케이션 설치  (0) 2011.11.30
Android build system - makefile 기본 빌드 과정  (0) 2011.11.30