(1)通常的方法是使用exception的printStackTrace()方法:
try{...}catch(RemoteExceptione){e.printStackTrace();...}(2)测试Demo
classPerson{publicvoidperson_dump_stack(){try{thrownewException("my_dump");}catch(Exceptione){e.printStackTrace();}}}publicclassTest{publicstaticvoidmain(String[]args){Personp=newPerson();p.person_dump_stack();}}ViewCode执行结果:
#javaTestjava.lang.Exception:my_dumpatPerson.person_dump_stack(Test.java:5)atTest.main(Test.java:15)ViewCode
(3)当然也可以只打印堆栈不退出,Java代码中插入堆栈打印的方法如下:
Log.d(TAG,Log.getStackTraceString(newThrowable()));(4)测试Demo
Android.mk:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_SRC_FILES:=JavaDump.javaLOCAL_MODULE:=java_dumpinclude$(BUILD_JAVA_LIBRARY)JavaDump.java:importandroid.util.Log;classAnimal{publicvoidanimal_dump_java_stack(){StringTAG="java_dump:";Log.d(TAG,Log.getStackTraceString(newThrowable()));}}classPersonextendsAnimal{publicvoidperson_dump_java_stack(){animal_dump_java_stack();}}publicclassJavaDump{publicstaticvoidmain(Stringargs[]){Personperson=newPerson();person.person_dump_java_stack();}}ViewCode执行结果:
1|shell@tiny4412:/system/mytest#dalvikvm-cp./java_dump.jarJavaDumpjava.lang.UnsatisfiedLinkError:Noimplementationfoundforintandroid.util.Log.println_native(int,int,java.lang.String,java.lang.String)(triedJava_android_util_Log_println_1nativeandJava_android_util_Log_println_1native__IILjava_lang_String_2Ljava_lang_String_2)atandroid.util.Log.println_native(NativeMethod)atandroid.util.Log.d(Log.java:139)atAnimal.animal_dump_java_stack(JavaDump.java:7)atPerson.person_dump_java_stack(JavaDump.java:13)atJavaDump.main(JavaDump.java:22)ViewCode这个效果是最好的,注意打印出来的还有类名和行号,可以避免类的继承关系带来的混淆。
补充:感觉下面这个好用一些
newRuntimeException("stack_dump").printStackTrace();//打印栈回溯
2.C++代码中打印堆栈
(1)C++也是支持异常处理的,异常处理库中,已经包含了获取backtrace的接口,Android也是利用这个接口来打印堆栈信息的。在Android的C++中,已经集成了一个工具类CallStack,在libutils.so中。使用方法:
#include
Android.mk:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_SRC_FILES:=CppDump.cppLOCAL_SHARED_LIBRARIES:=\libcutils\libutils\liblogLOCAL_MODULE:=cpp_dumpinclude$(BUILD_EXECUTABLE)CppDump.cpp:#defineLOG_TAG"dump_cpp:"#defineSTDOUT1#include
shell@tiny4412:/system/mytest#./cpp_dumpdump_cpp:#00pc00003035/system/lib/libbacktrace.so(Backtrace::Unwind(unsignedint,ucontext*)+8)dump_cpp:#01pc0000d061/system/lib/libutils.so(android::CallStack::update(int,int)+52)dump_cpp:#02pc000003f9/system/mytest/cpp_dumpdump_cpp:#03pc000128f1/system/lib/libc.so(__libc_init+44)dump_cpp:#04pc0000047c/system/mytest/cpp_dumpViewCode可以看出效果并不怎么好。
补充:可以参考下面
//frameworks/native/libs/binder/IPCThreadState.cppCallStack::logStack("onewayspamming",CallStack::getCurrent().get(),ANDROID_LOG_ERROR);