CN109086205A - 基于内存池的内存错误调试方法和装置 - Google Patents
基于内存池的内存错误调试方法和装置 Download PDFInfo
- Publication number
- CN109086205A CN109086205A CN201810829432.1A CN201810829432A CN109086205A CN 109086205 A CN109086205 A CN 109086205A CN 201810829432 A CN201810829432 A CN 201810829432A CN 109086205 A CN109086205 A CN 109086205A
- Authority
- CN
- China
- Prior art keywords
- memory
- management information
- target
- ems
- error
- 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.)
- Pending
Links
Classifications
-
- 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/3604—Software analysis for verifying properties of programs
-
- 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/362—Software debugging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5016—Allocation 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 the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例公开一种基于内存池的内存错误调试方法和装置,该方法由内存池管理动态申请的内存,内存池中的每个内存由一个内存管理结构记录内存管理信息,在引用、释放目标内存时,可以获取目标内存的内存管理信息,内存管理信息可以反映出是否出现内存错误以及内存错误的位置,这样,当出现内存错误时便可以根据内存管理信息对内存错误进行调试。在未出现内存错误时,可以执行引用、释放目标内存的操作,并更新内存管理信息,以便后续利用更新后的内存管理信息执行获取目标内存的内存管理信息的步骤。可见,通过内存池中记录的内存管理信息可以发现和定位这些比较复杂的内存错误,从而对复杂的内存错误进行调试。
Description
技术领域
本申请涉及数据存储领域,特别是涉及一种基于内存池的内存错误调试方法和装置。
背景技术
在存储系统中,普遍采用编程语言例如C语言或C++语言来实现内存管理,这种内存管理方法需要的代码量十分庞大、且逻辑实现复杂,导致经常出现引用已释放内存、内存重复释放、内存泄漏、内存缓冲区溢出等内存错误,这些内存错误可能会影响程序的正常运行,因此,需要对这些内存错误进行调试,以修正这些内存错误。
目前,内存错误调试的方法主要有代码走查,使用静态分析工具lint等工具分析代码,单元测试、系统测试及分析日志log等。
这些方法都是对代码逻辑进行分析,仅能对一些简单的内存错误进行调试,一旦代码逻辑比较复杂,内存错误隐藏在复杂的代码逻辑之中,那么,这些方法将难以发现和定位这些比较复杂的内存错误,从而难以对复杂的内存错误进行调试。
发明内容
为了解决上述技术问题,本申请提供了一种基于内存池的内存错误调试方法和装置,该方法通过内存池中记录的内存管理信息可以发现和定位这些比较复杂的内存错误,从而对复杂的内存错误进行调试。
本申请实施例公开了如下技术方案:
第一方面,本申请实施例提供了一种基于内存池的内存错误调试方法,内存池管理动态申请的内存,所述内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,所述方法包括:
获取目标内存的内存管理信息,所述内存管理信息中至少包括内存分配、内存引用和内存释放的相关信息;
若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试;
若根据所述内存管理信息确定所述目标内存未出现内存错误,则更新所述内存管理信息,将更新后的内存管理信息记录在目标内存对应的内存管理结构中,以便后续利用更新后的内存管理信息执行所述获取目标内存的内存管理信息的步骤。
可选的,在所述获取目标内存的内存管理信息之前,所述方法还包括:
获取内存分配请求,所述内存分配请求中包括内存大小信息;
根据所述内存分配请求确定内存池中对应的内存空闲链表;
取下所述内存空闲链表中的一个节点,将所述节点插入到已分配的内存链表中;
初始化所述节点的内存管理信息及内存的校验值。
可选的,若所述内存管理信息中包括内存引用的相关信息,所述目标内存具有校验值,在引用目标内存时,所述若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试,包括:
根据所述内存管理信息确定所述目标内存是否已被释放;
若是,则触发程序崩溃;
若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;
若存在,则触发程序崩溃。
可选的,若所述内存管理信息中包括内存引用的相关信息和内存释放的相关信息,所述目标内存具有校验值,在释放目标内存时,所述若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试,包括:
根据所述内存管理信息确定目标内存是否已被释放;
若是,则触发程序崩溃;
若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;
若存在,则触发程序崩溃。
可选的,若所述引用的相关信息包括内存引用计数,根据所述目标内存的校验值确定不存在缓冲区溢出,所述更新所述内存管理信息,包括:
减少所述内存引用计数。
可选的,所述方法还包括:
判断所述内存引用计数是否为零;
若是,则将所述目标内存对应的节点从所述已分配内存链表中取下,并插入所述内存空闲链表。
可选的,所述若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试,包括:
扫描所述已分配内存链表,查看目标内存的分配时间是否超过预设阈值;
若是,则确定所述目标内存出现内存错误,并根据所述目标内存对应的内存管理信息对所述内存错误进行调试。
第二方面,本申请实施例提供了一种基于内存池的内存错误调试装置,内存池管理动态申请的内存,所述内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,所述装置包括第一获取单元、调试单元和更新单元:
所述第一获取单元,用于获取目标内存的内存管理信息,所述内存管理信息中至少包括内存分配、内存引用和内存释放的相关信息;
所述调试单元,用于若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试;
所述更新单元,用于若根据所述内存管理信息确定所述目标内存未出现内存错误,则更新所述内存管理信息,将更新后的内存管理信息记录在目标内存对应的内存管理结构中,以便所述第一获取单元利用更新后的内存管理信息执行所述获取目标内存的内存管理信息的步骤。
可选的,所述装置还包括第二获取单元、确定单元、第一插入单元和初始化单元:
所述第二获取单元,用于获取内存分配请求,所述内存分配请求中包括内存大小信息;
所述确定单元,用于根据所述内存分配请求确定内存池中对应的内存空闲链表;
所述第一插入单元,用于取下所述内存空闲链表中的一个节点,将所述节点插入到已分配的内存链表中;
所述初始化单元,用于初始化所述节点的内存管理信息及内存的校验值。
可选的,若所述内存管理信息中包括内存引用的相关信息,所述目标内存具有校验值,在引用目标内存时,所述调试单元,用于根据所述内存管理信息确定所述目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
可选的,若所述内存管理信息中包括内存引用的相关信息和内存释放的相关信息,所述目标内存具有校验值,在释放目标内存时,所述调试单元,用于根据所述内存管理信息确定目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
可选的,若所述引用的相关信息包括内存引用计数,根据所述目标内存的校验值确定不存在缓冲区溢出,所述更新单元,用于减少所述内存引用计数。
可选的,所述装置还包括判断单元和第二插入单元:
所述判断单元,用于判断所述内存引用计数是否为零;
所述第二插入单元,用于若是,则将所述目标内存对应的节点从所述已分配内存链表中取下,并插入所述内存空闲链表。
可选的,所述调试单元,用于扫描所述已分配内存链表,查看目标内存的分配时间是否超过预设阈值;若是,则确定所述目标内存出现内存错误,并根据所述目标内存对应的内存管理信息对所述内存错误进行调试。
由上述技术方案可以看出,本申请实施例具有以下优点:
该方法由内存池管理动态申请的内存,内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,在引用、释放目标内存时,可以获取目标内存的内存管理信息,内存管理信息可以反映出是否出现内存错误以及内存错误的位置,这样,当出现内存错误时便可以根据内存管理信息对内存错误进行调试。在未出现内存错误时,可以执行引用、释放目标内存的操作,并更新内存管理信息,以便后续利用更新后的内存管理信息执行获取目标内存的内存管理信息的步骤。可见,通过内存池中记录的内存管理信息可以发现和定位这些比较复杂的内存错误,从而对复杂的内存错误进行调试。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种基于内存池的内存错误调试方法的流程图;
图2为本申请实施例提供的一种内存池管理动态申请的内存的方法流程图;
图3为本申请实施例提供的一种内存空闲链表的示例图;
图4为本申请实施例提供的一种已分配链表的示例图;
图5为本申请实施例提供的一种内存池初始化的示例图;
图6为本申请实施例提供的一种基于内存池的内存错误调试装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
传统的采用静态分析工具lint以及其他工具对代码进行分析来检查内存错误的方法,难以发现和定位代码逻辑比较复杂、内存错误隐藏在复杂的代码逻辑之中的复杂内存错误,从而难以对复杂的内存错误进行调试。
为此,本申请实施例提供一种基于内存池的内存错误调试方法,该方法并非对代码进行检查,而是利用内存池管理动态申请的内存并记录每个内存对应的内存管理信息,从而可以根据内存管理信息检查出内存是否出现内存错误,以便对内存错误进行调试。
下面结合附图对基于内存池的内存错误调试方法进行介绍。
参见图1,图1示出了一种基于内存池的内存错误调试方法的流程图,内存池管理动态申请的内存,所述内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,所述方法包括:
S101、获取目标内存的内存管理信息,所述内存管理信息中至少包括内存分配、内存引用和内存释放的相关信息。
需要说明的是,利用本实施例的内存池管理动态申请的内存时,一旦对内存进行分配、引用和释放时,内存管理结构会记录该内存的内存管理信息。
一般情况下,内存引用的相关信息可以用内存引用次数ref_num或内存引用计数ref_count表示,其中,ref_num为内存引用的绝对次数,只要内存引用一次,ref_num便会增加一次;而ref_count为内存引用的相对次数,不仅需要考虑内存的引用,还需要考虑内存的释放,即内存引用一次,ref_count便会增加一次,内存释放一次,ref_count便会减少一次。
内存释放的相关信息可以用内存释放次数deref_num表示,内存释放一次,deref_num便会增加一次。
需要说明的是,为了实现本实施例提供的内存池的内存错误调试方法,在S101获取目标内存的内存管理信息之前,需要由内存池管理动态申请的内存,参见图2,图2示出了一种内存池管理动态申请的内存的方法流程图,包括:
S201、获取内存分配请求。
当需要申请内存时,用户可以向内存池发送内存分配请求,所述内存分配请求中包括内存大小信息。
S202、根据所述内存分配请求确定内存池中对应的内存空闲链表。
内存空闲链是内存池用来存储空闲内存的,在为申请该内存时,该内存还未被使用,因此,该内存可以被放入内存空闲链表中。内存空闲链表可以如图3所示,内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,管理结构对申请内存的用户来说是不可见的。
S203、取下所述内存空闲链表中的一个节点,将所述节点插入到已分配的内存链表中。
申请内存时,可以根据内存分配请求中的内存大小信息,从对应空闲链表中取一个相应大小的内存对应的节点,将其插入到相应的已分配的内存链表中,已分配链表如图4所示。
S204、初始化所述节点的内存管理信息及内存的校验值。
初始化内存管理结构mem_nod_s中的内存分配、内存引用和内存释放的相关信息,例如,内存分配栈记录ref_stack[ref_num-1]存储申请时的文件名、调用函数、行号、分配内存的时间,将内存引用次数ref_num初始化为1,将内存块引用计数ref_count初始化为1。接下来,初始化用户申请内存前后的校验值,即将用户分配内存之前及之后的若干字节初始化为特定值,如图5所示,最后将内存块指针返回给用户。在图5中校验值为“abcd”和“opqr”,当然,校验值也可以是其他特定值,本实施例对此不做限定。
通过图2对应的实施例,可以实现内存池管理动态申请的内存,每个内存都可以由对应的内存管理结构记录其内存管理信息,以便可以将内存管理信息应用于图1对应的实施实例,从而实现对内存错误进行调试。
S102、若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试。
S103、若根据所述内存管理信息确定所述目标内存未出现内存错误,则更新所述内存管理信息,将更新后的内存管理信息记录在目标内存对应的内存管理结构中,以便后续利用更新后的内存管理信息执行所述获取目标内存的内存管理信息的步骤。
在一种实现方式中,若所述内存管理信息中包括内存引用的相关信息,所述目标内存具有校验值,在引用目标内存时,S102的实现方式可以是:根据所述内存管理信息确定所述目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
具体的,若内存引用的相关信息包括内存引用次数ref_num和内存引用计数ref_count时,可以首先检查ref_count的值,如果ref_count的值等于0,说明目标内存已经被释放,此时,可以认为存在引用已释放内存的内存错误,可以打印该内存管理信息,触发程序崩溃dumpcore并转储程序数据。
如果ref_count的值大于0,则说明目标内存可以被引用,未出现引用已释放内存的内存错误。接下来,可以对校验值进行检查,如果校验值不正确说明目标内存已经被破坏,可以打印该内存管理信息,触发程序崩溃dumpcore。
如果校验值也正确,则可以引用该目标内存,则执行S103。具体的,可以修改内存管理结构mem_nod_s中的内存管理信息,例如,可以将内存引用次数ref_num的值加1,将内存引用计数ref_count的值加1,内存分配栈记录ref_stack[ref_num-1]存储引用目标内存的文件名、调用函数、行号、引用时间等。
在一种实现方式中,若所述内存管理信息中包括内存引用的相关信息和内存释放的相关信息,所述目标内存具有校验值,在释放目标内存时,S102的实现方式可以是:根据所述内存管理信息确定目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
其中,若所述引用的相关信息包括内存引用计数ref_count,根据所述目标内存的校验值确定不存在缓冲区溢出,所述更新所述内存管理信息的实现方式可以包括减少所述内存引用计数。
具体的,若内存引用的相关信息包括内存引用计数ref_count和内存释放次数deref_num时,可以首先检查ref_count的值,如果ref_count的值等于0,说明目标内存已经被释放,此时,可以认为存在重复释放内存的内存错误,可以打印该内存管理信息,触发程序崩溃dumpcore。
如果ref_count的值大于0,则说明目标内存可以被释放,未出现重复释放内存的内存错误,此时可以将ref_count的值减1。接下来,可以对校验值进行检查,如果校验值不正确说明目标内存已经被破坏,可以打印该内存管理信息,触发程序崩溃dumpcore。
如果校验值也正确,则可以释放该目标内存,则执行S103。具体的,可以修改内存管理结构mem_nod_s中的内存管理信息,例如,可以将内存释放次数deref_num的值加1,将内存引用计数ref_count的值减1,内存分配栈记录ref_stack[ref_num-1]存储释放目标内存的文件名、调用函数、行号、释放时间等。
在一种实现方式中,在更新内存管理信息时,内存引用计数ref_count可能会随着内存释放次数的增加而不断减少,当ref_count减少的0时,说明内存已经被释放完毕,为空闲内存,可以将其放入到内存空闲链表中。在这种情况下,为了保证可以将空闲内存放入到内存空闲链表中,可以判断内存引用计数是否为零;若是,则将所述目标内存对应的节点从所述已分配内存链表中取下,并插入所述内存空闲链表。
在一种实现方式中,S102的实现方式还可以是:扫描所述已分配内存链表,查看目标内存的分配时间是否超过预设阈值;若是,则确定所述目标内存出现内存错误,并根据所述目标内存对应的内存管理信息对所述内存错误进行调试。此时,出现的内存错误可以是内存泄露,内存泄露即为己分配的内存由于某种原因未释放或无法释放;预设阈值可以是预先根据经验设定的,例如可以是10s。
在确定出现内存错误时,可以将内存引用次数、释放次数、分配、引用栈及释放栈的文件、函数、行号、时间打印出来,从而快速定位内存错误的原因,以通过内存管理信息对内存泄露这种内存错误进行调试。
该方法由内存池管理动态申请的内存,内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,在引用、释放目标内存时,可以获取目标内存的内存管理信息,内存管理信息可以反映出是否出现内存错误以及内存错误的位置,这样,当出现内存错误时便可以根据内存管理信息对内存错误进行调试。在未出现内存错误时,可以执行引用、释放目标内存的操作,并更新内存管理信息,以便后续利用更新后的内存管理信息执行获取目标内存的内存管理信息的步骤。可见,通过内存池中记录的内存管理信息可以发现和定位这些比较复杂的内存错误,从而对复杂的内存错误进行调试。
本申请实施例还提供了一种基于内存池的内存错误调试装置,内存池管理动态申请的内存,所述内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,参见图6,所述装置包括第一获取单元601、调试单元602和更新单元603:
所述第一获取单元601,用于获取目标内存的内存管理信息,所述内存管理信息中至少包括内存分配、内存引用和内存释放的相关信息;
所述调试单元602,用于若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试;
所述更新单元603,用于若根据所述内存管理信息确定所述目标内存未出现内存错误,则更新所述内存管理信息,将更新后的内存管理信息记录在目标内存对应的内存管理结构中,以便所述第一获取单元利用更新后的内存管理信息执行所述获取目标内存的内存管理信息的步骤。
可选的,所述装置还包括第二获取单元、确定单元、第一插入单元和初始化单元:
所述第二获取单元,用于获取内存分配请求,所述内存分配请求中包括内存大小信息;
所述确定单元,用于根据所述内存分配请求确定内存池中对应的内存空闲链表;
所述第一插入单元,用于取下所述内存空闲链表中的一个节点,将所述节点插入到已分配的内存链表中;
所述初始化单元,用于初始化所述节点的内存管理信息及内存的校验值。
可选的,若所述内存管理信息中包括内存引用的相关信息,所述目标内存具有校验值,在引用目标内存时,所述调试单元,用于根据所述内存管理信息确定所述目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
可选的,若所述内存管理信息中包括内存引用的相关信息和内存释放的相关信息,所述目标内存具有校验值,在释放目标内存时,所述调试单元,用于根据所述内存管理信息确定目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
可选的,若所述引用的相关信息包括内存引用计数,根据所述目标内存的校验值确定不存在缓冲区溢出,所述更新单元,用于减少所述内存引用计数。
可选的,所述装置还包括判断单元和第二插入单元:
所述判断单元,用于判断所述内存引用计数是否为零;
所述第二插入单元,用于若是,则将所述目标内存对应的节点从所述已分配内存链表中取下,并插入所述内存空闲链表。
可选的,所述调试单元,用于扫描所述已分配内存链表,查看目标内存的分配时间是否超过预设阈值;若是,则确定所述目标内存出现内存错误,并根据所述目标内存对应的内存管理信息对所述内存错误进行调试。
该装置在引用、释放目标内存时,可以获取目标内存的内存管理信息,内存管理信息可以反映出是否出现内存错误以及内存错误的位置,这样,当出现内存错误时便可以根据内存管理信息对内存错误进行调试。在未出现内存错误时,可以执行引用、释放目标内存的操作,并更新内存管理信息,以便后续利用更新后的内存管理信息执行获取目标内存的内存管理信息的步骤。可见,通过内存池中记录的内存管理信息可以发现和定位这些比较复杂的内存错误,从而对复杂的内存错误进行调试。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质可以是下述介质中的至少一种:只读存储器(英文:read-only memory,缩写:ROM)、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备及系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的设备及系统实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述,仅为本申请的一种具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。
Claims (10)
1.一种基于内存池的内存错误调试方法,其特征在于,内存池管理动态申请的内存,所述内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,所述方法包括:
获取目标内存的内存管理信息,所述内存管理信息中至少包括内存分配、内存引用和内存释放的相关信息;
若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试;
若根据所述内存管理信息确定所述目标内存未出现内存错误,则更新所述内存管理信息,将更新后的内存管理信息记录在所述目标内存对应的内存管理结构中,以便后续利用所述更新后的内存管理信息执行所述获取目标内存的内存管理信息的步骤。
2.根据权利要求1所述的方法,其特征在于,在所述获取目标内存的内存管理信息之前,所述方法还包括:
获取内存分配请求,所述内存分配请求中包括内存大小信息;
根据所述内存分配请求确定内存池中对应的内存空闲链表;
取下所述内存空闲链表中的一个节点,将所述节点插入到已分配的内存链表中;
初始化所述节点的内存管理信息及内存的校验值。
3.根据权利要求1所述的方法,其特征在于,若所述内存管理信息中包括内存引用的相关信息,所述目标内存具有校验值,在引用目标内存时,所述若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试,包括:
根据所述内存管理信息确定所述目标内存是否已被释放;
若是,则触发程序崩溃;
若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;
若存在,则触发程序崩溃。
4.根据权利要求1所述的方法,其特征在于,若所述内存管理信息中包括内存引用的相关信息和内存释放的相关信息,所述目标内存具有校验值,在释放目标内存时,所述若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试,包括:
根据所述内存管理信息确定目标内存是否已被释放;
若是,则触发程序崩溃;
若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;
若存在,则触发程序崩溃。
5.根据权利要求4所述的方法,其特征在于,若所述引用的相关信息包括内存引用计数,根据所述目标内存的校验值确定不存在缓冲区溢出,所述更新所述内存管理信息,包括:
减少所述内存引用计数。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
判断所述内存引用计数是否为零;
若是,则将所述目标内存对应的节点从所述已分配内存链表中取下,并插入所述内存空闲链表。
7.根据权利要求1所述的方法,其特征在于,所述若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试,包括:
扫描所述已分配内存链表,查看目标内存的分配时间是否超过预设阈值;
若是,则确定所述目标内存出现内存错误,并根据所述目标内存对应的内存管理信息对所述内存错误进行调试。
8.一种基于内存池的内存错误调试装置,其特征在于,内存池管理动态申请的内存,所述内存池包括至少一个内存空闲链表,每个内存空闲链表中包括至少一个链表节点,每个链表节点对应的内存由一个内存管理结构记录内存管理信息,所述装置包括第一获取单元、调试单元和更新单元:
所述第一获取单元,用于获取目标内存的内存管理信息,所述内存管理信息中至少包括内存分配、内存引用和内存释放的相关信息;
所述调试单元,用于若根据所述内存管理信息确定所述目标内存出现内存错误,则对所述内存错误进行调试;
所述更新单元,用于若根据所述内存管理信息确定所述目标内存未出现内存错误,则更新所述内存管理信息,将更新后的内存管理信息记录在所述目标内存对应的内存管理结构中,以便所述第一获取单元利用所述更新后的内存管理信息执行所述获取目标内存的内存管理信息的步骤。
9.根据权利要求8所述的装置,其特征在于,所述装置还包括第二获取单元、确定单元、第一插入单元和初始化单元:
所述第二获取单元,用于获取内存分配请求,所述内存分配请求中包括内存大小信息;
所述确定单元,用于根据所述内存分配请求确定内存池中对应的内存空闲链表;
所述第一插入单元,用于取下所述内存空闲链表中的一个节点,将所述节点插入到已分配的内存链表中;
所述初始化单元,用于初始化所述节点的内存管理信息及内存的校验值。
10.根据权利要求8所述的装置,其特征在于,若所述内存管理信息中包括内存引用的相关信息,所述目标内存具有校验值,在引用目标内存时,所述调试单元,用于根据所述内存管理信息确定所述目标内存是否已被释放;若是,则触发程序崩溃;若否,则根据所述目标内存的校验值确定是否存在缓冲区溢出;若存在,则触发程序崩溃。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810829432.1A CN109086205A (zh) | 2018-07-25 | 2018-07-25 | 基于内存池的内存错误调试方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810829432.1A CN109086205A (zh) | 2018-07-25 | 2018-07-25 | 基于内存池的内存错误调试方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109086205A true CN109086205A (zh) | 2018-12-25 |
Family
ID=64838668
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810829432.1A Pending CN109086205A (zh) | 2018-07-25 | 2018-07-25 | 基于内存池的内存错误调试方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109086205A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631821A (zh) * | 2021-01-28 | 2021-04-09 | 长沙景嘉微电子股份有限公司 | 内存故障检测定位方法、装置、计算机设备及存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101149703A (zh) * | 2007-10-10 | 2008-03-26 | 中兴通讯股份有限公司 | 一种固定内存的管理方法 |
CN102455976A (zh) * | 2010-11-02 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种中间件内存管理方案 |
CN102831068A (zh) * | 2011-06-13 | 2012-12-19 | 阿里巴巴集团控股有限公司 | 一种内存操作记录的处理方法及装置 |
CN103914355A (zh) * | 2014-03-12 | 2014-07-09 | 汉柏科技有限公司 | 对内存重复释放进行定位的方法和装置 |
CN106681829A (zh) * | 2016-12-09 | 2017-05-17 | 上海斐讯数据通信技术有限公司 | 一种内存管理方法及系统 |
CN107220182A (zh) * | 2017-06-20 | 2017-09-29 | 中国电子科技集团公司第五十四研究所 | 一种内存重复释放错误检测方法 |
CN107451054A (zh) * | 2017-07-26 | 2017-12-08 | 武汉虹信通信技术有限责任公司 | 一种用于linux环境中的内存池调试方法 |
-
2018
- 2018-07-25 CN CN201810829432.1A patent/CN109086205A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101149703A (zh) * | 2007-10-10 | 2008-03-26 | 中兴通讯股份有限公司 | 一种固定内存的管理方法 |
CN102455976A (zh) * | 2010-11-02 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种中间件内存管理方案 |
CN102831068A (zh) * | 2011-06-13 | 2012-12-19 | 阿里巴巴集团控股有限公司 | 一种内存操作记录的处理方法及装置 |
CN103914355A (zh) * | 2014-03-12 | 2014-07-09 | 汉柏科技有限公司 | 对内存重复释放进行定位的方法和装置 |
CN106681829A (zh) * | 2016-12-09 | 2017-05-17 | 上海斐讯数据通信技术有限公司 | 一种内存管理方法及系统 |
CN107220182A (zh) * | 2017-06-20 | 2017-09-29 | 中国电子科技集团公司第五十四研究所 | 一种内存重复释放错误检测方法 |
CN107451054A (zh) * | 2017-07-26 | 2017-12-08 | 武汉虹信通信技术有限责任公司 | 一种用于linux环境中的内存池调试方法 |
Non-Patent Citations (1)
Title |
---|
刘志伟: "《Objective-C实验指导》", 30 June 2017, 华南理工大学出版社 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631821A (zh) * | 2021-01-28 | 2021-04-09 | 长沙景嘉微电子股份有限公司 | 内存故障检测定位方法、装置、计算机设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108170612B (zh) | 一种自动化测试方法、装置及服务器 | |
US8073673B2 (en) | Emulated memory management | |
CN111124850A (zh) | Mqtt服务器性能测试方法、系统、计算机设备及存储介质 | |
TWI530783B (zh) | 軟體除錯之除錯途程 | |
CN109144872A (zh) | 内存泄漏的检测方法、装置、终端设备及可读存储介质 | |
CN108459962A (zh) | 代码规范性检测方法、装置、终端设备及存储介质 | |
CN110018897B (zh) | 数据处理方法、装置及计算设备 | |
CN107368426B (zh) | 一种测试方法及测试装置 | |
CN111680008B (zh) | 日志处理方法、系统、可读存储介质及智能设备 | |
US7434020B2 (en) | Overwrite detection diagnostic for memory heap | |
CN108319711A (zh) | 数据库的事务一致性测试方法、装置、存储介质及设备 | |
CN107590144A (zh) | 一种文件存储方法和终端 | |
CN111382055B (zh) | 一种基于统一描述语言的自动化单元测试方法及装置 | |
US9183122B2 (en) | Automated program testing to facilitate recreation of test failure | |
CN109150642A (zh) | 应用内存错误检测方法、检测装置及存储介质 | |
CN107291623A (zh) | 一种应用程序测试方法和装置 | |
CN109377383A (zh) | 产品数据同步方法、装置、计算机设备及存储介质 | |
CN109086205A (zh) | 基于内存池的内存错误调试方法和装置 | |
WO2022095847A1 (zh) | 系统升级方法、装置、设备和存储介质 | |
CN112559525B (zh) | 数据检查系统、方法、装置和服务器 | |
CN104836686A (zh) | 一种生成服务器的配置文件的方法及装置 | |
CN114003293B (zh) | 接口管理方法、装置、电子设备以及可读存储介质 | |
CN108846009B (zh) | 一种ceph中副本数据存储方法及装置 | |
CN106909410A (zh) | 一种用于服务器系统的更新方法以及服务器系统 | |
CN109359093A (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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20181225 |
|
RJ01 | Rejection of invention patent application after publication |