java 函数调用栈_dump Java和C++函数调用栈

1. java代码中打印堆栈

(1) 通常的方法是使用exception的printStackTrace()方法:

try{

...

}catch(RemoteException e) {

e.printStackTrace();

...

}

(2) 测试Demo

6481625f51374d8927259ccc26401ad5385.jpg

b28d60ec8a881c63448b23b85c860324223.jpg

classPerson {public voidperson_dump_stack() {try{throw new Exception("my_dump");

}catch(Exception e) {

e.printStackTrace();

}

}

}public classTest {public static voidmain(String[] args) {

Person p= newPerson();

p.person_dump_stack();

}

}

View Code

执行结果:

e4d863da8105d08b479c3f05d8bc0c866bc.jpg

ecda8f715fd84b7efe60df13f269d46e441.jpg

# java Test

java.lang.Exception: my_dump

at Person.person_dump_stack(Test.java:5)

at Test.main(Test.java:15)

View Code

(3) 当然也可以只打印堆栈不退出,Java代码中插入堆栈打印的方法如下:

Log.d(TAG, Log.getStackTraceString(new Throwable()));

(4) 测试Demo

abe0081efd2093747b758e574cadda2466d.jpg

978e36c97fe5c6b800ee1bbdb4b340dfa84.jpg

Android.mk:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES :=JavaDump.java

LOCAL_MODULE :=java_dump

include $(BUILD_JAVA_LIBRARY)

JavaDump.java:importandroid.util.Log;classAnimal {public voidanimal_dump_java_stack() {

String TAG= "java_dump: ";

Log.d(TAG, Log.getStackTraceString(newThrowable()));

}

}class Person extendsAnimal {public voidperson_dump_java_stack() {

animal_dump_java_stack();

}

}public classJavaDump {public static voidmain(String args[]) {

Person person= newPerson();

person.person_dump_java_stack();

}

}

View Code

执行结果:

cd3a37fde226b67072b6e2b8cb5ddf4338a.jpg

50eccbc45c9c4ee0e5043ba268b723e4ba2.jpg

1|shell@tiny4412:/system/mytest # dalvikvm -cp ./java_dump.jar JavaDump

java.lang.UnsatisfiedLinkError: No implementation foundfor int android.util.Log.println_native(int, int, java.lang.String, java.lang.String) (tried Java_android_util_Log_println_1native and Java_android_util_Log_println_1native__IILjava_lang_String_2Ljava_lang_String_2)

at android.util.Log.println_native(Native Method)

at android.util.Log.d(Log.java:139)

at Animal.animal_dump_java_stack(JavaDump.java:7)

at Person.person_dump_java_stack(JavaDump.java:13)

at JavaDump.main(JavaDump.java:22)

View Code

这个效果是最好的,注意打印出来的还有类名和行号,可以避免类的继承关系带来的混淆。

2. C++代码中打印堆栈

(1) C++也是支持异常处理的,异常处理库中,已经包含了获取backtrace的接口,Android也是利用这个接口来打印堆栈信息的。在Android的C++中,

已经集成了一个工具类CallStack,在libutils.so中。使用方法:

#include ...

CallStack stack;/*void update(int32_t ignoreDepth=1, pid_t tid=BACKTRACE_CURRENT_THREAD);*/stack.update();/*void dump(int fd, int indent = 0, const char* prefix = 0) const;*/stack.dump();

(2) 测试Demo

51e9e2dd09b44362d36227d7e60ffac9c8c.jpg

ff0ea63c3fcbdf11db06f4cac2b25aac9bb.jpg

Android.mk:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=CppDump.cpp

LOCAL_SHARED_LIBRARIES :=\

libcutils \

libutils \

liblog

LOCAL_MODULE:=cpp_dump

include $(BUILD_EXECUTABLE)

CppDump.cpp:#define LOG_TAG "dump_cpp: "

#define STDOUT 1#include

using namespaceandroid;classPerson {public:voidperson_dump_cpp() {

CallStack stack;

stack.update();

stack.dump(STDOUT,0, LOG_TAG);

}

};intmain() {

Person p1;

p1.person_dump_cpp();return 0;

}

View Code

执行结果:

0907c55dd7f4c6c2e1d847f840f4483f206.jpg

4ed4357f10e41e631ecb26fcba6382500cd.jpg

shell@tiny4412:/system/mytest # ./cpp_dump

dump_cpp: #00 pc 00003035 /system/lib/libbacktrace.so (Backtrace::Unwind(unsigned int, ucontext*)+8)

dump_cpp: #01 pc 0000d061 /system/lib/libutils.so (android::CallStack::update(int, int)+52)

dump_cpp: #02 pc 000003f9 /system/mytest/cpp_dump

dump_cpp: #03 pc 000128f1 /system/lib/libc.so (__libc_init+44)

dump_cpp: #04 pc 0000047c /system/mytest/cpp_dump

View Code

可以看出效果并不怎么好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值