CN115080252B - iOS平台中基于无锁的非法内存访问检测方法和装置 - Google Patents

iOS平台中基于无锁的非法内存访问检测方法和装置 Download PDF

Info

Publication number
CN115080252B
CN115080252B CN202211010133.8A CN202211010133A CN115080252B CN 115080252 B CN115080252 B CN 115080252B CN 202211010133 A CN202211010133 A CN 202211010133A CN 115080252 B CN115080252 B CN 115080252B
Authority
CN
China
Prior art keywords
memory
snooping
released
illegal
monitoring
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202211010133.8A
Other languages
English (en)
Other versions
CN115080252A (zh
Inventor
李宇航
李大和
李治霖
高攀
李大海
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhizhe Sihai Beijing Technology Co Ltd
Original Assignee
Zhizhe Sihai Beijing Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Zhizhe Sihai Beijing Technology Co Ltd filed Critical Zhizhe Sihai Beijing Technology Co Ltd
Priority to CN202211010133.8A priority Critical patent/CN115080252B/zh
Publication of CN115080252A publication Critical patent/CN115080252A/zh
Application granted granted Critical
Publication of CN115080252B publication Critical patent/CN115080252B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/3037Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a memory, e.g. virtual memory, cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/14Protection against unauthorised use of memory or access to memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Mathematical Physics (AREA)
  • Quality & Reliability (AREA)
  • Storage Device Security (AREA)

Abstract

本发明提供一种iOS平台中基于无锁的非法内存访问检测方法和装置,其中方法包括:将待释放内存对象在同一位置转换为内存监听对象;利用均匀随机算法确定内存监听对象在预设内存池中的索引位置,并将内存监听对象的内存地址存储至预设内存池中的索引位置处;其中,预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;监听内存监听对象,若捕获到针对内存监听对象的调用事件,则基于调用事件确定非法内存访问的诊断结果描述信息。本发明可以实现准确的非法内存访问问题的检测和诊断,且可以广泛应用到线上阶段的真实用户,其实用性和适用范围得到了有效提升。

Description

iOS平台中基于无锁的非法内存访问检测方法和装置
技术领域
本发明涉及内存监控技术领域,尤其涉及一种iOS平台中基于无锁的非法内存访问检测方法和装置。
背景技术
iOS平台作为主流移动设备平台之一,目前在世界范围内服务于大量的用户,大量移动应用也基于iOS平台向iOS用户提供内容服务。对于移动应用而言,程序运行稳定性是最重要的用户体验指标,其中非法内存访问导致的程序崩溃闪退问题一直都是程序稳定性方面的疑难问题。
此处,非法内存访问导致的程序崩溃问题的疑难点在于程序崩溃的时机并非问题产生的时机,而真正导致内存问题的根源在于程序内存被释放的时机。因此需要监控机制来回溯整个应用程序使用过程中的内存释放过程,从而发现问题所在。然而,移动设备上由于存储空间资源有限,处理能力规模有限,在不影响用户正常使用的前提下,耗费资源较大的监控方案无法被广泛应用,因而对监控方案本身带来的性能损耗提出了挑战。
目前,Apple公司官方在Xcode上提供了一种内存监控方式,该方式通过存储已释放的内存对象数据来进行对非法内存访问问题的诊断,诊断结果会以监控到的非法内存对象的数据类型作为诊断信息来展示。另外,KSCrash KSZombie技术会在一个HashMap中存储已释放对象的信息,包括已释放对象的数据类型、内存地址等,诊断结果会根据程序出现内存问题后,获取最后一个记录的已释放对象来展示。
然而,Apple 公司官方的Xcode上提供的监控技术使用场景局限于程序的开发调试阶段,在日常遇到的问题中,非法内存访问问题出现的随机性较大,绝大多数问题出现的概率比较低,开发调试阶段来发现就变得非常困难。另外,诊断结果中只有数据类型,如果出现问题的是一个使用范围较大的数据类型,也难以最终确定问题出现原因。更重要的是,技术本身性能消耗较大,在功能丰富的应用上使用,无法持续监控太长时间就会出现应用内存耗尽的现象,很难发现一些隐藏比较深层次的问题,难以适用于应用线上阶段。
KSCrash KSZombie技术主要以最后一次释放的对象进行检测,诊断准确性不足,原因在于最后一次释放的对象较大概率并不是产生问题的对象。其次,此技术也存在诊断信息有限的问题,仅仅提供出问题内存对象的数据类型,不足以帮助定位到问题发生的根本原因。另外,该技术还存在HashMap存储不均匀,同时也会出现不同线程索引相同情况导致的多线程同时读写的程序崩溃问题。因此,上述问题导致了KSCrash KSZombie不能大范围使用。
发明内容
本发明提供一种iOS平台中基于无锁的非法内存访问检测方法和装置,用以解决现有技术中非法内存访问诊断效果欠佳、性能不足从而难以应用于功能丰富的应用的线上阶段缺陷。
本发明提供一种iOS平台中基于无锁的非法内存访问检测方法,包括:
确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;
利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;
监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
根据本发明提供的一种iOS平台中基于无锁的非法内存访问检测方法,所述利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
获取所述待释放内存对象的释放线程的描述信息,并从所述释放线程的描述信息中获取所述释放线程的线程号;
将所述释放线程的线程号作为随机因子,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
根据本发明提供的一种iOS平台中基于无锁的非法内存访问检测方法,所述将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
若所述预设内存池中的所述索引位置处已存储有另一历史内存监听对象的内存地址,则基于所述另一历史内存监听对象的内存地址,释放所述另一历史内存监听对象占用的内存,以自动回收通过非法内存访问检测的内存监听对象占用的内存;
待所述另一历史内存监听对象占用的内存被回收后,将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
根据本发明提供的一种iOS平台中基于无锁的非法内存访问检测方法,所述将所述待释放内存对象在同一位置转换为内存监听对象,具体包括:
基于Runtime机制,对所述待释放内存对象进行方法交换,以自定义生命周期函数替换所述待释放内存对象中的生命周期函数;
基于所述自定义生命周期函数获取所述待释放内存对象的类型信息并抓取所述待释放内存对象的释放线程的释放堆栈信息;
基于所述待释放内存对象中的析构函数执行所述待释放内存对象的内存释放过程后,在所述待释放对象的内存地址处构建无实现方法的内存监听对象,并将所述待释放内存对象的类型信息以及所述释放线程的释放堆栈信息存储到所述内存监听对象中。
根据本发明提供的一种iOS平台中基于无锁的非法内存访问检测方法,所述监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息,具体包括:
基于消息转发机制,在消息转发的最后一个常规前向传递阶段拦截针对所述内存监听对象的调用事件;
基于所述调用事件确定所述内存监听对象的外部调用者以及具体调用信息;
基于所述内存监听对象的外部调用者以及具体调用信息,以及所述内存监听对象中包含的所述待释放内存对象的类型信息和释放堆栈信息,确定所述非法内存访问的诊断结果描述信息。
根据本发明提供的一种iOS平台中基于无锁的非法内存访问检测方法,所述非法内存访问的诊断结果描述信息中包括产生非法内存访问的被访问对象类型、所述外部调用者、所述被访问对象被调用的方法,以及基于所述释放堆栈信息追溯得到的产生非法内存访问的原因。
本发明还提供一种iOS平台中基于无锁的非法内存访问检测装置,包括:
内存监听对象转换单元,用于确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;
内存监听对象管理单元,用于利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;
内存监听对象监听单元,用于监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
根据本发明提供的一种iOS平台中基于无锁的非法内存访问检测装置,所述利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
获取所述待释放内存对象的释放线程的描述信息,并从所述释放线程的描述信息中获取所述释放线程的线程号;
将所述释放线程的线程号作为随机因子,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述iOS平台中基于无锁的非法内存访问检测方法。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述iOS平台中基于无锁的非法内存访问检测方法。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述iOS平台中基于无锁的非法内存访问检测方法。
本发明提供的iOS平台中基于无锁的非法内存访问检测方法和装置,通过将待释放内存对象在内存的同一位置转换为一个没有任何实现方法的Objective-C类的对象,即内存监听对象,并在该内存监听对象中存储原待释放内存对象的类型信息和此时的释放堆栈信息,再基于均匀随机的无锁方式对内存监听对象进行管理,有效控制了整体检测方案的内存使用情况,避免内存消耗过多,也能保证监控效果符合要求,且无锁方式可以解决多线程的并发问题同时兼顾程序运行效率,可以保障非法内存访问检测算法的持续运行,最后对内存监听对象进行监听,捕获针对内存监听对象的调用事件,并基于调用事件确定非法内存访问的诊断结果描述信息,可以实现准确的非法内存访问问题的检测和诊断,其极低的性能损耗可以广泛应用到线上阶段的真实用户,其实用性和适用范围得到了有效提升。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的iOS平台中基于无锁的非法内存访问检测方法的流程示意图;
图2是本发明提供的非法内存访问检测方法的阶段示意图;
图3是本发明提供的待释放内存对象转换阶段的示意图;
图4是本发明提供的内存监听对象管理阶段的示意图;
图5是本发明提供的非法内存访问出现原因的示意图;
图6是本发明提供的内存监听对象监听阶段的示意图;
图7是本发明提供的均匀随机算法的示意图;
图8是本发明提供的iOS平台中基于无锁的非法内存访问检测装置的结构示意图;
图9是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明提供的iOS平台中基于无锁的非法内存访问检测方法的流程示意图,如图1所示,该方法包括:
步骤110,确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;
步骤120,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;
步骤130,监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
具体地,首先获取当前需要被释放的内存对象,即待释放内存对象。其中,在iOS平台中Objective-C对象的内存管理机制是引用计数,若一个内存对象的引用计数大于0,说明该对象被持有,不能释放;若一个内存对象的引用计数为0时,表示这个内存对象应该被释放。因此,可以获取当前引用计数为0的内存对象作为上述待释放内存对象。
为了提升非法内存访问检测的准确性,提供足够丰富的诊断信息,同时降低检测算法性能损耗,使得该算法可以适用于功能丰富的应用的线上阶段,从而在精准检测非法内存访问问题、提升应用稳定性的同时不影响用户的正常使用,本发明实施例将通过无锁方式存储管理内存对象释放记录,进而在非法内存访问问题出现的时候得以获取准确且足够的诊断信息来确定问题原因。如图2所示,整体流程分为待释放内存对象转换阶段、内存监听对象管理阶段,以及内存监听对象监听阶段。
如图3所示,在待释放内存对象转换阶段,需要将待释放内存对象在内存的同一位置转换为一个没有任何实现方法的Objective-C类的对象,即内存监听对象,并在该内存监听对象中存储原待释放内存对象的类型信息和此时的释放堆栈信息。其中,释放堆栈信息即负责释放该待释放内存对象所占内存的线程的堆栈信息。经转换后的内存监听对象中仅包含待释放内存对象的类型信息和释放堆栈信息,其在内存中仅占用2字节大小的空间,相较于待释放内存对象所占用的内存大小大大降低,因此节省了内存空间,从而可以持续性地监听非法内存访问的问题。
虽然内存监听对象相对于待释放内存对象而言占用了更少的内存空间,但考虑到内存空间有限,若在应用线上阶段持续监测非法内存访问问题,内存中将累积大量的内存监听对象从而占用过多内存空间,导致应用的其他功能运行受限。因此,为了能够在线上阶段不影响用户正常使用应用的过程中持续监测非法内存访问问题,可以在内存监听对象管理阶段对已经生成的内存监听对象进行管理。其中,可以将各个内存监听对象的内存地址存储至内存中预先开辟的一段内存池中,利用该内存池对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象(即对应的待释放对象在释放内存后被其他调用者再次调用的风险较低,发生非法内存访问的可能性较低)占用的内存。由于通过非法内存访问检测的内存监听对象对应的待释放对象发生非法内存访问的可能性较低,因此可以通过自动回收上述内存监听对象占用的内存,用于保存新生成的内存监听对象,有效地控制了整体检测方案的内存使用情况,避免内存消耗过多,也能保证监控效果符合要求,从而可以保障非法内存访问检测算法的持续运行。
此处,在进行内存监听对象的管理时,由于整个程序运行过程中会产生大量的内存对象,当这些对象需要被释放时,将转换成大量的内存监听对象。然而,由于其释放过程将发生在不同释放线程,在管理其对应的内存监听对象时,会出现大量线程同时访问上述内存池的情形。如果用加锁机制来维护上述释放线程的安全,会造成大量的内存对象释放任务阻塞而使程序出现卡顿现象,极大影响用户体验。然而,如果不保证上述释放线程的安全,容易出现多线程同时进行内存读写的情形从而引发更严重的程序闪退问题。所以本发明实施例提供一种可以无锁保护的多线程并发存储机制,以解决多线程的并发问题同时兼顾程序运行效率。
具体而言,如图4所示,可以利用均匀随机算法进行均匀随机数的获取,将该均匀随机数作为上一阶段生成的内存监听对象在上述内存池中的索引位置,并将该内存监听对象的内存地址存储到该内存池的上述索引位置处,以对该内存监听对象进行管理。通过上述均匀随机方式为不同内存监听对象设置不同的索引位置,可以保证不同线程在相邻的一段时间内进行内存池读写操作时大概率不会操作相同索引位置的内存,从而可以不需要加锁即可维护内存池的线程安全。
如图5所示,非法内存访问导致的程序崩溃问题的出现原因是因为一个Objective-C对象已经被释放,但在被释放后又有其他的外部调用者来调用这个对象的方法导致。为了检测这种情况并诊断其出现原因,上述步骤中将待释放内存对象在原有的内存释放过程中将其类型信息和释放堆栈保存起来,并转换成内存监听对象,从而可以捕捉到外部调用者调用一个原本已经被释放的内存对象的情况。其中,内存监听对象实际上是一个没有实现任何方法的空类的对象,若有外部调用者来调用该对象的任何方法时,可以利用Objective-C的消息转发机制对上述调用行为进行拦截,最终调用非法内存访问监听函数对上述调用事件进行分析,确定非法内存访问的诊断结果描述信息,并进行统一上报处理。整个监听过程如图6所示。
本发明实施例提供的方法,通过将待释放内存对象在内存的同一位置转换为一个没有任何实现方法的Objective-C类的对象,即内存监听对象,并在该内存监听对象中存储原待释放内存对象的类型信息和此时的释放堆栈信息,再基于均匀随机的无锁方式对内存监听对象进行管理,有效控制了整体检测方案的内存使用情况,避免内存消耗过多,也能保证监控效果符合要求,且无锁方式可以解决多线程的并发问题同时兼顾程序运行效率,可以保障非法内存访问检测算法的持续运行,最后对内存监听对象进行监听,捕获针对内存监听对象的调用事件,并基于调用事件确定非法内存访问的诊断结果描述信息,可以实现准确的非法内存访问问题的检测和诊断,其极低的性能损耗可以广泛应用到线上阶段的真实用户,其实用性和适用范围得到了有效提升。
基于上述实施例,所述利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
获取所述待释放内存对象的释放线程的描述信息,并从所述释放线程的描述信息中获取所述释放线程的线程号;
将所述释放线程的线程号作为随机因子,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
具体地,由于iOS平台提供的均匀随机函数是伪随机数,即随机数序列如果使用相同或相近的随机因子可能会得到相同的随机数序列。因此,若多个线程在相同时刻或者近似时刻调用均匀随机函数以获取随机数时,有可能获取到相同的随机数,而获得相同随机数后会出现上述多个线程同时访问一个目标索引位置的内存的现象,从而产生程序闪退的问题。为了解决该问题,本发明实施例将线程号(Thread Number)作为均匀随机函数的随机因子,使得多个线程所获得随机数属于不同的随机数序列,因而获得的随机数出现相等的概率非常低。
具体而言,如图7所示,可以获取待释放内存对象的释放线程的描述信息,并从上述释放线程的描述信息中解析释放线程的线程号。随后,将上述释放线程的线程号作为随机因子,利用均匀随机算法确定该待释放内存对象对应的内存监听对象在预设内存池中的索引位置,并将该内存监听对象的内存地址存储至内存池中的上述索引位置处。
基于上述任一实施例,所述将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
若所述预设内存池中的所述索引位置处已存储有另一历史内存监听对象的内存地址,则基于所述另一历史内存监听对象的内存地址,释放所述另一历史内存监听对象占用的内存,以自动回收通过非法内存访问检测的内存监听对象占用的内存;
待所述另一历史内存监听对象占用的内存被回收后,将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
具体地,采用均匀随机算法为各个内存监听对象分配内存地址,可以保证各个内存监听对象的内存地址可以均匀存储到内存池中的各个位置,而不会在短时间内为两个不同的内存监听对象分配同一索引位置。因此,当为新生成的内存监听对象分配索引位置时,发现该索引位置处已存储有另一历史内存监听对象的内存地址,可以判断该另一历史内存监听对象已经被监听了一个较长时间且未发生非法内存访问的问题。考虑到非法内存访问问题通常出现在待释放内存对象占用的内存刚被释放掉的一段较短时间段内,因此若一个待释放内存对象转换而来的内存监听对象已被监听了一个较长时间且未发生非法内存访问的问题,则可以认为该内存监听对象通过了非法内存访问检测,其不再有非法内存访问的风险。此时,可以基于上述另一历史内存监听对象的内存地址,释放该另一历史内存监听对象占用的内存,以自动回收通过非法内存访问检测的内存监听对象占用的内存。待上述另一历史内存监听对象占用的内存被回收后,即可将上述新生成的内存监听对象的内存地址存储至预设内存池中的上述索引位置处,实现内存监听对象的管理,避免内存消耗过多,同时也能保证监控效果符合要求。
基于上述任一实施例,所述将所述待释放内存对象在同一位置转换为内存监听对象,具体包括:
基于Runtime机制,对所述待释放内存对象进行方法交换,以自定义生命周期函数替换所述待释放内存对象中的生命周期函数;
基于所述自定义生命周期函数获取所述待释放内存对象的类型信息并抓取所述待释放内存对象的释放线程的释放堆栈信息;
基于所述待释放内存对象中的析构函数执行所述待释放内存对象的内存释放过程后,在所述待释放对象的内存地址处构建无实现方法的内存监听对象,并将所述待释放内存对象的类型信息以及所述释放线程的释放堆栈信息存储到所述内存监听对象中。
具体地,可以基于iOS平台中Objective-C语言提供的Runtime机制,利用class_replaceMethod方法对待释放内存对象进行方法交换,用自定义生命周期函数(dealloc函数)来替换原有待释放内存对象中的生命周期函数。在自定义生命周期函数中,预设了信息获取方法,用于获取待释放内存对象的类型信息(className信息)以及抓取待释放内存对象的释放线程的释放堆栈信息。
待进入到待释放内存对象的释放流程中时,会自动调用上述自定义生命周期函数并执行其中的信息获取方法,以获取待释放内存对象的类型信息并抓取待释放内存对象的释放线程的释放堆栈信息。信息获取完毕后,再执行原待释放内存对象中的析构函数进行内存释放操作,释放待释放内存对象所占用的内存。内存释放完毕后,再在原待释放内存对象的相同内存位置处构建一个新的内存监听对象,并将上述待释放内存对象的类型信息以及上述释放线程的释放堆栈信息存储到该内存监听对象中,从而提供尽可能丰富的问题描述信息以供进行问题诊断的同时尽可能减少内存消耗。
基于上述任一实施例,所述监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息,具体包括:
基于消息转发机制,在消息转发的最后一个常规前向传递阶段拦截针对所述内存监听对象的调用事件;
基于所述调用事件确定所述内存监听对象的外部调用者以及具体调用信息;
基于所述内存监听对象的外部调用者以及具体调用信息,以及所述内存监听对象中包含的所述待释放内存对象的类型信息和释放堆栈信息,确定所述非法内存访问的诊断结果描述信息。
具体地,由于内存监听对象实际上是一个没有实现任何方法的空类的对象,如果有外部调用者来调用该对象任何方法时,将会触发Objective-C语言的消息转发机制,程序会在运行时进入消息转发的三个阶段:Method resolution(方法解析处理阶段)阶段、Fastforwarding(快速前向传递)阶段和Normal forwarding(常规前向传递)阶段。由于内存监听对象中没有任何实现方法,因此程序会依次经历第一阶段和第二阶段,来到第三阶段,即常规前向传递阶段。本发明实施例选择在最后一个常规前向传递阶段进行消息拦截,拦截针对上述内存监听对象的调用事件。其中,若拦截到针对内存监听对象的调用事件,由于内存监听对象对应的待释放内存对象此时已被释放掉,因此可以表明当前发生了非法内存访问事件。
因此,在拦截到针对上述内存监听对象的调用事件后,可以基于上述调用事件确定该内存监听对象的外部调用者以及具体调用信息,并基于该内存监听对象的外部调用者以及具体调用信息,以及该内存监听对象中包含的其对应的待释放内存对象的类型信息和释放堆栈信息,确定此次非法内存访问的诊断结果描述信息。其中,非法内存访问的诊断结果描述信息中可以包括产生非法内存访问的被访问对象(即被调用的内存监听对象对应的原始待释放内存对象)类型、上述外部调用者、上述被访问对象被调用的方法,以及基于上述释放堆栈信息追溯得到的产生非法内存访问的原因。
下面对本发明提供的iOS平台中基于无锁的非法内存访问检测装置进行描述,下文描述的iOS平台中基于无锁的非法内存访问检测装置与上文描述的iOS平台中基于无锁的非法内存访问检测方法可相互对应参照。
基于上述任一实施例,图8是本发明提供的iOS平台中基于无锁的非法内存访问检测装置的结构示意图,如图8所示,该装置包括:内存监听对象转换单元810、内存监听对象管理单元820和内存监听对象监听单元830。
其中,内存监听对象转换单元810用于确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;
内存监听对象管理单元820用于利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;
内存监听对象监听单元830用于监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
本发明实施例提供的装置,通过将待释放内存对象在内存的同一位置转换为一个没有任何实现方法的Objective-C类的对象,即内存监听对象,并在该内存监听对象中存储原待释放内存对象的类型信息和此时的释放堆栈信息,再基于均匀随机的无锁方式对内存监听对象进行管理,有效控制了整体检测方案的内存使用情况,避免内存消耗过多,也能保证监控效果符合要求,且无锁方式可以解决多线程的并发问题同时兼顾程序运行效率,可以保障非法内存访问检测算法的持续运行,最后对内存监听对象进行监听,捕获针对内存监听对象的调用事件,并基于调用事件确定非法内存访问的诊断结果描述信息,可以实现准确的非法内存访问问题的检测和诊断,其极低的性能损耗可以广泛应用到线上阶段的真实用户,其实用性和适用范围得到了有效提升。
基于上述任一实施例,所述利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
获取所述待释放内存对象的释放线程的描述信息,并从所述释放线程的描述信息中获取所述释放线程的线程号;
将所述释放线程的线程号作为随机因子,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
基于上述任一实施例,所述将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
若所述预设内存池中的所述索引位置处已存储有另一历史内存监听对象的内存地址,则基于所述另一历史内存监听对象的内存地址,释放所述另一历史内存监听对象占用的内存,以自动回收通过非法内存访问检测的内存监听对象占用的内存;
待所述另一历史内存监听对象占用的内存被回收后,将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
基于上述任一实施例,所述将所述待释放内存对象在同一位置转换为内存监听对象,具体包括:
基于Runtime机制,对所述待释放内存对象进行方法交换,以自定义生命周期函数替换所述待释放内存对象中的生命周期函数;
基于所述自定义生命周期函数获取所述待释放内存对象的类型信息并抓取所述待释放内存对象的释放线程的释放堆栈信息;
基于所述待释放内存对象中的析构函数执行所述待释放内存对象的内存释放过程后,在所述待释放对象的内存地址处构建无实现方法的内存监听对象,并将所述待释放内存对象的类型信息以及所述释放线程的释放堆栈信息存储到所述内存监听对象中。
基于上述任一实施例,所述监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息,具体包括:
基于消息转发机制,在消息转发的最后一个常规前向传递阶段拦截针对所述内存监听对象的调用事件;
基于所述调用事件确定所述内存监听对象的外部调用者以及具体调用信息;
基于所述内存监听对象的外部调用者以及具体调用信息,以及所述内存监听对象中包含的所述待释放内存对象的类型信息和释放堆栈信息,确定所述非法内存访问的诊断结果描述信息。
基于上述任一实施例,所述非法内存访问的诊断结果描述信息中包括产生非法内存访问的被访问对象类型、所述外部调用者、所述被访问对象被调用的方法,以及基于所述释放堆栈信息追溯得到的产生非法内存访问的原因。
图9是本发明提供的电子设备的结构示意图,如图9所示,该电子设备可以包括:处理器(processor)910、存储器(memory)920、通信接口(Communications Interface)930和通信总线940,其中,处理器910,存储器920,通信接口930通过通信总线940完成相互间的通信。处理器910可以调用存储器920中的逻辑指令,以执行iOS平台中基于无锁的非法内存访问检测方法,该方法包括:确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
此外,上述的存储器920中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的iOS平台中基于无锁的非法内存访问检测方法,该方法包括:确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的iOS平台中基于无锁的非法内存访问检测方法,该方法包括:确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (8)

1.一种iOS平台中基于无锁的非法内存访问检测方法,其特征在于,包括:
确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;
利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;
监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息;
所述利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
获取所述待释放内存对象的释放线程的描述信息,并从所述释放线程的描述信息中获取所述释放线程的线程号;
将所述释放线程的线程号作为随机因子,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
2.根据权利要求1所述的iOS平台中基于无锁的非法内存访问检测方法,其特征在于,所述将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
若所述预设内存池中的所述索引位置处已存储有另一历史内存监听对象的内存地址,则基于所述另一历史内存监听对象的内存地址,释放所述另一历史内存监听对象占用的内存,以自动回收通过非法内存访问检测的内存监听对象占用的内存;
待所述另一历史内存监听对象占用的内存被回收后,将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
3.根据权利要求1所述的iOS平台中基于无锁的非法内存访问检测方法,其特征在于,所述将所述待释放内存对象在同一位置转换为内存监听对象,具体包括:
基于Runtime机制,对所述待释放内存对象进行方法交换,以自定义生命周期函数替换所述待释放内存对象中的生命周期函数;
基于所述自定义生命周期函数获取所述待释放内存对象的类型信息并抓取所述待释放内存对象的释放线程的释放堆栈信息;
基于所述待释放内存对象中的析构函数执行所述待释放内存对象的内存释放过程后,在所述待释放内存对象的内存地址处构建无实现方法的内存监听对象,并将所述待释放内存对象的类型信息以及所述释放线程的释放堆栈信息存储到所述内存监听对象中。
4.根据权利要求3所述的iOS平台中基于无锁的非法内存访问检测方法,其特征在于,所述监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息,具体包括:
基于消息转发机制,在消息转发的最后一个常规前向传递阶段拦截针对所述内存监听对象的调用事件;
基于所述调用事件确定所述内存监听对象的外部调用者以及具体调用信息;
基于所述内存监听对象的外部调用者以及具体调用信息,以及所述内存监听对象中包含的所述待释放内存对象的类型信息和释放堆栈信息,确定所述非法内存访问的诊断结果描述信息。
5.根据权利要求4所述的iOS平台中基于无锁的非法内存访问检测方法,其特征在于,所述非法内存访问的诊断结果描述信息中包括产生非法内存访问的被访问对象类型、所述外部调用者、所述被访问对象被调用的方法,以及基于所述释放堆栈信息追溯得到的产生非法内存访问的原因。
6.一种iOS平台中基于无锁的非法内存访问检测装置,其特征在于,包括:
内存监听对象转换单元,用于确定待释放内存对象,并将所述待释放内存对象在同一位置转换为内存监听对象;其中,所述内存监听对象中仅包含所述待释放内存对象的类型信息和释放堆栈信息;
内存监听对象管理单元,用于利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处;其中,所述预设内存池用于对其中存储的内存地址对应的内存监听对象进行管理,自动回收通过非法内存访问检测的内存监听对象占用的内存;
内存监听对象监听单元,用于监听所述内存监听对象,若捕获到针对所述内存监听对象的调用事件,则基于所述调用事件确定非法内存访问的诊断结果描述信息;
所述利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处,具体包括:
获取所述待释放内存对象的释放线程的描述信息,并从所述释放线程的描述信息中获取所述释放线程的线程号;
将所述释放线程的线程号作为随机因子,利用均匀随机算法确定所述内存监听对象在预设内存池中的索引位置,并将所述内存监听对象的内存地址存储至所述预设内存池中的索引位置处。
7.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至5任一项所述iOS平台中基于无锁的非法内存访问检测方法。
8.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述iOS平台中基于无锁的非法内存访问检测方法。
CN202211010133.8A 2022-08-23 2022-08-23 iOS平台中基于无锁的非法内存访问检测方法和装置 Active CN115080252B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211010133.8A CN115080252B (zh) 2022-08-23 2022-08-23 iOS平台中基于无锁的非法内存访问检测方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211010133.8A CN115080252B (zh) 2022-08-23 2022-08-23 iOS平台中基于无锁的非法内存访问检测方法和装置

Publications (2)

Publication Number Publication Date
CN115080252A CN115080252A (zh) 2022-09-20
CN115080252B true CN115080252B (zh) 2022-11-08

Family

ID=83244459

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211010133.8A Active CN115080252B (zh) 2022-08-23 2022-08-23 iOS平台中基于无锁的非法内存访问检测方法和装置

Country Status (1)

Country Link
CN (1) CN115080252B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002055851A (ja) * 2000-08-10 2002-02-20 Himacs Ltd コンピュータシステムにおける不正なメモリアクセスを検出する監視方法及びそのプログラム並びにその記録媒体
CN1885275A (zh) * 2005-06-20 2006-12-27 中兴通讯股份有限公司 一种嵌入式系统及其实时内存监控处理方法
CN101110044A (zh) * 2007-08-28 2008-01-23 中兴通讯股份有限公司 一种内存监控管理的方法及系统
CN110413521A (zh) * 2019-07-24 2019-11-05 杭州迪普信息技术有限公司 一种堆内存的写越界检测方法和装置
CN112631893A (zh) * 2019-09-24 2021-04-09 无锡江南计算技术研究所 面向异构平台的多层次存储结构内存检测方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002055851A (ja) * 2000-08-10 2002-02-20 Himacs Ltd コンピュータシステムにおける不正なメモリアクセスを検出する監視方法及びそのプログラム並びにその記録媒体
CN1885275A (zh) * 2005-06-20 2006-12-27 中兴通讯股份有限公司 一种嵌入式系统及其实时内存监控处理方法
CN101110044A (zh) * 2007-08-28 2008-01-23 中兴通讯股份有限公司 一种内存监控管理的方法及系统
CN110413521A (zh) * 2019-07-24 2019-11-05 杭州迪普信息技术有限公司 一种堆内存的写越界检测方法和装置
CN112631893A (zh) * 2019-09-24 2021-04-09 无锡江南计算技术研究所 面向异构平台的多层次存储结构内存检测方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
高性能网络协议还原平台的研究;贾荣来等;《计算机应用与软件》;20130115(第01期);全文 *

Also Published As

Publication number Publication date
CN115080252A (zh) 2022-09-20

Similar Documents

Publication Publication Date Title
CN106681811B (zh) 基于线程池的多线程调度方法及装置
KR101683321B1 (ko) 분산 애플리케이션들을 모니터링 하는 방법
US10002074B2 (en) Non-intrusive storage of garbage collector-specific management data
US9229858B2 (en) Concurrent garbage collector thread
US9274798B2 (en) Multi-threaded logging
US20160034328A1 (en) Systems and methods for spatially displaced correlation for detecting value ranges of transient correlation in machine data of enterprise systems
CN108363657B (zh) 监控app客户端埋点数据采集完整性的方法、设备以及介质
WO2018072408A1 (zh) 一种内存分析方法、装置、系统以及计算设备
JP2007157131A (ja) ガベージ・コレクション対応の仮想マシンにおいて、将来のメモリ不足例外を自動予測する方法、コンピュータ読み取り可能な媒体、及びコンピューティング・デバイス
US20170177461A1 (en) Dynamically identifying performance anti-patterns
WO2021093365A1 (zh) 一种gpu显存管理控制方法及相关装置
CN107783829A (zh) 任务处理方法、装置、存储介质和计算机设备
CN106528293A (zh) 一种访问数据库的方法及装置
US9336110B2 (en) Identifying performance limiting internode data sharing on NUMA platforms
CN108763046A (zh) 线程运行监控方法、装置、计算机设备和存储介质
CN115080252B (zh) iOS平台中基于无锁的非法内存访问检测方法和装置
CN109885489B (zh) 驱动程序中数据竞争检测方法及装置
KR101991687B1 (ko) 동적 라이브러리 프로파일링 방법, 이를 기록한 컴퓨터로 읽을 수 있는 기록 매체 및 동적 라이브러리 프로파일링 시스템
CN108776633A (zh) 监控进程运行的方法、终端设备及计算机可读存储介质
Pasqualin et al. Online sharing-aware thread mapping in software transactional memory
CN108521351B (zh) 会话流量统计方法、处理器核心、存储介质、电子设备
CN112965845A (zh) 延迟分析方法、电子设备及存储介质
WO2023284877A1 (zh) 检测方法、装置及电子设备
CN114157717B (zh) 一种微服务动态限流的系统及方法
CN115658635A (zh) 日志分析方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant