Android中添加CallStack_android c 中加stack-程序员宅基地

技术标签: C/C++  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);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dongxianfei/article/details/121337428

智能推荐

SQLServer 2000 定时任务(作业执行)_sql 2000调度时间-程序员宅基地

文章浏览阅读4.2k次。企业管理器--管理--SQL Server代理--右键作业--新建作业--“常规”项中输入作业名称--“步骤”项--新建--“步骤名”中输入步骤名--“类型”中选择“Transact-SQL 脚本(TSQL)”--“数据库”选择执行命令的数据库--“命令”中输入要执行的语句:INSERT / DELETE ...--确定--“调度”项--_sql 2000调度时间

Failure [INSTALL_FAILED_ALREADY_EXISTS] 问题解决-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏4次。1.场景:今天用adb命令安装测试安装包,发现报错:Failure [INSTALL_FAILED_ALREADY_EXISTS]2.问题分析:前天有在手机上安装过这个测试包,也卸载过了,但是依然报错,所以考虑是包还在手机上,用命令:adb shell pm list packages 查看此时连接手机里面的所有安装包,找到这个包名,然后执行命令:adb uninstall 包名,进..._install_failed_already_exists

跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)-程序员宅基地

文章浏览阅读81次。最近公司的一个项目里的linux 系统中的oracle 10g数据库,需要把某个表空间里的所有数据都迁移到window 2003的11g里,经过我与dba的交流、测试,决定使用跨平台的表空间传输技术,目前此项任务已经完成,经过测试,没有问题,下面是我为此项任务做的测试,此次是做linux(oracle 10g)对window (oracle 11g)做..._linux表空间对应到windows上

MATLAB信号处理---学习小案例(11)---离散系统中的Z域描述_matlab怎么表示z域系统函数表达式-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏15次。线性时不变离散系统可用线性常系数差分方程描述,即∑i=0Naiy(n−i)=∑j=0Mbjx(n−j)\sum_{i=0}^Na_iy(n-i)=\sum_{j=0}^Mb_jx(n-j)∑i=0N​ai​y(n−i)=∑j=0M​bj​x(n−j),其中,y(k)y(k)y(k)为系统的输出序列,x(k)x(k)x(k)为输出序列。将上式两边进行Z变换得到H(z)=Y(z)X(z)=∑j=0Mbjz−j∑i=0Naiz−i=B(z)A(z)H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_matlab怎么表示z域系统函数表达式

两个晚上搞了一个QT文本编辑器,效果比较简陋啊_qt编辑器太垃圾了-程序员宅基地

文章浏览阅读202次。前言日常开发一直是linux后台 + 控制系统软件开发,感觉每天的黑框甚是无聊啊,遥想界面开发,平时主要用C++,无他,只能QT了,上次使用还是读书时,已经忘得差不多了。好在看了一下QT的基本框架,感觉封装的非常好,如果做了一个简单的Demo测试。本人晚上九点到家,昨天开发到11点多,今天又开发了一会。终于有个雏形了。功能实现完全参考win10 记事本的样子写的,照猫画虎;不知道怎么弄的就百度;实现基本的功能如下:文件,编辑,查找支持快捷键待改善(实在太多了)只是抱着用用的态度,学_qt编辑器太垃圾了

dede标签调用大全_{dede:field.title function='htmlspecialchars()' /}-程序员宅基地

文章浏览阅读324次。列表隔5行加一行线: {dede:list pagesize='50'} target=_blank>[field:title function="cn_substr(@me,48)"/][field:pubdate runphp='yes'] $a="".strftime('%m-%d',@me).""; $b=strftime('%m-%d',@me); $ntime _{dede:field.title function='htmlspecialchars()' /}htmlspecialchars()如何使用

随便推点

一种modelsim+matlab的FPGA图像处理仿真方法_modelsim可以仿真出函数图像-程序员宅基地

文章浏览阅读1.8k次。一、基本结构使用modelsim工具,调用Verilog的系统函数,将图像数据读入testbench的memory组。在处理后调用系统函数将数据保存成文件。这些系统函数是不可综合成硬件的,仅用于仿真测试。图像数据需要使用matlab生成,因为普通图片是进行过压缩储存的,需要把图片还原成原始rgb或ycrcb数据流。同理处理完保存的图片原始数据需要用matlab进行处理,转换成可用于显示的图片格..._modelsim可以仿真出函数图像

Laravel 学习笔记之 Composer 自动加载-程序员宅基地

文章浏览阅读297次。说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制。Composer的自动加载机制1、初始化一个composer项目在一个空目录下composer安装Laravel的容器Container包:composer require illuminate/container然后在该目录下新建一个index.php文件,..._composer为了防止类冲突命名composerautoloaderinit+hash

音频技术基础知识_音频编码技术知识点总结-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏24次。一、音频编码调制技术根据编码方式的不同,音频编码技术分为三种:波形编码、参数编码和混合编码。一般来说,波形编码的话音质量高,但编码速率也很高;参数编码的编码速率很低,产生的合成语音的音质不高;混合编码使用参数编码技术和波形编码技术,编码速率和音质介于它们之间。实际应用中,我们通常采用的是脉冲编码调制(即PCM编码)。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。脉冲编..._音频编码技术知识点总结

交互设计7大定律_人机工程学界面排布相关定律-程序员宅基地

文章浏览阅读408次,点赞3次,收藏3次。-_人机工程学界面排布相关定律

双指针法 环形链表 II_双指针 链表 环 索引-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏2次。题目LeetCode 142. 环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为_双指针 链表 环 索引

推荐文章

热门文章

相关标签