방법 1.
Exception ex 와 같이 객체를 하나 만들고, ex.printStackTrace() 하면 해당 위치의 Call stack을 볼 수 있습니다.
방법 2.
StringBuffer stacktrace = new StringBuffer();
그리고 콜스택을 찍으려고 하는 곳에 다음과 같이 넣습니다.
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() 이렇게 호출된 것을 볼 수 있습니다.
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의 경우
그리고 콜스택을 찍으려고 하는 곳에 다음과 같이 넣습니다.
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 |