Android的C/C++印出StackTrace
在debug Andoird上的C/C++的程式時會想印出像是Java的Stack Trace的內容
在APP裏面只需要寫一行Java就能快速的印出Stack Trace的結果
new Exception().printStackTrace();
那在C/C++中呢? Android有提供utils這個函數庫,裡頭就有方便的CallStack可以使用
C/C++
#include <utils/CallStack.h
> CallStack cs;
cs.update();
cs.dump(); // 4.0.3
cs.log("print module name"); // 4.4.2
從logcat中看到印出來的結果會是這樣:
09-03 15:04:46.235 D/CallStack( 2583): #00 0x0x64df5730: <_ZN17AudioVideoElement12endAnimationEv>+0x0x64df56e8
09-03 15:04:46.235 D/CallStack( 2583): #01 0x0x64d03b28: <_ZN2js9InterpretEP9JSContextP12JSStackFramej12JSInterpMode>+0x0x64cfac88
09-03 15:04:46.235 D/CallStack( 2583): #02 0x0x64d08d40: <_ZN2js9RunScriptEP9JSContextP8JSScriptP12JSStackFrame>+0x0x64d08c38
09-03 15:04:46.237 D/CallStack( 2583): #03 pc 000db7c8 /system/lib/libekiohplatform.so
09-03 15:04:46.237 D/CallStack( 2583): #04 0x0x77f46948: <__thread_entry>+0x0x77f468dc
09-03 15:04:46.237 D/CallStack( 2583): #05 0x0x77f46350: <pthread_create>+0x0x77f46258
大致可以看到是從個function跑到哪個function,不過後面那一串怪怪函數名稱就要透過C++filt來協助翻譯了
$ c++filt _ZN17AudioVideoElement12endAnimationEv
AudioVideoElement::endAnimation()
$ c++filt _ZN2js9InterpretEP9JSContextP12JSStackFramej12JSInterpMode
js::Interpret(JSContext*, JSStackFrame*, unsigned int, JSInterpMode)
$ c++filt _ZN2js9RunScriptEP9JSContextP8JSScriptP12JSStackFrame
js::RunScript(JSContext*, JSScript*, JSStackFrame*)
留言