建网站的网络公司,房价成交数据官网查询,wordpress 首页幻灯片,wordpress树结构插件一 简述前面介绍了malloc_debug功能#xff0c;用来进行内存泄露等检测#xff0c;其实android可以使用多种方法进行内存相关的监控。比如利用llvm功能再编译时添加内存的相关检测。Android R默认开启了scudo。scudo这个选项主要功能是再分配内存时会添加64 bit的Header// Ou…一 简述前面介绍了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 quarantinedu64 AllocType : 2; // malloc, new, new[], or memalignu64 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 : truego版本默认是关闭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: -fsanitizescudo,undefined)llvm下主要的生效方式是// Youll 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的方式。