CN109150642B - 应用内存错误检测方法、检测装置及存储介质 - Google Patents
应用内存错误检测方法、检测装置及存储介质 Download PDFInfo
- Publication number
- CN109150642B CN109150642B CN201710455121.9A CN201710455121A CN109150642B CN 109150642 B CN109150642 B CN 109150642B CN 201710455121 A CN201710455121 A CN 201710455121A CN 109150642 B CN109150642 B CN 109150642B
- Authority
- CN
- China
- Prior art keywords
- memory
- stack
- hash table
- allocated
- address
- 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
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L43/00—Arrangements for monitoring or testing data switching networks
- H04L43/50—Testing arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
-
- G—PHYSICS
- G11—INFORMATION STORAGE
- G11C—STATIC STORES
- G11C29/00—Checking stores for correct operation ; Subsequent repair; Testing stores during standby or offline operation
- G11C29/04—Detection or location of defective memory elements, e.g. cell constructio details, timing of test signals
- G11C29/08—Functional testing, e.g. testing during refresh, power-on self testing [POST] or distributed testing
- G11C29/12—Built-in arrangements for testing, e.g. built-in self testing [BIST] or interconnection details
- G11C29/44—Indication or identification of errors, e.g. for repair
-
- G—PHYSICS
- G11—INFORMATION STORAGE
- G11C—STATIC STORES
- G11C29/00—Checking stores for correct operation ; Subsequent repair; Testing stores during standby or offline operation
- G11C29/56—External testing equipment for static stores, e.g. automatic test equipment [ATE]; Interfaces therefor
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M1/00—Substation equipment, e.g. for use by subscribers
- H04M1/72—Mobile telephones; Cordless telephones, i.e. devices for establishing wireless links to base stations without route selection
- H04M1/724—User interfaces specially adapted for cordless or mobile telephones
- H04M1/72403—User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality
-
- G—PHYSICS
- G11—INFORMATION STORAGE
- G11C—STATIC STORES
- G11C29/00—Checking stores for correct operation ; Subsequent repair; Testing stores during standby or offline operation
- G11C29/56—External testing equipment for static stores, e.g. automatic test equipment [ATE]; Interfaces therefor
- G11C2029/5606—Error catch memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种应用内存错误检测方法,其包括:通过钩子接口,获取至少一内存分配数据;根据内存分配数据,获取内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;创建内存分配数据对应的地址哈希表;创建应用内存对应的堆栈哈希表;根据内存设定条件,将堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;当检测到应用内存错误发生时,将存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器。本发明还提供一种应用内存错误检测装置及存储介质,本发明可通过终端存储器将应用内存数据上报至后台服务器,以便进行内存错误检测。
Description
技术领域
本发明涉及应用数据检测领域,特别是涉及一种应用内存错误检测方法、检测装置及存储介质。
背景技术
苹果公司的苹果手机由于其稳定的性能,受到广大用户的喜爱,因此应用开发商开发了各种各样的苹果系统的应用。现有的应用开发商将应用上架应用市场前,一般会对应用进行各种功能测试,如内存错误检测也是其中重要的一项测试。
但是现有苹果手机对应用内存占用的统计操作只能通过与苹果手机相连的苹果mac电脑进行,无法通过苹果手机独立对应用内存进行统计操作。这样造成现有的苹果手机应用的测试流程较为复杂,同时无法方便的与后台服务器结合,实现应用测试结果的自动化上报监控。
发明内容
本发明实施例提供一种可通过苹果手机独立对应用内存进行统计操作,苹果手机应用的测试流程较为简单,且可实现应用测试结构的自动化上报的应用内存错误检测方法、检测装置及存储介质;以解决现有的应用内存错误检测方法、检测装置及存储介质的苹果手机应用的测试流程较为复杂,且不能对应用测试结果进行自动上报的技术问题。
本发明实施例提供一种应用内存错误检测方法,其包括:
通过钩子接口,获取至少一内存分配数据;
根据所述内存分配数据,获取所述内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;
以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈为值,创建所述内存分配数据对应的地址哈希表;
以所述地址哈希表中的所述分配内存堆栈为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;
根据内存设定条件,将所述堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;以及
当检测到应用内存错误发生时,将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
本发明实施例还提供一种应用内存错误检测装置,其包括:
内存分配数据获取模块,用于通过钩子接口,获取至少一内存分配数据;
内存分配数据参数获取模块,用于根据所述内存分配数据,获取所述内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;
地址哈希表创建模块,用于以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈为值,创建所述内存分配数据对应的地址哈希表;
堆栈哈希表创建模块,用于以所述地址哈希表中的所述分配内存堆栈为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;
拷贝模块,用于根据内存设定条件,将所述堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;以及
上报检测模块,用于当检测到应用内存错误发生时,将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
本发明实施例还提供一种存储介质,其内存储有处理器可执行指令,该处理器通过执行指令提供上述任一的应用内存错误检测方法。
相较于现有技术,本发明的应用内存错误检测方法、检测装置及存储介质通过钩子接口创建内存分配数据的地址哈希表以及应用内存对应的堆栈哈希表,实现了在终端存储器中对应用内存数据进行存储操作,并可通过终端存储器将上述应用内存数据上报至后台服务器,以便进行内存错误检测;解决了现有的应用内存错误检测方法、检测装置及存储介质的苹果手机应用的测试流程较为复杂,且不能对应用测试结果进行自动上报的技术问题。
附图说明
图1为本发明的应用内存错误检测方法的第一优选实施例的流程图;
图2为本发明的应用内存错误检测方法的第二优选实施例的流程图;
图3为本发明的应用内存错误检测方法的第二优选实施例中的内存释放数据的处理流程图;
图4为本发明的应用内存错误检测装置的第一优选实施例的结构示意图;
图5为本发明的应用内存错误检测装置的第二优选实施例的结构示意图;
图6为本发明的应用内存错误检测装置的第二优选实施例的拷贝模块的结构示意图;
图7为本发明的应用内存错误检测装置的第二优选实施例的拷贝模块的拷贝单元的结构示意图;
图8为本发明的应用内存错误检测装置的第二优选实施例的上报检测模块的结构示意图;
图9为本发明的应用内存错误检测方法及应用内存错误检测装置的具体实施例中对应的移动终端的内部功能模块图;
图10为本发明的应用内存错误检测方法及应用内存错误检测装置的具体实施例的应用内存错误检测流程图
图11为本发明的应用内存错误检测装置所在的电子设备的工作环境结构示意图。
具体实施方式
请参照图式,其中相同的组件符号代表相同的组件,本发明的原理是以实施在一适当的运算环境中来举例说明。以下的说明是基于所例示的本发明具体实施例,其不应被视为限制本发明未在此详述的其它具体实施例。
在以下的说明中,本发明的具体实施例将参考由一部或多部计算机所执行之作业的步骤及符号来说明,除非另有述明。因此,其将可了解到这些步骤及操作,其中有数次提到为由计算机执行,包括了由代表了以一结构化型式中的数据之电子信号的计算机处理单元所操纵。此操纵转换该数据或将其维持在该计算机之内存系统中的位置处,其可重新配置或另外以本领域技术人员所熟知的方式来改变该计算机之运作。该数据所维持的数据结构为该内存之实体位置,其具有由该数据格式所定义的特定特性。但是,本发明原理以上述文字来说明,其并不代表为一种限制,本领域技术人员将可了解到以下所述的多种步骤及操作亦可实施在硬件当中。
本发明的应用内存错误检测方法及检测装置可设置在各种使用苹果系统的电子设备中,用于对苹果系统的应用进行应用内存错误检测。该电子设备包括但不限于可穿戴设备、头戴设备、医疗健康平台、个人计算机、服务器计算机、手持式或膝上型设备、移动设备(比如移动电话、个人数字助理(PDA)、媒体播放器等等)、多处理器系统、消费型电子设备、小型计算机、大型计算机、包括上述任意系统或设备的分布式计算环境,等等。该电子设备优选为安装有苹果系统的苹果手机,苹果台式机或苹果平板电脑等。本发明的应用内存错误检测装置通过地址哈希表以及堆栈哈希表,实现了在电子设备的存储器中对应用内存数据进行存储操作,并可通过终端存储器将上述应用内存数据上报至后台服务器,以便进行内存错误检测。
请参照图1,图1为本发明的应用内存错误检测方法的第一优选实施例的流程图,本优选实施例的应用内存错误检测方法可使用上述的电子设备进行实施,本优选实施例的应用内存检测方法包括:
步骤S101,通过钩子接口,获取至少一内存分配数据;
步骤S102,根据内存分配数据,获取内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;
步骤S103,以分配内存地址为键值,以分配内存地址对应的内存块大小以及分配内存堆栈为值,创建内存分配数据对应的地址哈希表;
步骤S104,以地址哈希表中的分配内存堆栈为键值,以分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;
步骤S105,根据内存设定条件,将堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;
步骤S106,当检测到应用内存错误发生时,将存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
下面详细说明本优选实施例的应用内存错误检测方法的各步骤的具体流程。
在步骤S101中,应用内存错误检测装置通过钩子接口,获取至少一内存分配数据。由于苹果系统无法直接获取到应用内存的内存分配数据,因此这里应用内存错误检测装置需要在对应的电子设备中设置钩子接口,该钩子接口可将苹果系统底层的与内存数据相关的接口替换为自定义接口,从而可通过该自定义接口获取相应的内存分配数据。
这里的内存分配数据包括堆内存分配数据以及虚拟内存分配数据,具体的
堆内存分配数据可包括malloc_zone_malloc、malloc_zone_calloc、malloc_zone_valloc以及malloc_zone_realloc等堆内存分配数据。其中malloc_zone_malloc用于分配参数为字节数的指定字节堆内存,malloc_zone_calloc用于分配参数为对象尺寸(size)以及个数的指定字节堆内存,malloc_zone_valloc用于分配按页对齐的堆内存,malloc_zone_realloc用于重新分配给定的堆内存。
虚拟内存分配数据可包括vm_allocate、vm_map以及vm_remap。其中vm_allocate用于分配虚拟内存,vm_map用于将一个对象通过内存映射方法映射到进程的虚拟内存空间,vm_remap用于映射其他进程的内存到本进程的虚拟内存空间。随后转到步骤S102。
在步骤S102中,应用内存错误检测装置根据步骤S101获取的内存分配数据,确定该内存分配数据在内存对应的分配内存地址、该内存分配数据在内存中的分配内存块大小、以及通过线程堆栈回溯方式获取的该内存分配数据对应的分配内存堆栈,即该内存分配数据的形成过程。随后转到步骤S103。
在步骤S103中,应用内存错误检测装置以步骤S102获取的分配内存地址为键值(key),以步骤S102获取的内存分配数据对应分配内存块大小以及分配内存堆栈为值(value),创建内存分配数据对应的地址哈希表。即使用地址哈希表对内存分配数据进行表示,这里地址哈希表与内存分配数据一一对应。随后转到步骤S104。
在步骤S104中,应用内存错误检测装置以步骤S103获取的地址哈希表中的分配内存堆栈为键值(key),以步骤S103获取的分配内存堆栈对应的堆栈信息以及分配内存堆栈对应的堆栈累计内存为值(value),创建应用内存对应的堆栈哈希表。
由于在同一时间,不同存储位置的应用内存可能会具有相同的分配内存堆栈,因此在本步骤中,根据分配内存堆栈的类型对步骤S103获取的分配内存堆栈的内存信息进行聚类处理。这里每一类的分配内存堆栈对应堆栈哈希表的一个键值,即堆栈哈希表中某类分配内存堆栈对应的堆栈累计内存,为某类分配内存堆栈对应的所有内存分配数据的分配内存块的内存占用量之和。随后转到步骤S105。
在步骤S105中,为了便于将应用内存信息导出至后台服务器。应用内存错误检测装置会根据内存设定条件,将步骤S104中获取的堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至对应的电子设备的存储器中。
这里的内存设定条件为将堆栈哈希表对应的内存信息进行导出操作的条件,如以设定时间间隔,将堆栈哈希表对应的内存信息在相应的存储器中进行备份;或应用的内存使用量大于某个阈值时,将堆栈哈希表对应的内存信息在相应的存储器中进行备份等。该存储器应为断电后信息不丢失的存储器。随后转到步骤S106。
在步骤S106,当应用内存错误检测装置检测到对应的电子设备发生了应用内存错误时,如应用内存错误检测装置检测到电子设备由于内存耗尽重启等,应用内存错误检测装置会将对应存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,这样后台服务器可以通过堆栈信息还原出对应的代码信息,从而获取各个分配内存堆栈对应的功能模块的内存使用情况,进而找到该苹果系统的内存耗尽原因。
这样即完成了本优选实施例的应用内存错误检测方法的应用内存错误检测过程,尤其是应用内存错误导致的系统内存耗尽的问题的检测过程。
本优选实施例的应用内存错误检测方法通过钩子接口创建内存分配数据的地址哈希表以及应用内存对应的堆栈哈希表,实现了在终端存储器中对应用内存数据进行存储操作,并可通过终端存储器将上述应用内存数据上报至后台服务器,以便进行内存错误检测。
请参照图2,图2为本发明的应用内存错误检测方法的第二优选实施例的流程图。本优选实施例的应用内存错误检测方法可使用上述的电子设备进行实施,本优选实施例的应用内存检测方法包括:
步骤S201,在系统内存底层接口设置用于获取应用内存数据的钩子接口;
步骤S202,通过钩子接口,获取至少一内存分配数据;
步骤S203,根据内存分配数据,获取内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;
步骤S204,对分配内存堆栈进行编码操作,以获取分配内存堆栈编码;
步骤S205,以分配内存地址为键值,以分配内存地址对应的内存块大小以及分配内存堆栈编码为值,创建内存分配数据对应的地址哈希表;
步骤S206,以地址哈希表中的分配内存堆栈编码为键值,以分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;
步骤S207,以设定时间间隔获取所应用的内存使用量;
步骤S208,当应用的内存使用量大于设定值时,将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;
步骤S209,检测到系统重启操作时,判断系统重启前是否发生非捕获错误;如发生非捕获错误,则转到步骤S210;如未发生非捕获错误,则转到步骤S207。
步骤S210,将存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器。
下面详细说明本优选实施例的应用内存错误检测方法的各步骤的具体流程。
在步骤S201中,应用内存错误检测装置在苹果系统的系统内存底层接口设置钩子接口,该钩子接口可将苹果系统的系统内存接口替换为自定义接口,从而可通过自定义接口获取相应的内存分配数据。随后转到步骤S202。
在步骤S202中,应用内存错误检测装置通过步骤S201设置的钩子接口,获取至少一内存分配数据。
这里的内存分配数据包括堆内存分配数据以及虚拟内存分配数据,随后转到步骤S203。
在步骤S203中,应用内存错误检测装置根据步骤S202获取的内存分配数据,确定该内存分配数据在内存对应的分配内存地址、该内存分配数据在内存中的分配内存块大小、以及通过线程堆栈回溯方式获取的该内存分配数据对应的分配内存堆栈,即该内存分配数据的形成过程。随后转到步骤S204。
在步骤S204中,由于分配内存堆栈对应的堆栈信息的占用空间较大,如以分配内存堆栈作为堆栈哈希表的键值,会导致堆栈哈希表的查表操作难度增大,因此这里应用内存错误检测装置对步骤S203获取的分配内存堆栈进行编码操作,以获取分配内存堆栈编码;如对分配内存堆栈进行md5(Message-Digest Algorithm 5,信息-摘要算法5)编码,并将该分配内存堆栈的唯一md5编码作为分配内存堆栈对应的分配内存堆栈编码。
本优选实施例中使用分配内存堆栈编码作为堆栈哈希表的键值,可有效的降低堆栈哈希表的查表操作难度。随后转到步骤S205。
在步骤S205中,应用内存错误检测装置以步骤S203获取的分配内存地址为键值(key),以步骤S203获取的内存分配数据对应分配内存块大小以及步骤S204获取的分配内存堆栈编码为值(value),创建步骤S202中获取的内存分配数据对应的地址哈希表。即使用地址哈希表对内存分配数据进行表示,这里地址哈希表与内存分配数据一一对应。随后转到步骤S206。
在步骤S206中,应用内存错误检测装置以步骤S205获取的地址哈希表中的分配内存堆栈编码为键值(key),以步骤S204获取的分配内存堆栈编码对应的堆栈信息以及分配内存堆栈编码对应的堆栈累计内存为值(value),创建应用内存对应的堆栈哈希表。
由于在同一时间,不同存储位置的应用内存可能会具有相同的分配内存堆栈编码,因此在本步骤中,根据分配内存堆栈编码的类型对步骤S205获取的分配内存堆栈编码对应的内存信息进行聚类处理。这里每一类的分配内存堆栈编码对应堆栈哈希表的一个键值,即堆栈哈希表中某类分配内存堆栈编码对应的堆栈累计内存,为某类分配内存堆栈编码对应的所有内存分配数据的分配内存块的内存占用量之和。随后转到步骤S207。
在步骤S207中,在设定好地址哈希表以及堆栈哈希表之后,应用内存错误检测装置会根据内存设定条件,确定将步骤S206中获取的堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至对应的电子设备的存储器中。该存储器应为断电后信息不丢失的存储器。
这里首先应用内存错误检测装置会以设定时间间隔,如100ms获取应用在苹果系统中的内存使用量,以判断苹果系统是否可能发生内存耗尽崩溃错误。随后转到步骤S208。
在步骤S208中,应用的内存使用量大于设定值(如苹果系统的内存总量的80%等)时,则应用内存错误检测装置使用内存映射技术将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中,以便后台服务器对可能的内存耗尽崩溃错误进行应用内存错误检测。
如应用的内存使用量小于等于设定值,这时的苹果系统不可能发生内存耗尽崩溃错误,因此应用内存错误检测装置不对当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存做任何操作。
具体的,当应用内存错误检测装置使用内存映射技术将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中时,应用内存错误检测装置会判断存储器中是否已经存在堆栈信息以及对应的堆栈累计内存。
当存储器中存在堆栈信息以及对应的堆栈累计内存时,则应用内存错误检测装置使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存,覆盖存储器中的堆栈信息以及对应的堆栈累计内存;当存储器中不存在堆栈信息以及对应的堆栈累计内存时,则应用内存错误检测装置使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存,创建存储器中的堆栈信息以及对应的堆栈累计内存。这样存储器中可以一直保留最近的堆栈哈希表中的堆栈信息以及对应的堆栈累计内存,以提高后台服务器对可能的内存耗尽崩溃错误进行应用内存错误检测的准确性。随后转到步骤S209。
在步骤S209中,当检测到苹果系统进行重启操作时,应用内存错误检测装置会判断苹果系统重启前是否具有非捕获错误。由于苹果系统的其他非内存错误均有对应的捕获错误信息;如进程执行一个无效的内存引用,苹果系统会发出SIGSEGV的捕获错误信息;如中止一个程序,苹果系统会发出SIGABRT的捕获错误信息等。
因此应用内存错误检测装置确定苹果系统重启前发生了非捕获错误,则判断该苹果系统可能发生了应用内存错误,如内存崩溃错误等,因此转到步骤S210,对该应用内存错误进行错误分析。
如确定苹果系统重启前未发生了非捕获错误或仅发生了捕获错误,则判断苹果系统未发生应用内存错误,该苹果系统只是进行了正常的重启操作(如由于系统更新导致的重启操作等)。因此转到步骤S207,继续对应用在苹果系统中的内存使用量进行监控。
在步骤S210中,应用内存错误检测装置会将对应存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,这样后台服务器可以通过堆栈信息还原出对应的代码信息,从而获取各个分配内存堆栈对应的功能模块的内存使用情况,进而找到该苹果系统的内存耗尽原因。
此外,在步骤S202至步骤S206中根据内存分配数据生成地址哈希表以及堆栈哈希表的同时,本优选实施例的应用内存错误检测方法还根据内存释放数据对地址哈希表进行删除操作,以及对堆栈哈希表进行更新操作。具体的请参照图3,图3为本发明的应用内存错误检测方法的第二优选实施例中的内存释放数据的处理流程图。该内存释放数据的处理流程包括:
步骤S301,应用内存错误检测装置通过步骤S201设置的钩子接口,获取至少一内存释放数据。
这里的内存释放数据包括malloc_zone_free等堆内存释放数据,以及vm_deallocate等虚拟内存释放数据。
步骤S302,应用内存错误检测装置根据步骤S301获取的内存释放数据,确定该内存释放数据在内存对应的释放内存地址以及该内存释放数据在内存中的释放内存块大小。
步骤S303,应用内存错误检测装置根据步骤S302获取的内存释放数据的释放内存地址,确定对应的地址哈希表;由于该释放内存地址对应的内存释放数据已经进行了内存释放操作,因此这里将释放内存数据对应的地址哈希表进行删除操作。
步骤S304,应用内存错误检测装置随后根据步骤S302获取的内存释放数据的释放内存堆栈,查找对应的堆栈哈希表。随后转到步骤S305。
步骤S305,应用内存错误检测装置根据步骤S302获取的内存释放数据的释放内存块大小,对步骤S304中查找到的堆栈哈希表的堆栈累计内存进行变更操作,即将堆栈累计内存减去内存释放数据对应的释放内存块的数据量。
如堆栈累计内存减去内存释放数据对应的释放内存块的数据量之后,堆栈哈希表的对应的堆栈累计内存为零,则删除该堆栈累计内存对应的堆栈哈希表数据,即删除该堆栈累计内存对应的堆栈信息(堆栈哈希表的值)以及对应的分配内存堆栈(堆栈哈希表的键值)。
当然这里为了降低堆栈哈希表的查表难度,同样可以对释放内存堆栈进行编码操作,生成对应的释放内存堆栈编码;从而使用释放内存堆栈编码对地址哈希表进行删除操作,以及对堆栈哈希表进行更新操作。
这样即完成了本优选实施例的应用内存错误检测方法的应用内存错误检测过程,尤其是应用内存错误导致的系统内存耗尽的问题的检测过程。
在第一优选实施例的基础上,本优选实施例的应用内存错误检测方法通过内存分配数据以及内存释放数据,对地址哈希表以及堆栈哈希表进行更新操作,进一步提高了存储器中的应用内存数据的准确性;同时对存储器中的应用内存数据的创建操作以及覆盖操作,可以在不影响错误检测结果的基础上,减少应用内存数据的存储空间。
本发明还提供一种应用内存错误检测装置,请参照图4,图4为本发明的应用内存错误检测装置的第一优选实施例的结构示意图。本优选实施例的应用内存错误检测装置可使用上述的应用内存错误检测方法的第一优选实施例进行实施,本优选实施例的应用内存错误检测装置40包括内存分配数据获取模块41、内存分配数据参数获取模块42、地址哈希表创建模块43、堆栈哈希表创建模块44、拷贝模块45以及上报检测模块46。
内存分配数据获取模块41用于通过钩子接口,获取至少一内存分配数据;内存分配数据参数获取模块42用于根据内存分配数据,获取内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;地址哈希表创建模块43用于以分配内存地址为键值,以分配内存地址对应的分配内存块大小以及分配内存堆栈为值,创建内存分配数据对应的地址哈希表;堆栈哈希表创建模块44用于以地址哈希表中的分配内存堆栈为键值,以分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;拷贝模块45用于根据内存设定条件,将堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;上报检测模块46用于当检测到应用内存错误发生时,将存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
本优选实施例的应用内存错误检测装置40使用时,首先内存分配数据获取模块41通过钩子接口,获取至少一内存分配数据。由于苹果系统无法直接获取到应用内存的内存分配数据,因此这里应用内存错误检测装置需要在对应的电子设备中设置钩子接口,该钩子接口可将苹果系统底层的与内存数据相关的接口替换为自定义接口,从而可通过该自定义接口获取相应的内存分配数据。
随后内存分配数据参数获取模块42根据内存分配数据获取模块41获取的内存分配数据,确定该内存分配数据在内存对应的分配内存地址、该内存分配数据在内存中的分配内存块大小、以及通过线程堆栈回溯方式获取的该内存分配数据对应的分配内存堆栈,即该内存分配数据的形成过程。
然后地址哈希表创建模块43以内存分配数据参数获取模块42获取的分配内存地址为键值(key),以内存分配数据参数获取模块42获取的内存分配数据对应分配内存块大小以及分配内存堆栈为值(value),创建内存分配数据对应的地址哈希表。即使用地址哈希表对内存分配数据进行表示,这里地址哈希表与内存分配数据一一对应。
随后堆栈哈希表创建模块44以地址哈希表创建模块43获取的地址哈希表中的分配内存堆栈为键值(key),以地址哈希表创建模块43获取的分配内存堆栈对应的堆栈信息以及分配内存堆栈对应的堆栈累计内存为值(value),创建应用内存对应的堆栈哈希表。
由于在同一时间,不同存储位置的应用内存可能会具有相同的分配内存堆栈,因此在本步骤中,根据分配内存堆栈的类型对地址哈希表创建模块43获取的分配内存堆栈的内存信息进行聚类处理。这里每一类的分配内存堆栈对应堆栈哈希表的一个键值,即堆栈哈希表中某类分配内存堆栈对应的堆栈累计内存,为某类分配内存堆栈对应的所有内存分配数据的分配内存块的内存占用量之和。
然后为了便于将应用内存信息导出至后台服务器。拷贝模块45会根据内存设定条件,将堆栈哈希表创建模块43获取的堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至对应的电子设备的存储器中。
这里的内存设定条件为将堆栈哈希表对应的内存信息进行导出操作的条件,如以设定时间间隔,将堆栈哈希表对应的内存信息在相应的存储器中进行备份;或应用的内存使用量大于某个阈值时,将堆栈哈希表对应的内存信息在相应的存储器中进行备份等。
最后当应用内存错误检测装置40检测到对应的电子设备发生了应用内存错误时,如应用内存错误检测装置40检测到电子设备由于内存耗尽重启等,上报检测模块46会将对应存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,这样后台服务器可以通过堆栈信息还原出对应的代码信息,从而获取各个分配内存堆栈对应的功能模块的内存使用情况,进而找到该苹果系统的内存耗尽原因。
这样即完成了本优选实施例的应用内存错误检测装置40的应用内存错误检测过程,尤其是应用内存错误导致的系统内存耗尽的问题的检测过程。
本优选实施例的应用内存错误检测装置通过钩子接口创建内存分配数据的地址哈希表以及应用内存对应的堆栈哈希表,实现了在终端存储器中对应用内存数据进行存储操作,并可通过终端存储器将上述应用内存数据上报至后台服务器,以便进行内存错误检测。
请参照图5,图5为本发明的应用内存错误检测装置的第二优选实施例的结构示意图。本优选实施例的应用内存错误检测装置可使用上述的应用内存错误检测方法的第二优选实施例进行实施,本优选实施例的应用内存错误检测装置50包括接口插件设置模块51、内存分配数据获取模块52、内存分配数据参数获取模块53、堆栈编码模块54、地址哈希表创建模块55、堆栈哈希表创建模块56、拷贝模块57以及上报检测模块58。
接口插件设置模块51用于在系统内存底层接口设置用于获取应用内存数据的钩子接口;内存分配数据获取模块52用于通过钩子接口,获取至少一内存分配数据;内存分配数据参数获取模块53用于根据内存分配数据,获取内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;堆栈编码模块54用于对分配内存堆栈进行编码操作,获取分配内存堆栈编码;地址哈希表创建模块55以分配内存地址为键值,以分配内存地址对应的分配内存块大小以及分配内存堆栈编码为值,创建内存分配数据对应的地址哈希表;堆栈哈希表创建模块56用于以地址哈希表中的分配内存堆栈编码为键值,以分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;拷贝模块57用于根据内存设定条件,将堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;上报检测模块58用于当检测到应用内存错误发生时,将存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
请参照图6,图6为本发明的应用内存错误检测装置的第二优选实施例的拷贝模块的结构示意图。该拷贝模块57包括内存使用量获取单元61以及拷贝单元62。
内存使用量获取单元61用于以设定时间间隔获取所述应用的内存使用量;拷贝单元62用于当应用的内存使用量大于设定值时,将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中。
请参照图7,图7为本发明的应用内存错误检测装置的第二优选实施例的拷贝模块的拷贝单元的结构示意图。该拷贝单元62包括覆盖子单元71以及创建子单元72。
覆盖子单元71用于当存储器中存在堆栈信息以及对应的堆栈累计内存时,则使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存覆盖存储器中的堆栈信息以及对应的堆栈累计内存;创建子单元72用于当存储器中不存在堆栈信息以及对应的堆栈累计内存时,则使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存创建存储器中的堆栈信息以及对应的堆栈累计内存。
请参照图8,图8为本发明的应用内存错误检测装置的第二优选实施例的上报检测模块的结构示意图。该上报检测模块58包括错误判断单元81以及上报检测单元82。
错误判断单元81用于检测到系统重启操作时,判断系统重启前是否发生非捕获错误;上报检测单元82用于如发生非捕获错误,则将存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器。
本优选实施例的应用内存错误检测装置50使用时,首先接口插件设置模块51在苹果系统的系统内存底层接口设置钩子接口,该钩子接口可将苹果系统的系统内存接口替换为自定义接口,从而可通过自定义接口获取相应的内存分配数据。
随后内存分配数据获取模块52通过接口插件设置模块51设置的钩子接口,获取至少一内存分配数据。这里的内存分配数据包括堆内存分配数据以及虚拟内存分配数据。
然后内存分配数据参数获取模块53根据内存分配数据获取模块52获取的内存分配数据,确定该内存分配数据在内存对应的分配内存地址、该内存分配数据在内存中的分配内存块大小、以及通过线程堆栈回溯方式获取的该内存分配数据对应的分配内存堆栈,即该内存分配数据的形成过程。
随后由于分配内存堆栈对应的堆栈信息的占用空间较大,如以分配内存堆栈作为堆栈哈希表的键值,会导致堆栈哈希表的查表操作难度增大,因此这里堆栈编码模块54对内存分配数据参数获取模块53获取的分配内存堆栈进行编码操作,以获取分配内存堆栈编码;如对分配内存堆栈进行md5(Message-DigestAlgorithm 5,信息-摘要算法5)编码,并将该分配内存堆栈的唯一md5编码作为分配内存堆栈对应的分配内存堆栈编码。
本优选实施例中使用分配内存堆栈编码作为堆栈哈希表的键值,可有效的降低堆栈哈希表的查表操作难度。
然后地址哈希表创建模块55以内存分配数据参数获取模块53获取的分配内存地址为键值(key),以内存分配数据参数获取模块53获取的内存分配数据对应分配内存块大小以及堆栈编码模块获取的分配内存堆栈编码为值(value),创建内存分配数据获取模块52获取的内存分配数据对应的地址哈希表。即使用地址哈希表对内存分配数据进行表示,这里地址哈希表与内存分配数据一一对应。
随后堆栈哈希表创建模块56以地址哈希表创建模块55获取的地址哈希表中的分配内存堆栈编码为键值(key),以堆栈编码模块54获取的分配内存堆栈编码对应的堆栈信息以及分配内存堆栈编码对应的堆栈累计内存为值(value),创建应用内存对应的堆栈哈希表。
由于在同一时间,不同存储位置的应用内存可能会具有相同的分配内存堆栈编码,因此堆栈哈希表创建模块56根据分配内存堆栈编码的类型对地址哈希表创建模块55获取的分配内存堆栈编码对应的内存信息进行聚类处理。这里每一类的分配内存堆栈编码对应堆栈哈希表的一个键值,即堆栈哈希表中某类分配内存堆栈编码对应的堆栈累计内存,为某类分配内存堆栈编码对应的所有内存分配数据的分配内存块的内存占用量之和。
在设定好地址哈希表以及堆栈哈希表之后,拷贝模块57会根据内存设定条件,确定将堆栈哈希表创建模块获取的堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至对应的电子设备的存储器中。
这里拷贝模块57的内存使用量获取单元61会以设定时间间隔,如100ms获取应用在苹果系统中的内存使用量,以判断苹果系统是否可能发生内存耗尽崩溃错误。当应用的内存使用量大于设定值(如苹果系统的内存总量的80%等)时,则拷贝模块57的拷贝单元62使用内存映射技术将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中,以便后台服务器对可能的内存耗尽崩溃错误进行应用内存错误检测。
如应用的内存使用量小于等于设定值,这时的苹果系统不可能发生内存耗尽崩溃错误,因此拷贝单元62不对当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存做任何操作。
具体的,当拷贝单元62使用内存映射技术将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中时,拷贝单元62会判断存储器中是否已经存在堆栈信息以及对应的堆栈累计内存。
当存储器中存在堆栈信息以及对应的堆栈累计内存时,则拷贝单元62的覆盖子单元71使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存,覆盖存储器中的堆栈信息以及对应的堆栈累计内存;当存储器中不存在堆栈信息以及对应的堆栈累计内存时,则拷贝单元62的创建子单元72使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存,创建存储器中的堆栈信息以及对应的堆栈累计内存。这样存储器中可以一直保留最近的堆栈哈希表中的堆栈信息以及对应的堆栈累计内存,以提高后台服务器对可能的内存耗尽崩溃错误进行应用内存错误检测的准确性。
然后当检测到苹果系统进行重启操作时,上报检测模块58的错误判断单元81会判断苹果系统重启前是否具有非捕获错误。由于苹果系统的其他非内存错误均有对应的捕获错误信息;如进程执行一个无效的内存引用,苹果系统会发出SIGSEGV的捕获错误信息;如中止一个程序,苹果系统会发出SIGABRT的捕获错误信息等。
因此错误判断单元81确定苹果系统重启前发生了非捕获错误,则判断该苹果系统可能发生了应用内存错误,如内存崩溃错误等;上报检测模块58的上报检测单元82会将对应存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,这样后台服务器可以通过堆栈信息还原出对应的代码信息,从而获取各个分配内存堆栈对应的功能模块的内存使用情况,进而找到该苹果系统的内存耗尽原因。
如错误判断单元81确定苹果系统重启前未发生了非捕获错误或仅发生了捕获错误,则判断苹果系统未发生应用内存错误,该苹果系统只是进行了正常的重启操作(如由于系统更新导致的重启操作等)。拷贝模块57继续对应用在苹果系统中的内存使用量进行监控。
此外本优选实施例的应用内存错误检测装置还包括内存释放数据获取模块59、内存释放数据参数获取模块5A、地址哈希表删除模块5B、堆栈哈希表查找模块5C以及堆栈哈希表变更模块5D。
内存释放数据获取模块59用于通过钩子接口,获取至少一内存释放数据;内存释放数据参数获取模块5A用于根据内存释放数据,获取内存释放数据对应的释放内存地址、释放内存块大小以及释放内存堆栈;地址哈希表删除模块5B用于根据内存释放数据的释放内存地址,删除释放内存数据对应的地址哈希表;堆栈哈希表查找模块5C用于根据内存释放数据的释放内存堆栈,查找对应的堆栈哈希表;堆栈哈希表变更模块5D用于根据内存释放数据的释放内存块大小,对堆栈哈希表的堆栈累计内存进行变更操作。
当本优选实施例的应用内存错误检测装置50根据内存分配数据生成地址哈希表以及堆栈哈希表的同时,本优选实施例的应用内存错误检测装置50还根据内存释放数据对地址哈希表进行删除操作,以及对堆栈哈希表进行更新操作。具体的内存释放数据的处理流程包括:
内存释放数据获取模块59通过接口插件设置模块51设置的钩子接口,获取至少一内存释放数据。这里的内存释放数据包括malloc_zone_free等堆内存释放数据,以及vm_deallocate等虚拟内存释放数据。
内存释放数据参数获取模块5A根据内存释放数据获取模块59获取的内存释放数据,确定该内存释放数据在内存对应的释放内存地址以及该内存释放数据在内存中的释放内存块大小。
地址哈希表删除模块5B根据内存释放数据参数获取模块5A获取的内存释放数据的释放内存地址,确定对应的地址哈希表;由于该释放内存地址对应的内存释放数据已经进行了内存释放操作,因此这里将释放内存数据对应的地址哈希表进行删除操作。
堆栈哈希表查找模块5C随后根据内存释放数据参数获取模块5A获取的内存释放数据的释放内存堆栈,查找对应的堆栈哈希表。
最后堆栈哈希表变更模块5D根据内存释放数据参数获取模块5A获取的内存释放数据的释放内存块大小,对堆栈哈希表查找模块5C中查找到的堆栈哈希表的堆栈累计内存进行变更操作,即将堆栈累计内存减去内存释放数据对应的释放内存块的数据量。
如堆栈累计内存减去内存释放数据对应的释放内存块的数据量之后,堆栈哈希表的对应的堆栈累计内存为零,则堆栈哈希表变更模块5D删除该堆栈累计内存对应的堆栈哈希表数据,即删除该堆栈累计内存对应的堆栈信息(堆栈哈希表的值)以及对应的分配内存堆栈(堆栈哈希表的键值)。
当然这里为了降低堆栈哈希表的查表难度,堆栈编码模块54同样可以对释放内存堆栈进行编码操作,生成对应的释放内存堆栈编码;从而使用释放内存堆栈编码对地址哈希表进行删除操作,以及对堆栈哈希表进行更新操作。
这样即完成了本优选实施例的应用内存错误检测装置50的应用内存错误检测过程,尤其是应用内存错误导致的系统内存耗尽的问题的检测过程。
在第一优选实施例的基础上,本优选实施例的应用内存错误检测装置通过内存分配数据以及内存释放数据,对地址哈希表以及堆栈哈希表进行更新操作,进一步提高了存储器中的应用内存数据的准确性;同时对存储器中的应用内存数据的创建操作以及覆盖操作,可以在不影响错误检测结果的基础上,减少应用内存数据的存储空间。
下面通过一具体实施例说明本发明的应用内存错误检测方法及应用内存错误检测装置的具体工作原理。本具体实施例的应用内存错误检测方法及应用内存错误检测装置可设置在苹果系统的移动终端中,用于对苹果系统的移动终端的应用内存错误进行内存错误检测。请参照图9和图10,图9为本发明的应用内存错误检测方法及应用内存错误检测装置的具体实施例中对应的移动终端的内部功能模块图;图10为本发明的应用内存错误检测方法及应用内存错误检测装置的具体实施例的应用内存错误检测流程图。该应用内存错误检测流程包括:
步骤S1001,创建在苹果系统的系统内存底层接口设置钩子接口901。
步骤S1002,通过钩子接口901获取应用内存的内存分配数据902以及内存释放数据903。
步骤S1003,根据内存分配数据902,获取内存分配数据对应分配内存地址、分配内存块大小以及分配内存堆栈编码;根据内存释放数据903,获取内存释放数据对应的释放内存地址、释放内存块大小以及释放内存堆栈编码。
步骤S1004,以分配内存地址为键值,以分配内存地址对应的内存块大小以及分配内存堆栈编码为值,创建内存分配数据对应的地址哈希表904;并以地址哈希表中的分配内存堆栈编码为键值,以分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表905。
如内存分配数据a对应的地址哈希表a1为Key:00001(分配内存地址),value1:abcde(分配内存堆栈编码),value2:1024(内存块大小);
内存分配数据b对应的地址哈希表b1为Key:01025(分配内存地址),value1:bcdef(分配内存堆栈编码),value2:1024(内存块大小);
内存分配数据c对应的地址哈希表c1为Key:02049(分配内存地址),value1:abcde(分配内存堆栈编码),value2:1024(内存块大小)。
根据上述内存分配数据a、内存分配数据b以及内存分配数据c生成的堆栈哈希表A1为Key:abcde(分配内存堆栈编码),value1:ABCDE(abcde对应的堆栈信息),value2:2048(堆栈累计内存);以及
堆栈哈希表A2为Key:bcdef(分配内存堆栈编码),value1:BCDEF(bcdef对应的堆栈信息),value2:1024(堆栈累计内存)。
这样通过堆栈哈希表905对多个内存分配数据的地址哈希表904进行了聚类操作。
步骤S1005,根据内存释放数据的释放内存地址,对相应的内存释放数据对应的地址哈希表904进行删除操作,并将相应的堆栈哈希表905中与该已删除的地址哈希表904中的相关的数据进行删除操作。
如内存释放数据d对应的释放内存地址为01025,则将内存释放数据d对应的地址哈希表b1进行删除操作,同时将堆栈哈希表中的堆栈哈希表A2中的地址哈希表b1的相关数据进行删除,由于删除之后的堆栈哈希表A2中的堆栈累计内存已经为零,因此这里可将堆栈哈希表A2删除。
这样即完成了应用内存的地址哈希表904以及堆栈哈希表905的创建、删除以及变更操作。
步骤S1006,应用启动后,每隔100ms获取应用的内存使用量,如检测到应用的内存使用量大于设定值,则将当前堆栈哈希表中的对照信息以及对应的堆栈累计内存拷贝到存储器906中。
步骤S1007,当检测到系统重启操作时,判断系统是否发生了非捕获错误,如发生了非捕获错误,则将存储器906中的堆栈信息以及对应的堆栈累计内存上报至后台服务器907。这样后台服务器907可以通过堆栈信息还原出对应的代码信息,从而获取各个分配内存堆栈对应的功能模块的内存使用情况,进而找到该苹果系统的内存耗尽原因。
这样即完成了本具体实施例的应用内存错误检测方法及应用内存错误检测装置的应用内存错误检测过程。
本发明的应用内存错误检测方法及检测装置通过钩子接口创建内存分配数据的地址哈希表以及应用内存对应的堆栈哈希表,实现了在终端存储器中对应用内存数据进行存储操作,并可通过终端存储器将上述应用内存数据上报至后台服务器,以便进行内存错误检测;解决了现有的应用内存错误检测方法及检测装置的苹果手机应用的测试流程较为复杂,且不能对应用测试结果进行自动上报的技术问题。
如本申请所使用的术语“组件”、“模块”、“系统”、“接口”、“进程”等等一般地旨在指计算机相关实体:硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是但不限于是运行在处理器上的进程、处理器、对象、可执行应用、执行的线程、程序和/或计算机。通过图示,运行在控制器上的应用和该控制器二者都可以是组件。一个或多个组件可以有在于执行的进程和/或线程内,并且组件可以位于一个计算机上和/或分布在两个或更多计算机之间。
图11和随后的讨论提供了对实现本发明所述的应用内存错误检测装置所在的电子设备的工作环境的简短、概括的描述。图11的工作环境仅仅是适当的工作环境的一个实例并且不旨在建议关于工作环境的用途或功能的范围的任何限制。实例电子设备1112包括但不限于可穿戴设备、头戴设备、医疗健康平台、个人计算机、服务器计算机、手持式或膝上型设备、移动设备(比如移动电话、个人数字助理(PDA)、媒体播放器等等)、多处理器系统、消费型电子设备、小型计算机、大型计算机、包括上述任意系统或设备的分布式计算环境,等等。
尽管没有要求,但是在“计算机可读指令”被一个或多个电子设备执行的通用背景下描述实施例。计算机可读指令可以经由计算机可读介质来分布(下文讨论)。计算机可读指令可以实现为程序模块,比如执行特定任务或实现特定抽象数据类型的功能、对象、应用编程接口(API)、数据结构等等。典型地,该计算机可读指令的功能可以在各种环境中随意组合或分布。
图11图示了包括本发明的应用内存错误检测装置中的一个或多个实施例的电子设备1112的实例。在一种配置中,电子设备1112包括至少一个处理单元1116和存储器1118。根据电子设备的确切配置和类型,存储器1118可以是易失性的(比如RAM)、非易失性的(比如ROM、闪存等)或二者的某种组合。该配置在图11中由虚线1114图示。
在其他实施例中,电子设备1112可以包括附加特征和/或功能。例如,设备1112还可以包括附加的存储装置(例如可移除和/或不可移除的),其包括但不限于磁存储装置、光存储装置等等。这种附加存储装置在图11中由存储装置1120图示。在一个实施例中,用于实现本文所提供的一个或多个实施例的计算机可读指令可以在存储装置1120中。存储装置1120还可以存储用于实现操作系统、应用程序等的其他计算机可读指令。计算机可读指令可以载入存储器1118中由例如处理单元1116执行。
本文所使用的术语“计算机可读介质”包括计算机存储介质。计算机存储介质包括以用于存储诸如计算机可读指令或其他数据之类的信息的任何方法或技术实现的易失性和非易失性、可移除和不可移除介质。存储器1118和存储装置1120是计算机存储介质的实例。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字通用盘(DVD)或其他光存储装置、盒式磁带、磁带、磁盘存储装置或其他磁存储设备、或可以用于存储期望信息并可以被电子设备1112访问的任何其他介质。任意这样的计算机存储介质可以是电子设备1112的一部分。
电子设备1112还可以包括允许电子设备1112与其他设备通信的通信连接1126。通信连接1126可以包括但不限于调制解调器、网络接口卡(NIC)、集成网络接口、射频发射器/接收器、红外端口、USB连接或用于将电子设备1112连接到其他电子设备的其他接口。通信连接1126可以包括有线连接或无线连接。通信连接1126可以发射和/或接收通信媒体。
术语“计算机可读介质”可以包括通信介质。通信介质典型地包含计算机可读指令或诸如载波或其他传输机构之类的“己调制数据信号”中的其他数据,并且包括任何信息递送介质。术语“己调制数据信号”可以包括这样的信号:该信号特性中的一个或多个按照将信息编码到信号中的方式来设置或改变。
电子设备1112可以包括输入设备1124,比如键盘、鼠标、笔、语音输入设备、触摸输入设备、红外相机、视频输入设备和/或任何其他输入设备。设备1112中也可以包括输出设备1122,比如一个或多个显示器、扬声器、打印机和/或任意其他输出设备。输入设备1124和输出设备1122可以经由有线连接、无线连接或其任意组合连接到电子设备1112。在一个实施例中,来自另一个电子设备的输入设备或输出设备可以被用作电子设备1112的输入设备1124或输出设备1122。
电子设备1112的组件可以通过各种互连(比如总线)连接。这样的互连可以包括外围组件互连(PCI)(比如快速PCI)、通用串行总线(USB)、火线(IEEE 1394)、光学总线结构等等。在另一个实施例中,电子设备1112的组件可以通过网络互连。例如,存储器1118可以由位于不同物理位置中的、通过网络互连的多个物理存储器单元构成。
本领域技术人员将认识到,用于存储计算机可读指令的存储设备可以跨越网络分布。例如,可经由网络1128访问的电子设备1130可以存储用于实现本发明所提供的一个或多个实施例的计算机可读指令。电子设备1112可以访问电子设备1130并且下载计算机可读指令的一部分或所有以供执行。可替代地,电子设备1112可以按需要下载多条计算机可读指令,或者一些指令可以在电子设备1112处执行并且一些指令可以在电子设备1130处执行。
本文提供了实施例的各种操作。在一个实施例中,所述的一个或多个操作可以构成一个或多个计算机可读介质上存储的计算机可读指令,其在被电子设备执行时将使得计算设备执行所述操作。描述一些或所有操作的顺序不应当被解释为暗示这些操作必需是顺序相关的。本领域技术人员将理解具有本说明书的益处的可替代的排序。而且,应当理解,不是所有操作必需在本文所提供的每个实施例中存在。
而且,尽管已经相对于一个或多个实现方式示出并描述了本公开,但是本领域技术人员基于对本说明书和附图的阅读和理解将会想到等价变型和修改。本公开包括所有这样的修改和变型,并且仅由所附权利要求的范围限制。特别地关于由上述组件(例如元件、资源等)执行的各种功能,用于描述这样的组件的术语旨在对应于执行所述组件的指定功能(例如其在功能上是等价的)的任意组件(除非另外指示),即使在结构上与执行本文所示的本公开的示范性实现方式中的功能的公开结构不等同。此外,尽管本公开的特定特征已经相对于若干实现方式中的仅一个被公开,但是这种特征可以与如可以对给定或特定应用而言是期望和有利的其他实现方式的一个或多个其他特征组合。而且,就术语“包括”、“具有”、“含有”或其变形被用在具体实施方式或权利要求中而言,这样的术语旨在以与术语“包含”相似的方式包括。
本发明实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。上述提到的存储介质可以是只读存储器,磁盘或光盘等。上述的各装置或系统,可以执行相应方法实施例中的方法。
综上所述,虽然本发明已以实施例揭露如上,实施例前的序号仅为描述方便而使用,对本发明各实施例的顺序不造成限制。并且,上述实施例并非用以限制本发明,本领域的普通技术人员,在不脱离本发明的精神和范围内,均可作各种更动与润饰,因此本发明的保护范围以权利要求界定的范围为准。
Claims (15)
1.一种应用内存错误检测方法,其特征在于,包括:
通过钩子接口,获取至少一内存分配数据;
根据所述内存分配数据,获取所述内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;
以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈为值,创建所述内存分配数据对应的地址哈希表;
以所述地址哈希表中的所述分配内存堆栈为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;其中所述堆栈哈希表中某类分配内存堆栈对应的堆栈累计内存,为该类分配内存堆栈对应的所有内存分配数据的分配内存块的内存占用量之和;
根据内存设定条件,将所述堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;以及
当检测到应用内存错误发生时,将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
2.根据权利要求1所述的应用内存错误检测方法,其特征在于,所述应用内存错误检测方法还包括:
在系统内存底层接口设置用于获取应用内存数据的钩子接口。
3.根据权利要求1所述的应用内存错误检测方法,其特征在于,所述应用内存错误检测方法还包括:
通过所述钩子接口,获取至少一内存释放数据;
根据所述内存释放数据,获取所述内存释放数据对应的释放内存地址、释放内存块大小以及释放内存堆栈;
根据所述内存释放数据的释放内存地址,删除所述释放内存数据对应的地址哈希表;
根据所述内存释放数据的释放内存堆栈,查找对应的堆栈哈希表;以及
根据所述内存释放数据的释放内存块大小,对所述堆栈哈希表的堆栈累计内存进行变更操作。
4.根据权利要求3所述的应用内存错误检测方法,其特征在于,所述对所述堆栈哈希表的堆栈累计内存进行变更操作的步骤包括:
如所述堆栈哈希表的堆栈累计内存为零,则删除所述堆栈累计内存对应的堆栈哈希表数据。
5.根据权利要求1所述的应用内存错误检测方法,其特征在于,所述应用内存错误检测方法还包括步骤:
对所述分配内存堆栈进行编码操作,以获取分配内存堆栈编码;
所述以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈为值,创建所述内存分配数据对应的地址哈希表的步骤包括:
以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈编码为值,创建所述内存分配数据对应的地址哈希表;
所述以所述地址哈希表中的所述分配内存堆栈为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表的步骤包括:
以所述地址哈希表中的所述分配内存堆栈编码为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表。
6.根据权利要求1所述的应用内存错误检测方法,其特征在于,所述根据内存设定条件,将所述堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中的步骤包括:
以设定时间间隔获取所述应用的内存使用量;以及
当所述应用的内存使用量大于设定值时,将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中。
7.根据权利要求6所述的应用内存错误检测方法,其特征在于,所述将所述堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中的步骤包括:
当所述存储器中存在堆栈信息以及对应的堆栈累计内存时,则使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存覆盖所述存储器中的堆栈信息以及对应的堆栈累计内存;以及
当所述存储器中不存在堆栈信息以及对应的堆栈累计内存时,则使用当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存创建所述存储器中的堆栈信息以及对应的堆栈累计内存。
8.根据权利要求1所述的应用内存错误检测方法,其特征在于,所述当检测到应用内存错误发生时,将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器的步骤包括:
检测到系统重启操作时,判断系统重启前是否发生非捕获错误;以及
如发生非捕获错误,则将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器。
9.一种应用内存错误检测装置,其特征在于,包括:
内存分配数据获取模块,用于通过钩子接口,获取至少一内存分配数据;
内存分配数据参数获取模块,用于根据所述内存分配数据,获取所述内存分配数据对应的分配内存地址、分配内存块大小以及分配内存堆栈;
地址哈希表创建模块,用于以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈为值,创建所述内存分配数据对应的地址哈希表;
堆栈哈希表创建模块,用于以所述地址哈希表中的所述分配内存堆栈为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表;其中所述堆栈哈希表中某类分配内存堆栈对应的堆栈累计内存,为该类分配内存堆栈对应的所有内存分配数据的分配内存块的内存占用量之和;
拷贝模块,用于根据内存设定条件,将所述堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中;以及
上报检测模块,用于当检测到应用内存错误发生时,将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器,以便进行内存错误检测。
10.根据权利要求9所述的应用内存错误检测装置,其特征在于,所述应用内存错误检测装置还包括:
接口插件设置模块,用于在系统内存底层接口设置用于获取应用内存数据的钩子接口。
11.根据权利要求9所述的应用内存错误检测装置,其特征在于,所述应用内存错误检测装置还包括:
内存释放数据获取模块,用于通过所述钩子接口,获取至少一内存释放数据;
内存释放数据参数获取模块,用于根据所述内存释放数据,获取所述内存释放数据对应的释放内存地址、释放内存块大小以及释放内存堆栈;
地址哈希表删除模块,用于根据所述内存释放数据的释放内存地址,删除所述释放内存数据对应的地址哈希表;
堆栈哈希表查找模块,用于根据所述内存释放数据的释放内存堆栈,查找对应的堆栈哈希表;以及
堆栈哈希表变更模块,用于根据所述内存释放数据的释放内存块大小,对所述堆栈哈希表的堆栈累计内存进行变更操作。
12.根据权利要求9所述的应用内存错误检测装置,其特征在于,所述应用内存错误检测装置还包括:
堆栈编码模块,用于对所述分配内存堆栈进行编码操作,获取分配内存堆栈编码;
所述地址哈希表创建模块用于以所述分配内存地址为键值,以所述分配内存地址对应的分配内存块大小以及分配内存堆栈编码为值,创建所述内存分配数据对应的地址哈希表;
所述堆栈哈希表创建模块用于以所述地址哈希表中的所述分配内存堆栈编码为键值,以所述分配内存堆栈对应的堆栈信息以及堆栈累计内存为值,创建应用内存对应的堆栈哈希表。
13.根据权利要求9所述的应用内存错误检测装置,其特征在于,所述拷贝模块包括:
内存使用量获取单元,用于以设定时间间隔获取所述应用的内存使用量;以及
拷贝单元,用于当所述应用的内存使用量大于设定值时,将当前堆栈哈希表中的堆栈信息以及对应的堆栈累计内存拷贝至存储器中。
14.根据权利要求9所述的应用内存错误检测装置,其特征在于,所述上报检测模块包括:
错误判断单元,用于检测到系统重启操作时,判断系统重启前是否发生非捕获错误;以及
上报检测单元,用于如发生非捕获错误,则将所述存储器中的堆栈信息以及对应的堆栈累计内存上报至后台服务器。
15.一种存储介质,其内存储有处理器可执行指令,该处理器通过执行所述指令提供如权利要求1-9中任一的应用内存错误检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710455121.9A CN109150642B (zh) | 2017-06-16 | 2017-06-16 | 应用内存错误检测方法、检测装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710455121.9A CN109150642B (zh) | 2017-06-16 | 2017-06-16 | 应用内存错误检测方法、检测装置及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109150642A CN109150642A (zh) | 2019-01-04 |
CN109150642B true CN109150642B (zh) | 2021-01-08 |
Family
ID=64830488
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710455121.9A Active CN109150642B (zh) | 2017-06-16 | 2017-06-16 | 应用内存错误检测方法、检测装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109150642B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111858112B (zh) * | 2019-04-26 | 2023-04-25 | 腾讯科技(深圳)有限公司 | 一种检测内存泄露的方法、客户端及服务器 |
CN112100017B (zh) * | 2019-06-17 | 2023-07-21 | 腾讯科技(深圳)有限公司 | 一种内存资源监控方法及装置 |
CN110955549B (zh) * | 2019-11-08 | 2023-05-02 | 北京字节跳动网络技术有限公司 | 故障内存判定方法、装置及电子设备 |
CN112597536B (zh) * | 2020-12-23 | 2023-01-24 | 瀚高基础软件股份有限公司 | 数据库表文件被非法删除的实时检测方法及装备 |
CN112860444B (zh) * | 2021-04-26 | 2021-08-20 | 腾讯科技(深圳)有限公司 | 内存调用信息的确定方法和装置、存储介质及电子设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101587455A (zh) * | 2008-12-11 | 2009-11-25 | 南京南瑞继保电气有限公司 | 一种用于vxWorks操作系统检查内存泄漏的方法 |
CN103777930A (zh) * | 2012-10-19 | 2014-05-07 | 阿里巴巴集团控股有限公司 | 程序内部信息的输出方法、获取方法、监测方法及其装置 |
CN104516732A (zh) * | 2013-09-29 | 2015-04-15 | 北京新媒传信科技有限公司 | 一种应用程序崩溃报告方法和系统 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106560796A (zh) * | 2015-12-31 | 2017-04-12 | 哈尔滨安天科技股份有限公司 | 内网终端应用程序内存堆栈异常预警方法及系统 |
CN106708697A (zh) * | 2016-09-29 | 2017-05-24 | 腾讯科技(深圳)有限公司 | 检测用户使用应用程序的方法和装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7768522B2 (en) * | 2002-01-08 | 2010-08-03 | Apple Inc. | Virtualization of graphics resources and thread blocking |
KR20170060205A (ko) * | 2015-11-23 | 2017-06-01 | 에스케이하이닉스 주식회사 | 적층형 메모리 장치 및 이를 포함하는 반도체 메모리 시스템 |
-
2017
- 2017-06-16 CN CN201710455121.9A patent/CN109150642B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101587455A (zh) * | 2008-12-11 | 2009-11-25 | 南京南瑞继保电气有限公司 | 一种用于vxWorks操作系统检查内存泄漏的方法 |
CN103777930A (zh) * | 2012-10-19 | 2014-05-07 | 阿里巴巴集团控股有限公司 | 程序内部信息的输出方法、获取方法、监测方法及其装置 |
CN104516732A (zh) * | 2013-09-29 | 2015-04-15 | 北京新媒传信科技有限公司 | 一种应用程序崩溃报告方法和系统 |
CN106560796A (zh) * | 2015-12-31 | 2017-04-12 | 哈尔滨安天科技股份有限公司 | 内网终端应用程序内存堆栈异常预警方法及系统 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106708697A (zh) * | 2016-09-29 | 2017-05-24 | 腾讯科技(深圳)有限公司 | 检测用户使用应用程序的方法和装置 |
Non-Patent Citations (1)
Title |
---|
"基于C++的动态内存实时监测器";陈楠;《计算机系统应用》;20161231;第262-267页 * |
Also Published As
Publication number | Publication date |
---|---|
CN109150642A (zh) | 2019-01-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109150642B (zh) | 应用内存错误检测方法、检测装置及存储介质 | |
JP5425286B2 (ja) | データ処理システムのメモリ使用状況を追跡する方法 | |
CN104572489B (zh) | 磨损均衡方法及装置 | |
US9678797B2 (en) | Dynamic resource management for multi-process applications | |
US11080143B2 (en) | Systems and processes for data backup and recovery | |
US9558055B2 (en) | System level memory leak detection | |
CN110069219B (zh) | 一种数据存储方法、系统及电子设备和存储介质 | |
CN109521948B (zh) | 支持快照功能的键值存储设备及其操作方法 | |
CN111796856A (zh) | 差分升级方法及装置、存储介质、计算机设备 | |
CN115495025B (zh) | 一种管理异常存储块的方法和装置 | |
JP2017215966A (ja) | 記憶デバイスにおける性能変動を制限するための技術 | |
CN114996173A (zh) | 一种管理存储设备写操作的方法和装置 | |
CN107632786B (zh) | 一种数据重删的管理方法及装置 | |
CN107133169B (zh) | 应用测试包生成方法及生成装置 | |
CN108205559B (zh) | 一种数据管理方法及其设备 | |
CN111273862A (zh) | 数据存储方法及其装置、可读介质和系统 | |
CN115098297B (zh) | 一种云原生存储数据卷的一致性快照生成方法和系统 | |
CN110209351B (zh) | 分布式存储数据处理方法和装置 | |
CN111435323A (zh) | 信息的传输方法、装置、终端、服务器及存储介质 | |
CN115599605A (zh) | 一种边缘节点的数据备份方法、系统及相关组件 | |
CN111881065B (zh) | 数据重删操作的物理地址处理方法、装置、设备及介质 | |
CN108762985B (zh) | 数据恢复方法及相关产品 | |
EP2813947B1 (en) | Electronic device and method for mounting file system using virtual block device | |
CN114879916B (zh) | 一种管理存储单元的方法和装置 | |
US10698790B1 (en) | Proactive debugging |
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 |