android libc 有哪些函数_Android scudo功能介绍

一 简述

前面介绍了malloc_debug功能,用来进行内存泄露等检测,其实android可以使用多种方法进行内存相关的监控。比如利用llvm功能再编译时添加内存的相关检测。Android R默认开启了scudo。

scudo这个选项主要功能是再分配内存时会添加64 bit的Header

// Our header requires 64 bits of storage. Having the offset saves us from

// using functions such as GetBlockBegin, that is fairly costly. Our first

// implementation used the MetaData as well, which offers the advantage of

// being stored away from the chunk itself, but accessing it was costly as

// well. The header will be atomically loaded and stored.

typedef u64 PackedHeader;

struct UnpackedHeader {

u64 Checksum : 16;

u64 ClassId : 8;

u64 SizeOrUnusedBytes : 20; // Size for Primary backed allocations, amount of

// unused bytes in the chunk for Secondary ones.

u64 State : 2; // available, allocated, or quarantined

u64 AllocType : 2; // malloc, new, new[], or memalign

u64 Offset : 16; // Offset from the beginning of the backend

// allocation to the beginning of the chunk

// itself, in multiples of MinAlignment. See

// comment about its maximum value and in init().

};

开启scudo后支持的报错类型有如下,主要是用来进行边界检查,检测内存越界

void NORETURN reportCallocOverflow(uptr Count, uptr Size);

void NORETURN reportPvallocOverflow(uptr Size);

void NORETURN reportAllocationAlignmentTooBig(uptr Alignment,

uptr MaxAlignment);

void NORETURN reportAllocationAlignmentNotPowerOfTwo(uptr Alignment);

void NORETURN reportInvalidPosixMemalignAlignment(uptr Alignment);

void NORETURN reportInvalidAlignedAllocAlignment(uptr Size, uptr Alignment);

void NORETURN reportAllocationSizeTooBig(uptr UserSize, uptr TotalSize,

uptr MaxSize);

void NORETURN reportRssLimitExceeded();

void NORETURN reportOutOfMemory(uptr RequestedSize);

二 android R开启scudo功能

Android R使用的不是llvm的scudo功能,因此不是通过soong的scudo的开启来开启,主要使用如下选项

MALLOC_SVELTE := true

go版本默认是关闭scudo功能的。

非go版本四都开启scudo功能的,不过不是通过llvm开启,开启的方法

libc_scudo_product_variables

在 libc_scudo_product_variables 中定义了 -DUSE_SCUDO,具体的内存分配会使用libscudo下的定义,libscudo代码在externl/scudo下,而不是llvm中。

通过搜索USE_SCUDO宏,在宏开启后

libc/bionic/malloc_common.h

#if defined(USE_SCUDO)

#include "scudo.h"

#define Malloc(function)scudo_ ## function

通过hook的方式,将Libscudo中的实现来替换Libc原有的内存分配释放实现。

三 llvm中的scudo实现方式

llvm的scudo主要是在代码路径compiler-rt\lib\scudo中,scudo只能与undefined一块使用

The only other Sanitizer Scudo is compatible with is UBSan (eg: -fsanitize=scudo,undefined)

llvm下主要的生效方式是:

// You'll need to:

// 1) define INTERCEPTOR(int, foo, const char *bar, double baz) { ... } in

// your source file. See the notes below for cases when

// INTERCEPTOR_WITH_SUFFIX(...) should be used instead.

// 2) Call "INTERCEPT_FUNCTION(foo)" prior to the first call of "foo".

// INTERCEPT_FUNCTION(foo) evaluates to "true" iff the function was

// intercepted successfully.

在库初始化中,INTERCEPT_FUNCTION调用替代原生的函数,从而实现类似hook的方式。

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

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

相关文章

300来行代码实现最小Linux文件系统

Linux作为一个类UNIX系统,其文件系统保留了原始UNIX文件系统的表象形式,它看起来是这个样子:rootname-VirtualBox:/# lsbin boot cdrom dev etc home lib lib64 lostfound media mnt opt proc root run sbin snap srv sys …

淘宝怎么多个订单一起付款_淘宝未付款订单如何催付?

淘宝未付款订单如何催付?很多人只认为运营就是技巧,其实客服也是需要技巧的,客服也是关键的数据支撑。一个好的客服团队,能够很好地提高转化率、客单价、复购率,有效的降低退款率、纠纷等售后问题。今天和大家分享一下…

mysql存储过程触发器游标_MySQL存储过程,触发器,游标

语法:1.存储过程:create PROCEDURE name(argment_list)beginsql_statement;end2.触发器:create trigger name (before|after) (insert | update | delete) on table_namefor each rowbeginsql_statement;end3.游标:declare cursor_name curso…

爱大姚,恨男篮

