개발 개발/Android

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

뭉기 2011. 12. 16. 22:08
방법 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() 이렇게 호출된 것을 볼 수 있습니다.