0 在调试 android 系统时可以通过打印调用堆栈 callback stack 来分析和解决android问题。
1 java 层打印callback stack 可以通过 catch exception 然后 使用 Log.w(LOGTAG, Log.getStackTraceString(throwable)) 打印调用堆栈
Throwable throwable = new Throwable();
Log.w(LOGTAG, Log.getStackTraceString(throwable));
或者
try {
wait();
} catch (InterruptedException e) {
Log.e(LOGTAG, "Caught exception while waiting for overrideUrl");
Log.e(LOGTAG, Log.getStackTraceString(e));
}
2 c/c++, 通常情况下,可以通过segment fault 等错误即信号 SIGSEGV(11) 做出相应处理,即设置SIGSEGV的handler调用libc的backtrace,即可打印对于的callback stack;定位问题所在;但在android 中, bionic 不提供类似功能,而且只能通过logcat才能看到log信息,但是我们也可以根据android出错信息获得调用堆栈信息,如以下出错信息:
D/CallStack( 2029): #00 pc 00008156 /system/lib/hw/audio.primary.tf4.so
D/CallStack( 2029): #01 pc 000089e8 /system/lib/hw/audio.primary.tf4.so (android_audio_legacy::AudioHardware::AudioStreamOutALSA::setParameters(android::String const&)+139)
D/CallStack( 2029): #02 pc 0000b2ca /system/lib/hw/audio.primary.tf4.so
D/CallStack( 2029): #03 pc 0003ac6a /system/lib/libaudioflinger.so (android::AudioFlinger::Mix