Android 调试打印对应的调用堆栈

在平时的开发调试的时候,经常碰到需要打印JAVA、Native C++、kernel的代码调用关系。这里做一下记录

Jave堆栈打印

使用android.util.Log类进行打印

 /*** Send a {@link #DEBUG} log message and log the exception.* @param tag Used to identify the source of a log message.  It usually identifies*        the class or activity where the log call occurs.* @param msg The message you would like logged.* @param tr An exception to log*/public static int d(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {return printlns(LOG_ID_MAIN, DEBUG, tag, msg, tr);}eg:
android.util.Log.d("test","xxx",new Exception());

kernel 堆栈打印

内核中打印堆栈比较简单,使用下面的函数即可

dump_stack();

Native 堆栈打印

借助libutilscallstack库进行打印。源码路径system\core\libutils\CallStack.cpp

//system\core\libutils\Android.bp
cc_library {name: "libutilscallstack",defaults: ["libutils_defaults"],// TODO(b/153609531): remove when no longer needed.native_bridge_supported: true,srcs: ["CallStack.cpp",],//system\core\libutils\CallStack.cpp
CallStack::CallStack(const char* logtag, int32_t ignoreDepth) {this->update(ignoreDepth+1);this->log(logtag);
}

可以看出CallStack.cpp编译成libutilscallstack库。使用之前,一定要先将这个库包含进来

(1)包含libutilscallstack库

shared_libs:["libutilscallstack",
]

(2)包含头文件

#include<utils/CallStack.h>

(3)使用

CallStack stack("xxx");

注意,低版本的Andorid,CallStack.cpp是编译成libutils

cc_library {name: "libutils",vendor_available: true,vndk: {enabled: true,support_system_process: true,},host_supported: true,srcs: ["CallStack.cpp",//......

参考链接:Android 打印native堆栈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AJAX学习(四)

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

聊聊Python都能做些什么

文章目录 一、Python简介二、Python都能做些什么1. Web开发2. 数据分析和人工智能3. 自动化运维和测试4. 网络爬虫5. 金融科技 三、Python开源库都有哪些1. Web开发2. 数据分析和科学计算3. 机器学习和深度学习4. 网络爬虫5. 自动化和测试6. 其他常用库 四、相关链接 一、Pytho…

C++内存分布与动态内存管理

文章目录 :dizzy: C/C内存分布:dizzy:C语言中动态内存管理方式  :sparkles:malloc   :sparkles:calloc  :sparkles:reallocfree :dizzy:C语言中动态内存管理方式  :sparkles:new和delete操作内置类型  :sparkles:new和delete操作自定义类型 :dizzy:operator new与ope…

C语言自学笔记13----C语言指针与函数

C 语言指针与函数 在C语言编程中&#xff0c;也可以将地址作为参数传递给函数。 要在函数定义中接受这些地址&#xff0c;我们可以使用指针。这是因为指针用于存储地址。让我们举个实例&#xff1a; 示例&#xff1a;通过引用致电 #include <stdio.h> void swap(int n1, …

数星星 刷题笔记 (树状数组)

依题意 要求每个点 x, y 的左下方有多少个星星 又因为 是按照y从小到大 给出的 所以 我们在计算个数的时候是按照y一层层变大来遍历的 因此我们在处理每一个点的时候 只需要看一下 当前的点有多少个点的x值比当前点小即可 树状数组的 操作模板 P3374 【模板】树…

rsa数据加密无大小限制——golang实现

由于rsa加密需要公钥长度大于消息长度&#xff0c;消息太长时经常会报错Message too long for RSA 采用分块的方法&#xff0c;将消息分成更小的块&#xff0c;解决这个问题 package xrsa import ("encoding/pem""encoding/base64""crypto/x509"…

动态规划题目集一(代码 注解)

目录 介绍&#xff1a; 题目一: 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 介绍&#xff1a; 动态规划是一种算法设计技术&#xff0c;用于解决具有重叠…

水泵房远程监控物联网系统

随着物联网技术的快速发展&#xff0c;越来越多的行业开始利用物联网技术实现设备的远程监控与管理。水泵房作为城市供水系统的重要组成部分&#xff0c;其运行状态的监控与管理至关重要。HiWoo Cloud作为专业的物联网云服务平台&#xff0c;为水泵房远程监控提供了高效、稳定、…

音乐播放器-C#实现

音乐播放器-C#实现 目录 一、 代码介绍 二、 音乐播放器-C#实现 三、 音乐播放器-C#实现 四、 音乐播放器-C#实现 五、 音乐播放器-C#实现 代码介绍 代码中使用了.NET框架中的System.Media命名空间来处理音频文件的播放和控制。这段代码创建了一个简单的音乐播放器界…

Java访问数据库(重点:SpringBoot整合Mybatis)

目录 一、通过JDBC访问数据库1、思路2、示例3、思考 二、通过ORM框架访问数据库&#xff08;主要是Mybatis&#xff09;1、示例1.1 配置1.2 SQL写在xxxMapper.xml中&#xff1a;mapper/UserMapper.xml1.3 xxxMapper.xml对应的xxxMapper接口&#xff08;Application通过该接口访…

C#设计原则

学习设计原则是学习设计模式的基础。在实际的开发过程中&#xff0c;并不是一定要求所有的代码都遵循设计原则&#xff0c;而是要综合考虑人力、成本、时间、质量&#xff0c;不刻意追求完美&#xff0c;要在适当的场景遵循设计原则。 这体现的是一种平衡取舍&#xff0c;可以…

SRE运维揭秘: 企业生产中运维监控的真相

大家好&#xff0c;我是博哥爱运维&#xff0c;有着十年SRE运维开发经验&#xff0c;从事过全球多个主流云平台的服务架构设计及自动化运维开发工作&#xff0c;在企业中基于gitlab和k8s从零设计过完整的一套CICD流水线架构&#xff0c;曾用shell开发过运维堡垒机系统&#xff…

磁盘未格式化,数据恢复有妙招

一、初遇磁盘未格式化&#xff0c;惊慌失措 在日常生活和工作中&#xff0c;我们经常会使用各种存储设备来保存重要的文件和数据。然而&#xff0c;有时当我们尝试访问这些存储设备时&#xff0c;却会突然遇到一个令人头痛的问题——磁盘未格式化。这个突如其来的提示让我们措…

虚拟函数和普通函数的区别?内联函数和构造函数能否成为虚拟函数?

虚拟函数和普通函数的区别主要在于它们的调用方式。当一个类中有虚拟函数时&#xff0c;编译器会为该类创建一个虚函数表&#xff08;vtable&#xff09;&#xff0c;这个表中存储了该类中所有虚拟函数的地址。在运行时&#xff0c;通过基类的指针或引用调用派生类中的函数时&a…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

【解惑】离线版本的软件如何实现“授权验证”和“使用有效期”验证的

如何实现 要实现软件授权验证和使用有效期验证的离线版本&#xff0c;可以考虑以下几个步骤&#xff1a; 授权验证&#xff1a; 在软件的离线版本中&#xff0c;可以通过在软件中嵌入一个授权验证模块来进行验证。授权验证模块可以包含一个加密算法&#xff0c;用于生成和验证…

接口与多态

通过接口实现多态 接口中声明若干个 bstract方法&#xff1b; 方法体的内容细节由实现接口的类去完成&#xff0c;不同的类有 不同的实现方式 → 则接口变量在回调接口方法时具有多 种形态。 用接口进行程序设计的核心思想 使用接口回调技术&#xff1a;接口变量存放实现该接口…

(学习日记)2024.03.13:UCOSIII第十五节:基于时基列表的时延操作(持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Redis集群原理解析

一、单机Redis存在的问题 问题1&#xff1a;数据丢失问 解决方案&#xff1a;利用RDB和AOF实现数据的持久化 问题2&#xff1a;并发能力弱 解决方案&#xff1a;搭建主从集群&#xff0c;实现主从分离 问题3&#xff1a;存储空间小 解决方案&#xff1a;搭建分片集群&#xff0…

KY191 矩阵幂(用Java实现)

描述 给定一个n*n的矩阵&#xff0c;求该矩阵的k次幂&#xff0c;即P^k。 输入描述&#xff1a; 第一行&#xff1a;两个整数n&#xff08;2<n<10&#xff09;、k&#xff08;1<k<5&#xff09;&#xff0c;两个数字之间用一个空格隔开&#xff0c;含义如上所示…