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.hnamespace 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.hclass 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);
Android中添加CallStack相关推荐
- Android中添加CallStack打印
Android 打印调用堆栈 内核 添加头文件: #include <linux/kprobes.h> #include <asm/traps.h> 添加打印函数: dump_ ...
- android谷歌补丁日期,在谷歌日历Android中添加开始日期和结束日期之间所有日期的事件...
在谷歌日历 Android中添加开始日期和结束日期之间所有日期的事件.我希望每3个月剩余一次,直到结束日期. 这是我的功能 public void addEvent1(Context ctx, Str ...
- Android中添加自己的模块 【转】
本文转载自:http://wallage.blog.163.com/blog/static/17389624201021791333695/ 转:http://blog.csdn.net/yili_x ...
- Android中添加思源字体/NotoSansCJK/SourceHanSans
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 系统版本 ...
- 怎样在android中添加背景图片?
怎样在android中添加背景图片? 1.打开左侧的工程文件夹.打开res中的layout,双击main.xml. 2.一般的图片是jpg格式的,要把格式转化为png格式的. 3.把PNG格式的图片拖 ...
- Android中添加背景音乐的两种方法
前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...
- android布局添加布局,Android中添加布局和初始化布局总结
在android中布局很重要,下面总结下布局的三种形式 ①.在Activity的onCreate()方法中进行添加比如:setContentView(R.layout.activity_main); ...
- Android中添加万普广告墙、推送广告等
一.配置环境 1.添加从万普SDK中下载下来的AppOffer_1.6.4.jar包 2.修改AndroidManifest.xml文件: (1)加入以下权限(是项目情况不同,可能需要不同的权限) & ...
- Android中添加书签(浏览器的收藏)
如何实现该功能呢?答案肯定是利用ContentResolver向浏览器的provider中添加相应书签项. /* * 向浏览器中添加书签 * @param title 书签标题 * @param ur ...
- Android中添加Module依赖注意问题
在开发中经常会以添加Module依赖的方式拓展其他的模块,这样的方式给我们的开发提供了很大的方便,但是也增加了编译的时间成本.但是直接在build.gradle中添加Module依赖往往会遇到Mani ...
最新文章
- 200多个js技巧代码(4)
- VS2010常用快捷键自定义
- 单向链表 双向链表 java代码实现
- KindEditor 4.1.10 (2013-11-23)首行空格不能显示在编辑器内
- 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点
- 新版开发工具?全新智能设备?华为开发者大会2021(Together)来了!
- pat A1052:Linked List Sorting静态链表+链表排序
- Bridging signals
- Tomcat安装配置及CATALINA_HOME environment variable is not defined correctly问题的解决
- objective-C的内存管理机制琢磨不透
- YOLOX训练代码分析3-损失函数
- SNF快速开发平台2019-权限管理模型-记录级-字段级权限实践
- 运维工程师的日常工作内容
- keil调试过程中源代码界面没有箭头
- atca背板_高速背板及相关标准介绍
- 少儿学计算机应该学什么,学习计算机与幼儿专业的关系
- TP50、TP90、TP99、TP999等TP系列或者95line、99.9line 等line系列的含义
- 嘉善 机器人比赛_嘉兴市教育局门户网站 动态信息 嘉善县第二届中小学电脑制作暨机器人比赛活动在浙师大附属嘉善实验学校举行...
- 计算机网络——广域网、数据报、虚电路、ATM、MPLS、网络传输介质、交换机、路由器、网关
- 解决公式编辑软件(mathtype)相关问题