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*)



留言