Android中添加CallStack

Android中添加CallStack1 Java 中添加 Java 中添加 callstack 常见以下几种方式 importandroi util Log 1 Exceptione newException thisisalog e printStackTr 2 Thread currentThrea getStackTrac 3 Log e dump test Log getStackTrac newThrowable 2

(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  
     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  
     

(c)添加代码实现

#include  
      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); 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206169.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午4:18
下一篇 2026年3月19日 下午4:19


相关推荐

  • Mysql中行转列和列转行

    Mysql中行转列和列转行一、行转列即将原本同一列下多行的不同内容作为多个字段,输出对应内容。建表语句DROPTABLEIFEXISTStb_score;CREATETABLEtb_score(idINT(11)NOTNULLauto_increment,useridVARCHAR(20)NOTNULLCOMMENT’用户id’,subject…

    2022年6月17日
    23
  • pycharm与python的关系_pycharm和python区别[通俗易懂]

    pycharm与python的关系_pycharm和python区别[通俗易懂]pycharm使用创建directory和Pythonpackage的区别pycharm能显示当前python文件下的函数和类的列表吗当然可以,调出Structure视图即可。①快捷键:Alt+7②鼠标移动到窗口左下角小方块,寻Structure”③点击View菜单,选ToolWindows,再寻Structure”pycharm教程(一)安装PyCharm是我…

    2022年8月29日
    6
  • 学会使用IDEA断点调试工具

    学会使用IDEA断点调试工具IDEA 学会使用断点调试

    2026年3月26日
    2
  • UART串口通讯

    UART串口通讯UART 代表通用异步接收器 发送器也称为串口通讯 它不像 SPI 和 I2C 这样的通信协议 而是微控制器中的物理电路或独立的 IC UART 的主要目的是发送和接收串行数据 其最好的优点是它仅使用两条线在设备之间传输数据 UART 的原理很容易理解 但是如果您还没有阅读 SPI 通讯协议 那可能是一个不错的起点 UART 通信在 UART 通信中 两个 UART 直接相互通信 发送 UART 将控制设备 如 CPU 的并行数据转换为串行形式 以串行方式将其发送到接收 UART 只需要两条线即可在两个 UART 之间

    2026年3月19日
    3
  • 利用现成公式(gpt生成、springer等文献网址里的、图片)快速导入word文档中

    利用现成公式(gpt生成、springer等文献网址里的、图片)快速导入word文档中

    2026年3月16日
    5
  • 软件项目管理知识点总结

    软件项目管理知识点总结软件项目管理第1章软件项目管理概述1、项目的基本概念(注意与日常运作的区分)和特征;2、软件项目及特征;3、项目管理的基本概念;4、项目管理知识体系(以2017年发布的PMBOK6的十个知识领域为准);5、适用于软件项目管理的知识体系。​第2章项目确立&第3章生存期模型【项目初始】1、理解项目启动的基本过程(项目评估、项目立项、招投标、发布项目章程);2、项目章程的主要内容和作用;3、理解各生存期模型的优缺点及适用场景。第4章软件项目需求管理1、软件需求的概念及层次;2、需求工程的组成。需

    2022年5月9日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号