Android中添加CallStack

(1)Java中添加

Java中添加callstack常见以下几种方式。

import android.util.Log;

//(1)
Exception e = new Exception("this is a log");
e.printStackTrace();

//(2)
Thread.currentThread().getStackTrace();

//(3)
Log.e("dump_test" , Log.getStackTraceString(new Throwable()));

(2)C++中添加

(A)Mtk Camera Hal中有自定义的stack

//vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/utils/std
//Misc.h

namespace NSCam {
	namespace Utils {

		void dumpCallStack(char const* prefix = 0);

		bool	saveBufToFile(char const*const    fname, unsigned char*const buf, unsigned int const  size);
	
		unsigned int loadFileToBuf(char const*const    fname, unsigned char*const buf, unsigned int const  capacity);
	}
}

//vendor/mediatek/proprietary/hardware/mtkcam/utils/std
//Misc.cpp

//可使用如下方式进行使用
NSCam::Utils::dumpCallStack(__FUNCTION__);

NSCam::Utils::saveBufToFile(filename,
                        (unsigned char*)jpg.mOutputJpegBuffer->getBufVA(0),
                        jpg.mOutputJpegBuffer->getBufSizeInBytes(0));

//使用示例
#include <mtkcam/utils/std/Misc.h>
using namespace NSCam;
using namespace android;
using namespace std;

NSCam::Utils::dumpCallStack(__FUNCTION__);

打印示例

11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:  pid(748) tid(6053) Cam@Jpeg
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #00 pc 0000000000003040  /vendor/lib64/libladder.so (UnwindCurThreadBT+120)
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #01 pc 000000000000e4c4  /vendor/lib64/libmtkcam_stdutils.so (NSCam::Utils::dumpCallStack(char const*)+52)
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #02 pc 00000000001702ec  /vendor/lib64/libmtkcam_hwnode.so (JpegNodeImp::encodeMainJpeg(android::sp<encode_frame>&)+44)
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #03 pc 000000000016ceb4  /vendor/lib64/libmtkcam_hwnode.so (onProcessRequest(JpegNodeImp&, Request&)+788)
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #04 pc 000000000017f064  /vendor/lib64/libmtkcam_hwnode.so (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(JpegNodeImp&, Request&), std::__1::reference_wrapper<JpegNodeImp>, std::__1::reference_wrapper<Request> > >(void*)+44)
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #05 pc 00000000000b0bd8  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
11-15 15:37:23.082   748  6053 I MtkCam/Utils/encodeMainJpeg:   #06 pc 00000000000505d0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)

(B)C++中通用添加

(a)在Android.bp / Android.mk 中添加 libutilscallstack

//Android.bp
shared_libs: [
        "libutilscallstack",
        ]

//Android.mk
LOCAL_SHARED_LIBRARIES:= libutilscallstack
//或
LOCAL_JNI_SHARED_LIBRARIES := libutilscallstack

(b)在C++源码文件预编译 include 中添加

#include <utils/CallStack.h>

(c)添加代码实现

#include <utils/CallStack.h>  
using android::CallStack;

CallStack stack; 
stack.update(); 
stack.log(__FUNCTION__);

(d)系统库的源码位置

//system/core/libutils/include/utils/CallStack.h

class CallStack {
public:
    CallStack();
    ~CallStack();

    void clear() { mFrameLines.clear(); }
    
    void update(int32_t ignoreDepth = 1, pid_t tid = BACKTRACE_CURRENT_THREAD);

    void log(const char* logtag,
             android_LogPriority priority = ANDROID_LOG_DEBUG,
             const char* prefix = nullptr) const;

    void dump(int fd, int indent = 0, const char* prefix = nullptr) const;

    String8 toString(const char* prefix = nullptr) const;

    void print(Printer& printer) const;

}

//system/core/libutils/CallStack.cpp

(e)打印示例

11-15 15:37:23.394   748  6053 D encodeMainJpeg: #00 pc 00000000001703d4  /vendor/lib64/libmtkcam_hwnode.so (JpegNodeImp::encodeMainJpeg(android::sp<encode_frame>&)+276)
11-15 15:37:23.394   748  6053 D encodeMainJpeg: #01 pc 000000000016ceb4  /vendor/lib64/libmtkcam_hwnode.so (onProcessRequest(JpegNodeImp&, Request&)+788)
11-15 15:37:23.394   748  6053 D encodeMainJpeg: #02 pc 000000000017f064  /vendor/lib64/libmtkcam_hwnode.so (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(JpegNodeImp&, Request&), std::__1::reference_wrapper<JpegNodeImp>, std::__1::reference_wrapper<Request> > >(void*)+44)
11-15 15:37:23.394   748  6053 D encodeMainJpeg: #03 pc 00000000000b0bd8  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
11-15 15:37:23.394   748  6053 D encodeMainJpeg: #04 pc 00000000000505d0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)

(3)Kernel中添加

Kernel中较简单,直接有现成的函数可以使用

dump_stack()  //这个函数打出当前堆栈和函数调用backtrace后接着运行

WARN_ON(x)  //这个函数跟dump_stack很像,如果条件满足了就把stack打出来
//WARN_ON(1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪舞飞影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值