先祝姚明生日快乐2019年9月12日。是中国篮协主席、CBA董事长姚明39岁的生日,时间已经过去几天了,当时铺天盖地的都是其他的热点新闻,很多人,包括我也忘记了这个大个子已经39岁了,看着中国男篮的惨败,很想冲…

Linux 内核系统架构

描述Linux内核的文章已经有上亿字了但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的。即使看了所有的Linux 内核文章,估计也还不是很明白,这时候,还是需要fucking the code.28年前(1991年8月26日)Lin…

gif透明背景动画_如何利用premiere制作GIF动态图片

GIF制作流程(也可以用此教程把视频变成GIF动图)作者:益红一、导出设计文件将要做动画的文件在ps里面导出 (透明图层用PNG)(也可以将合适的视频片段作为素材)二、在PR里面新建项目打开 Adobe premiere选择 新建项目找到新建项目 — 命名 —设置合适的项目 位置-点击浏…

mysql sqlserver分页_SqlServer、MySql万能分页代码

sql数据库中常用的分页 我做了一个万能的 用的上的小伙伴拿去耍吧go ----SqlServer万能分页代码create procedure [dbo].[sp_datapager]pagesize int,--每一页的大小pageindex int,--页码数tablename varchar(Max),--表的名称keycolumn varchar(20),---主键idcolumns varchar(…

并查集做题总结

CF 469B 构造出两个节点n1,n2来存放A集合和B集合中的数据,显然一个合理的分配不会使得一个元素既在A里面,也在B里面。而由于每一个元素都要去分配,如果a-x没有那它就得在B里面(和n2合并),同理对于b-x没有的…

离职了

这是我毕业后的第一份工作...面试时,HR小姐姐告诉我...然鹅...我入职之后才发现:对标阿里的只有加班强度对标华为的只有狼性文化对标百度的,额,没有对标百度同事们有的住在海淀区、有的住在朝阳区,作为刚毕业的一枚“穷…

windows7官方原版_如何下载微软原版操作系统、办公软件

如何下载微软原版操作系统、办公软件?简介:微软操作系统从MS-DOS到Windows XP,Windows 7,Windows 8,再到现在的Windows 10 ,一代比一代强,每代都有自己的特点。现在我们能从官网上下载到的只有W…

gojs 部分功能实现

最近做的项目用到了gojs,使用了一段时间发现其功能特别强大,先记录下目前自己用到的把 1. 初始化画布 myDiagram $(go.Diagram, "myDiagramDiv", {}); 2. 定义node 模型 myDiagram.nodeTemplate $(go.Node, "Vertical", { locati…

CPU是如何访问到内存的?

讨论的重点我们知道CPU有地址总线,数据总线和控制总线数据总线(Data Bus):在CPU与RAM之间来回传送需要处理或是需要储存的数据。地址总线(Address Bus):用来指定在RAM(Random Access…

海量url mysql_海量数据mysql优化步骤

第一优化你的sql和索引;第二加缓存,memcached,redis;第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第…

macos支持exfat吗_打造便捷、人性化的macOS桌面使用环境

原标题:打造便捷、人性化的macOS桌面使用环境打造便捷、人性化的macOS桌面使用环境 2020-10-23 17:25:410点赞4收藏0评论欢迎参加#果粉是怎样炼成的#征稿,围观秋季发布会新品!是什么让苹果生态无法割舍?快来讲讲你的果粉炼成记&am…

Delphi XE7的Splash 功能

Delphi XE7的Splash 功能转载于:https://www.cnblogs.com/LittleTiger/p/7020349.html

滴滴是如何搭建起PB级数据中台的?

滴滴公司自12年底上线至今,俨然成功跻身互联网大咖行列,在以流量活命的互联网世界里,如果没有一定的硬核技术为业务做支撑,单靠营销与宣传,是没有办法留住日益挑剔的用户的。我们今天就谈一谈滴滴打车背后所用到的大数…

gdbc 同步mysql_Jdbc数据同步

ElasticSearch 安装安装前准备安装JDK7及以上版本(这里不再讲述JDK安装步骤)下载ElasticSearch安装包,点击 获取elasticsearch-2.1.1.tar.gz安装包(https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.…

CommonJS规范

概述 Node应用由模块组成,采用CommonJS模块规范。 根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。转载于:https://www.cnblogs.com/happy1992…

java技术_2020年最流行的Java开发技术

点击上方“千锋教育”后台回复「 Java 」,领取视频学习教程在本文中,我们将以编程界最常用的编程语言Java为例,分享最为主流的技术与工具。Java几乎无处不在,无论在智能手机、台式机、游戏设备还是科学超级计算机上,处…

一个小码农对嵌入式的理解

今年毕业刚工作半年,稍微写一下自己的见解。嵌入式工程师简直就是硬件工程师与软件工程师的合体!别问我是哪一类软件工程师,反正不是前端、后端、APP、测试、运维。也别问我是什么硬件工程师,电源、单片机、高频、通信……你会做你…