IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android中添加CallStack -> 正文阅读

[移动开发]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));

打印示例

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);
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:57:11  更:2021-11-16 18:58:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:32:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码