Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects

2023-10-13 15:50

本文主要是介绍Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


原文:https://www.cnblogs.com/sunjianfei/p/7053289.html




最近项目中使用一个翻拍身份证信息识别活体检测的第三方框架,在使用时会偶然性的出现崩溃的现象,经过查找是因为第三方框架中有释放的内存区域再次引用引起的,因而补充一下相关知识点。

在Xcode Edit Scheme中有这样几个属性:
下面是我在网上找到的相关英文的解释,非专业出身,简单翻译一下用于理解
Enable Scribble: Fill allocated memory with 0xAA and deallocated memory with 0x55.
Scribble will make it rather obvious that you're using a memory block after it's free'd by overwriting any data that used to be in the memory block upon free. 
启用数据写入:对象释放时,所用内存并没有完全被擦除,仍有旧对象部分数据可用,如果不使用Zombie调试,App可能不会直接crash。对付这种情况,其实很简单,可以在对象内存释放时写入无意义数据分配的内存写入数据0xAA,释放的内存写入0x55。有些内存块已经被释放时,可以通过对数据进行重写让你继续使用内存块。
   
Enable Guard Edges: Add guard pages before and after large allocations.
启用保护边缘:在大的内存分配之前或者之后添加保护页面。
  
Enable Guard Malloc: Use libgmalloc to catch common memory problems such as buffer overruns and use-after-free.
启用内存保护:利用libgmalloc来捕获类似于内存溢出,对释放内存的对象再引用等内存问题。
 
Guard edges and Guard Malloc will help you find memory overruns and (to some extent) use-after-free by read and write protecting memory blocks to make your program crash more obviously if misusing memory.
边缘保护和内存分配保护,可以用来帮你查找程序中的内存问题,当代码中出现内存溢出,释放后再使用的内存问题时,它会让程序crash,这样会使得内存问题表现的更为明显。
僵尸对象(Zombie Objects):如果打开了ARC或垃圾回收模式,在程序中发消息给已经释放的对象,将会引起程序崩溃。这时定位崩溃原因将非常困难,因为出问题的对象已经重新分配了。

解决方法:可以通过启动僵尸对象(Zombie Objects)来解决,开启该选项后,程序在运行时,如果访问了已经释放的对象,则会给出较准确的定位信息,可以帮助确定问题所在。

功能的原理:在对象释放(retainCount 为0)时,使用一个内置的Zombie对象,替代原来被释放的对象。无论向该对象发送什么消息(函数调用),都会触发异常,抛出调试信息。

注意:记得问题被修复后,关闭该功能 


这篇关于Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/204298

相关文章

Oracle Data Guard:Oracle数据库的高可用性和灾难恢复解决方案

在企业级数据库管理中,确保数据的高可用性和在灾难情况下的快速恢复是至关重要的。Oracle Data Guard是Oracle公司提供的一种强大的数据库高可用性解决方案,它通过在主数据库和至少一个备用数据库之间提供实时或近实时的数据保护来实现这一目标。本文将详细介绍如何在Oracle数据库中部署和使用Oracle Data Guard,包括其基本概念、配置步骤、管理技巧和实际应用示例。 1. O

C语言动态内存空间分配(malloc,calloc,realloc,free)

为了代码观感美观,我将代码部分的注释删了 malloc #include<stdio.h>#include<stdlib.h>#include<errno.h>//使用动态内存分配函数的注意事项://1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问//3.动态内存空间中

Linux malloc内存分配实现原理

目录   一、用户进程虚拟内存空间布局 二、malloc工作原理 2.1 malloc实现流程 2.1.1 brk方式申请内存 2.1.2 mmap方式分配内存 2.2 核心代码 2.3 malloc分配物理内存的时机 2.4 malloc分配的实际内存大小 三、虚拟内存与物理内存 3.1 如何建立映射 3.2 分配物理内存 3.3 物理内存访问 四、new和mall

关于std::shared_ptr和enable_share_from_this的一个隐蔽的问题

在使用共享指针时,遇到了一个如下问题: #include <iostream>class traversal;class observer {std::shared_ptr<traversal> m_tra;public:observer(std::shared_ptr<traversal> t):m_tra(t) {};~observer() { std::cout << "releas

malloc和new的区别是什么?

目录 前言 ​编辑 1. 语言级别 2. 内存分配和初始化 3. 返回类型 4.失败时的行为 5. 释放内存 6. 运用场景 前言 malloc 是 C 语言的内存分配函数,简单但不支持对象初始化。new 是 C++ 中的运算符,功能更强大,能够同时进行内存分配和对象初始化,并且支持异常处理。 1. 语言级别 malloc:是 C 语言中的标准库函数,用于分配

malloc/free 和 new/delete的区别

malloc/free 和 new/delete 是 C++ 中两种不同的动态内存管理方法,它们有一些关键的区别: 1. 内存分配和释放机制 malloc 和 free: 函数: malloc 是一个 C 标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个 void* 指针,指向分配的内存块的起始位置。free 用于释放由 malloc 分配的内存,防止内存泄漏。初始化: mallo

C++ 有 mutex.lock 为什么要用 lock_guard 、unique_lock

因为直接操作 mutex,即直接调用 mutex 的 lock / unlock 函数。   而使用 lock_guard 可以自动加锁、解锁   C++ Boost库 多线程 线程锁mutex lock_guard 、unique_lock 实例_软件工程小施同学 的专栏-CSDN博客

JavaScript - Objects

对象定义: let person = {name: {first: "Bob",last: "smith"},age: 32,gender: 'male',interests: ['music', 'skiing'],bio: function () {alert(this.name[0] + ' ' + this.name[1] + ' is ' + this.age + ' year

从0实现malloc函数

本文介绍如何用c语言实现一个简单的内存分配器,可替换glibc中的 malloc(), calloc(), realloc(), free(). 这是一篇入门级别的文章,所以不会介绍所有的细节。 代码实现主要为了演示内存分配器的基本工作原理,所以和工业级内存分配器相比,缺少非常多的性能优化,分配内存时也不会按页对齐,但是至少,我们构建的内存分配器是可以工作的。 在构建内存分配器之前,需要先介绍

malloc realloc calloc的区别

void *malloc(size_t,size)   malloc函数用来从堆空间中申请指定的size个字节的内存大小;     void *realloc(void *mem_address, size_t new_size)   用来重新指定mem_address所指向的空间的大小,其大小为new_size,如果mem_address