Android 打印函数调用堆栈调试

来源:互联网 发布:mac 鼠标右键 触摸屏 编辑:程序博客网 时间:2024/05/16 14:06

java 层

可以利用抛出异常来打印:

1
2
3
RuntimeException here =new RuntimeException("here");
here.fillInStackTrace();
Log.i(TAG, "call statck is", here);


native 层

可以利用 android 的 CallStack 来打印:

1
2
3
4
5
6
CallStack stack;
stack.update();
stack.dump("SurfaceFlinger"); 
 
// 4.4 的接口变了 dump 是用来把 log 保存到文件里面去的
// 单纯的打印用这个: statck.log("SurfaceFlinger")

要调用这个类的方法先插入 CallStack 头文件,然后在 Android.mk 中链接 utils 库就可以:

1
2
#include <utils/CallStack.h>
LOCAL_SHARED_LIBRARIES := libutils

这个可以自己去看 CallStack.h 的头文件(frameworks/base/native/include/utils/CallStack.h),方法的定义:

1
2
3
4
5
6
7
8
// 第一个参数没去研究啥作用,用默认的1吧,
// 第二个参数好像是设置追踪的最大调用堆栈深度,默认是 31
void update(int32_t ignoreDepth=1, int32_t maxDepth=MAX_DEPTH);
 
// 这个就是把调用堆栈信息输出到 android 的 log 里面,
// 那个参数是 log 前面的前缀
// Dump a stack trace to the log
void dump(const char* prefix = 0) const;

效果如下:(注意 logcat 的 TAG 是 CallStack -_-||)

1
2
3
4
5
6
7
8
9
10
D/CallStack(  101): SurfaceFlinger#00  pc 00028a84  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::captureScreen(android::sp const&, android::sp*, unsigned int*, unsigned int*, int*, unsigned int, unsigned int, unsigned int, unsigned int)+63)
D/CallStack(  101): SurfaceFlinger#01  pc 000262a4  /system/lib/libgui.so (android::BnSurfaceComposer::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+523)
D/CallStack(  101): SurfaceFlinger#02  pc 00029836  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+105)
D/CallStack(  101): SurfaceFlinger#03  pc 0001435e  /system/lib/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+57)
D/CallStack(  101): SurfaceFlinger#04  pc 00016f5a  /system/lib/libbinder.so (android::IPCThreadState::executeCommand(int)+513)
D/CallStack(  101): SurfaceFlinger#05  pc 00017380  /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+183)
D/CallStack(  101): SurfaceFlinger#06  pc 00000820  /system/bin/surfaceflinger
D/CallStack(  101): SurfaceFlinger#07  pc 00000844  /system/bin/surfaceflinger
D/CallStack(  101): SurfaceFlinger#08  pc 0001271c  /system/lib/libc.so (__libc_init+35)
D/CallStack(  101): SurfaceFlinger#00  pc 00028a84  /system/lib/libsurfaceflinger
0 0