CN108073461A - 内存泄漏调试方法及装置 - Google Patents

内存泄漏调试方法及装置 Download PDF

Info

Publication number
CN108073461A
CN108073461A CN201610997589.6A CN201610997589A CN108073461A CN 108073461 A CN108073461 A CN 108073461A CN 201610997589 A CN201610997589 A CN 201610997589A CN 108073461 A CN108073461 A CN 108073461A
Authority
CN
China
Prior art keywords
memory
target
memory object
level
leakage
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.)
Granted
Application number
CN201610997589.6A
Other languages
English (en)
Other versions
CN108073461B (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201610997589.6A priority Critical patent/CN108073461B/zh
Publication of CN108073461A publication Critical patent/CN108073461A/zh
Application granted granted Critical
Publication of CN108073461B publication Critical patent/CN108073461B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0751Error or fault detection not based on redundancy
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种内存泄漏调试方法及装置,属于系统内存管理领域。所述内存泄漏调试方法包括:扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;根据所述目标内存对象的引用关系链和调用栈信息,对逻辑泄漏和/或物理泄漏的泄漏点进行分析调试。本发明通过构造目标内存对象的引用关系链,并推测引用关系链上各内存地址对象的数据类型,有效追溯泄漏对象的引用类别和来源,为泄漏点的分析调试工作提供了可靠的参考信息。

Description

内存泄漏调试方法及装置
技术领域
本发明涉及系统内存管理领域,特别涉及一种内存泄漏调试方法及装置。
背景技术
内存是软件运行的必需资源,在软件长时间运行的过程中,可能由于各种原因导致分配的内存没有释放掉,从而产生内存泄漏,累积效应可能导致系统内存总量减少以至耗尽的现象。内存泄漏包含物理性内存泄漏和逻辑性内存泄漏,泄漏点可能不是对泄漏对象本身的引用,而是深藏在对泄漏对象的引用关系链中,但是c/c++等底层高级语言产生的二进制可执行文件并没有包含数据类型信息,使得获取对象间的引用关系变得困难。
现有技术中,内存内容是否为指向一个内存对象的指针,可以通过内存分配器记账信息近似推断出,基于这个特征,现有的一些c/c++内存调试工具支持物理泄漏对象的自动探测,但是仍无法对内存泄漏进行泄漏点精确定位。
现有技术至少具有如下缺点:
1、内存泄漏信息只给出了泄漏对象的分配栈信息,没有任何有关于具体泄漏点的辅助信息,用户只能够结合对于代码的深刻理解才能推断出具体泄漏点,有时甚至难以推断出具体泄漏点;
2、只能给出物理内存泄漏信息,无法给出逻辑内存泄漏信息。
发明内容
为了解决现有技术的问题,本发明提供了一种内存泄漏调试方法及装置,可以有效追溯泄漏对象的引用类别和引用源,为泄漏点的分析调试工作提供了可靠的参考信息。所述技术方案如下:
一方面,本发明提供了一种内存泄漏调试方法,所述方法包括:
扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
根据所述目标内存对象的引用关系链和调用栈信息,对逻辑泄漏和/或物理泄漏的泄漏点进行分析调试。
另一方面,本发明提供了一种内存泄漏调试装置,所述装置包括:
扫描模块,用于扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
获取模块,用于获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
构造模块,用于遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
存储模块,用于存储内存对象的调用栈信息。
本发明提供的技术方案带来的有益效果如下:
1)通过内存扫描,获取内存间的引用关系,为逻辑泄漏对象和物理泄漏对象提供分析依据;
2)将内存间的引用关系转化为目标对象集合的引用对象地址列表集合,构造目标内存对象的引用关系链,辅助逻辑泄漏和/或物理泄漏的泄漏点分析;
3)在引用关系链的基础上,结合目标内存对象的调用栈信息,为泄漏点分析提供更加详细的信息。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例1提供的内存泄漏调试方法的流程图;
图2是本发明实施例1提供的逻辑泄漏对象的调试方法流程图;
图3是本发明实施例2提供的构造引用关系链的方法流程图;
图4是本发明实施例3提供的构造二级深度的引用关系链的方法流程图;
图5是本发明实施例4提供的构造带数据类型的引用关系链的方法流程图;
图6是本发明实施例5提供的内存泄漏调试装置的模块架构图;
图7是本发明实施例6提供的内存泄漏调试装置的计算机终端的硬件结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、装置、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
在本发明的一个实施例中,提供了一种内存泄漏调试方法,内存泄漏即指一个内存对象不会再被使用但是没有被回收,内存泄漏所造成的后果详见背景技术的描述,在此不再赘述,对此,需要对内存泄漏进行调试,找到泄漏点,及找到代码中由于没有对某个内存对象引用进行解引用而造成内存泄漏的位置,参见图1,方法流程包括:
S101、扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表。
具体地,对系统所有对象进行扫描,记录每个内存对象与其他内存对象之间的地址引用关系,并将所述地址引用关系保存为地址列表。
S102、获取目标对象集合,所述目标对象集合包括待调试的目标内存对象。
所述目标对象集合中的元素为内存对象,即为当前内存泄露调试的测试对象,具体地,所述目标对象集合包括活跃对象集合和物理泄漏对象集合,获取方式为通过遍历标记算法获取,通过遍历标记算法可以区分活跃对象集合和物理泄漏对象集合。
S103、遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链。
具体地,根据地址列表,将内存的地址引用关系转换为目标内存对象被引用关系,形成引用关系链,即根据所述每个内存对象引用的其他内存对象的地址列表,获取引用所述目标内存对象的内存对象的地址列表,进而将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合,所述一级引用对象为所述引用目标内存对象的内存对象。
S104、根据所述目标内存对象的引用关系链和调用栈信息,对逻辑泄漏和/或物理泄漏的泄漏点进行分析调试。
具体地,针对目标内存对象的引用关系链上的每一个内存对象,根据其对应的分配函数栈信息,得到对应的分配内存对象的代码行,由所述代码行内容推测引用关系链上的每一个内存对象的数据类型,其中,所述分配函数栈信息为进行内存分配时的调用栈信息。
需要说明的是,步骤S101-S104可以在不同的机器上运行,比如,S101和S102在手机终端上运行,S103和S104在程序员的开发机器上运行,手机终端上实现信息的获取,并将带完整信息的目标对象集合输出给开发机器,所述开发机器接收输出信息,并据此对目标对象集合进行分析,以辅助泄漏调试;同时需要说明的是,本发明对步骤S101和S102的执行先后顺序不作限定,即先获取目标对象集合,在对系统所有内存对象进行扫描,同样可以实现本发明,实现方式同上,在此不再赘述。
下面以活跃对象集合为例,参见图2为逻辑泄漏对象的调试方法流程图,方法流程包括:
S501、通过遍历标记算法获取活跃对象集合。
活跃对象和逻辑性内存泄漏都是基于根活跃对象的一个概念,根活跃对象为诸如全局对象、栈对象、寄存器对象等程序中可以直接访问的对象,活跃对象是可以由根活跃对象通过引用关系图遍历到的内存对象;而逻辑性内存泄漏是可以由根活跃对象通过引用关系图遍历到的内存泄漏,通过定义可以得知,通过遍历标记算法获取的活跃对象集合并不等同于逻辑性内存泄漏对象集合,事实上,所述活跃对象集合中的对象极少部分是逻辑泄漏对象,甚至活跃对象集合中不存在逻辑泄漏对象,活跃对象是否属于逻辑泄漏对象,需要对其进一步判断。
S502、扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表。
具体地,对系统所有内存对象进行扫描,扫描的内存对象必然包括上述通过遍历标记算法获取的对象集合中的目标内存对象,记录每个内存对象与其他内存对象之间的地址引用关系,并将所述地址引用关系保存为地址列表。
S503、遍历活跃对象集合,构造活跃对象的引用关系链。
具体地,根据地址列表,将内存的地址引用关系转换为活跃对象被引用关系,形成引用关系链。
S504、获取活跃对象的目标数目和实际数目,据此判断所述活跃对象是否为逻辑泄漏对象。
具体举例,通过引用关系链可以得到活跃对象实际存在的被引用数目,将其与预期的目标数目作比较,若某个活跃对象被引用的实际数目多于目标数目,说明有存在不合理或者不在预计中的被引用关系,则判定该活跃对象为逻辑泄漏对象;若实际数目与目标数目相同,则判定该活跃对象不属于逻辑泄漏对象。
对于物理泄漏对象,它与逻辑泄漏对象不同,所述物理泄漏对象为不能由根活跃对象通过引用关系图遍历到的内存泄漏对象。因此,由遍历标记算法获取的物理泄漏对象集合中的对象一定是物理泄漏对象,对于物理泄漏的调试方法参见图1中的方法流程,只是将获取的目标对象集合限定在物理泄漏内存对象集合中。
本实施例中可以看出,采用遍历标记算法和追溯引用关系,可以初步对物理泄漏/逻辑泄漏作出判断和确认泄漏对象。
在本发明的一个实施例中,提供了内存对象的引用关系链的构造方法,参见图3,方法流程包括:
S201、遍历目标对象集合,所述目标对象集合包括待调试的目标内存对象。
所述目标内存对象即为上述实施例中记载的通过遍历标记算法得到的目标对象集合中的对象,所述目标对象集合为活跃对象集合或物理泄漏对象集合,相应地,所述目标内存对象为活跃对象或物理泄漏对象。
S202、获取每个内存对象引用的其他内存对象的地址列表。
具体地,对系统的所有内存进行扫描,记录每个内存对象与其他内存对象之间的地址引用关系,并将所述地址引用关系保存为地址列表。
S203、遍历地址列表。
具体地,在地址列表中沿着搜索路线,依次对地址列表中的地址结点做一次且仅做一次访问。
S204、获取引用目标内存对象的内存对象地址。
举例来说,扫描内存对象a的引用其他对象的地址列表中有c,则c是扫描对象a的被引用对象地址,若c为目标对象集合中的其中一个目标内存对象,则获取到a为引用目标内存对象c的内存对象地址,即简称为a是目标内存对象c的引用对象地址。
S205、判断目标内存对象的引用列表项目是否存在,若存在,执行S207,若不存在,执行S206。
S206、创建新的目标内存对象的引用对象列表项目。
比如,引用对象列表项目的格式可以定义如下:(目标内存对象,{引用对象列表}),当我们找到a是目标内存对象c的引用对象地址后,判断c的引用列表项目是否已经被创建,如果没有,则创建项目如下:(c,{a})。
S207、向已有的目标内存对象的引用对象列表项目中添加新的引用对象。
举例,扫描内存对象b的引用其他对象的地址列表中有c,则b也是目标内存对象c的引用对象地址,这时候判断目标内存对象的引用列表项目是否存在,可以找到已建项目(c,{a}),则将新的引用对象b加入到该项目中,得到(c,{a,b})。
S208、判断地址列表是否遍历完成,若否,返回S203,若是,执行S209。
若地址列表遍历未完成,则继续遍历,返回S203遍历未遍历的地址,直至地址列表中所有地址都被遍历,使得目标内存对象的引用对象列表创建齐全。
S209、判断目标对象集合是否遍历完成,若否,返回S201,若是,执行S210。
S201-S208为对某一目标内存对象创建引用对象列表项目的全过程,以此循环,对下一目标内存对象创建其相应的引用对象列表项目,直至目标对象集合完成遍历,则目标对象集合中的所有对象都完成以上引用对象列表项目的齐全创建。
S210、得到目标内存对象的引用对象列表项目的集合。
比如,目标对象集合为{c,d},d的引用对象列表项目为(d,{e}),则所述目标内存对象的引用对象列表项目的集合可以整理如下格式:[(c,{a,b}),(d,{e})],所述目标内存对象c的引用关系链可以表达如下:所述目标内存对象d的引用关系链可以表达如下:d<--e,此为深度为一级的引用关系链。
在本发明的一个实施例中,为满足用户对泄漏对象引用关系链的深度输出要求,提供了一种多级引用深度的内存泄漏调试方法,参见图4,以二级深度的引用关系链的构造方法为例,所述方法流程包括:
S301、遍历一级引用对象。
首先遍历目标对象集合,如实施例2中目标内存对象的引用对象为一级引用对象,针对每一个目标内存对象,遍历其相应的一级引用对象,比如遍历到目标内存对象c时,需要遍历的一级引用对象为a和b,引用了a或b的内存对象即为目标内存对象c的二级引用对象。
S302、获取每个内存对象引用的其他内存对象的地址列表。
具体地,对系统进行全局扫描,记录每个内存对象与其他内存对象之间的地址引用关系,并将所述地址引用关系保存为地址列表。
S303、遍历地址列表。
具体地,在地址列表中沿着搜索路线,依次对地址列表中的地址结点做一次且仅做一次访问。
S304、获取引用一级对象的内存对象。
举例来说,扫描内存对象f的引用其他对象的地址列表中有b,则f是一级引用对象b的引用对象地址。
S305、判断地址列表是否遍历完成,若否,则返回S303,若是,则执行S306。
若地址列表遍历未完成,则继续遍历,返回S303遍历未遍历的地址,直至地址列表中所有地址都被遍历,使得一级引用对象的引用对象列表创建齐全。
S306、得到二级引用对象集合。
比如,一级引用对象b的引用对象列表创建齐全后,一级引用对象b的引用对象列表为(b,{f,g}),得到的二级引用对象集合为{f,g}。
S307、将二级引用对象加入到目标内存对象的引用对象列表项目中。
此时,遍历到b时候,目标内存对象c的二级深度的引用对象列表项目为(c,{a,b{f,g}})。
S308、判断一级引用对象是否遍历完成,若否,返回S301,若是,执行S309。
若一级引用对象为完成遍历,则继续遍历,对于目标内存对象c,还需要遍历一级引用对象a即完成遍历,如扫描内存的地址列表中不存在a的引用对象,则无需往目标内存对象c的引用对象列表项目中添加内容。
S309、得到二级深度的引用关系链。
S301-S308为得到单个目标内存对象的二级深度的引用对象列表项目的全过程,以此循环,遍历目标对象集合中所有的目标内存对象后,可得到目标内存对象、一级引用对象和二级引用对象的集合,其格式可以设定如下:[(c,{a,b{f,g}}),(d,{e{h,i,j}})],最终得到目标对象集合的深度为二级的引用关系链,可表达如下:
本发明不限定于构造深度为二级的引用关系链,基于上述构造方法,同理可以构造三级甚至更多级的引用关系链,为泄漏点分析调试提供更广泛而可靠的参考信息。
本发明的内存泄漏调试的技术方案可以独立使用,也可进一步根据调用栈信息推导出内存对象所属类型,为泄漏点分析提供更加详细的参考信息,本发明实施例提供了一种基于数据类型推测的内存泄漏调试方法,参见图5,所述方法流程包括:
S401、遍历引用关系链上的内存对象地址;
具体地,在引用关系链上沿着搜索路线,依次对内存对象地址结点做一次且仅做一次访问。
S402、查看遍历对象的调用栈信息。
根据遍历对象的地址信息,可以得到所述遍历对象的调用栈信息,具体地,查看调用栈中分配函数栈信息,所述分配函数栈为进行内存分配时的调用栈。比如,a的地址为0x32,根据该地址信息可以查到调用栈为k()->m()->n():10。
S403、得到对应的分配内存对象的代码行。
调用栈信息k()->m()->n():10指向的是n()函数的第10行,或者使用addr2line工具得到对应的分配内存对象的代码行。
S404、根据代码行内容推测对象的数据类型。
假设指向的代码行为object.cpp文件的第60行,内容如下:
Object*o=new Object(),则可以推测该对象属于object对象。
S405、判断对象的数据类型项目是否存在,若存在,则执行S407,若不存在,则执行S406。
S406、创建新的对象的数据类型项目。
在推测出对象的数据类型后,若判断该对象的数据类型的数据类型项目不存在,则创建如下:(a,object对象);若该项目已经被创建,则不需要重新创建。
S407、判断引用关系链的对象是否遍历完成。
若引用关系链上的内存地址对象已经遍历完成,则执行S408,否则返回S401。
S408、得到带对象数据类型的引用关系链,即引用关系链上每个内存地址对象都标记有各自的数据类型。
由于引用关系链中的内存对象是地址对象,直观上看,我们无法通过地址追溯引用类别,而由本实施例可以看出,通过对象的调用栈信息推测对象类别,可以为内存泄漏提供更详细的参考信息。
在本发明的一个实施例中,提供了一种内存泄漏调试装置,所述装置的模块架构参见图6,所述装置包括以下模块:
获取模块610,用于获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
扫描模块620,用于扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
构造模块630,用于遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
存储模块640,用于存储内存对象的调用栈信息。
具体地,所述构造模块630包括转换单元631,用于根据所述每个内存对象引用的其他内存对象的地址列表,获取引用所述目标内存对象的内存对象的地址列表,进而将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合,所述一级引用对象为所述引用目标内存对象的内存对象。举例来说,扫描内存对象a的引用其他对象的地址列表中有c,则c是扫描对象a的被引用对象地址,若c为目标对象集合中的对象,则获取到a为引用目标内存对象c的内存对象地址,即简称为a是目标内存对象c的引用对象地址,创建c的引用列表项目如下:(c,{a});扫描内存对象b的引用其他对象的地址列表中也有c,此时找到已建项目(c,{a}),并将新的引用对象b加入到该项目中,得到(c,{a,b}),直至遍历完所有的扫描地址列表。
具体地,所述获取模块610包括活跃对象获取模块611和物理泄漏对象获取模块612,所述活跃对象获取模块611用于获取活跃对象集合,所述物理泄漏对象获取模块612用于获取物理泄漏对象集合。内存泄漏即指一个内存对象不会再被使用但是没有被回收,内存泄漏包含物理性内存泄漏和逻辑性内存泄漏,物理性内存泄漏为不能由根活跃对象通过引用关系图遍历到的内存泄漏,逻辑性内存泄漏是可以由根活跃对象通过引用关系图遍历到的内存泄漏,所述活跃对象获取模块611获取的活跃对象集合中的对象不一定是逻辑泄漏对象,事实上,所述活跃对象集合中的对象极少部分是逻辑泄漏对象,甚至活跃对象集合中不存在逻辑泄漏对象,活跃对象是否属于逻辑泄漏对象,需要对其进一步判断。
进一步地,所述装置还包括判断模块670,用于根据所述活跃对象集合中内存对象的目标数据和实际数据,判断所述内存对象是否为逻辑泄漏对象。具体来说,通过引用关系链可以得到活跃对象实际存在的被引用数目,将其与预期的目标数目作比较,若某个活跃对象被引用的实际数目多于其目标数目,说明有存在不合理或者不在预计中的被引用关系,则判定该活跃对象为逻辑泄漏对象;若实际数目与目标数目相同,则判定该活跃对象不属于逻辑泄漏对象。
作为一种可选的实施例,所述内存泄漏调试装置还包括推测模块650,用于根据所述目标内存对象的调用栈信息,得到对应的分配内存对象的代码行,由所述代码行内容推测所述所述目标内存对象及相应的引用对象的数据类型。举例来说明:a的地址为0x32,根据该地址信息可以查到a的调用栈为k()->m()->n():10,指向的是n()函数的第10行,具体代码内容如下:
Object*o=new Object(),则可以推测该对象属于object对象。
由于引用关系链中的内存对象是地址对象,直观上看,我们无法通过地址追溯引用类别,而由本实施例可以看出,通过对象的调用栈信息推测对象类别,可以为内存泄漏提供更详细的参考信息。
作为另一种可选的实施例,所述内存泄漏调试装置还包括深度模块660,所述深度模块660用于获取所述目标内存对象的多级引用对象。举例来说,对于(c,{a,b})这样一个引用关系链来说,c是目标内存对象,a和b均为c的一级引用对象,若扫描内存对象f的引用其他对象的地址列表中有b,则f是一级引用对象b的引用对象地址,即为目标内存对象c的二级引用对象,此时c的二级深度的引用对象列表项目为(c,{a,b{f}}),其引用关系链可以表达如下:
综上所述,本发明实施例提供的内存泄漏调试装置构造关于目标内存对象的引用关系链,并推测引用关系链上各内存地址对象的数据类型,可以有效追溯泄漏对象的引用类别和引用源,为泄漏点(包括逻辑泄漏和物理泄漏)的分析调试工作提供了可靠的参考信息。
需要说明的是:上述实施例提供的内存泄漏调试装置在进行内存泄漏调试时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将内存泄漏调试装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,本实施例提供的内存泄漏调试装置实施例与上述实施例提供内存泄漏调试方法属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
本发明实施例提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行,在本发明的一个实施例中,以运行在计算机终端上为例,图7是本发明实施例的内存泄漏调试装置的计算机终端的硬件结构框图。如图7所示,终端800可以包括RF(RadioFrequency,射频)电路110、包括有一个或一个以上计算机可读存储介质的存储器120、输入单元130、显示单元140、传感器150、音频电路160、WiFi(wireless fidelity,无线保真)模块170、包括有一个或者一个以上处理核心的处理器180、以及电源190等部件。本领域技术人员可以理解,图7中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路110可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器180处理;另外,将涉及上行的数据发送给基站。通常,RF电路110包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM)卡、收发信机、耦合器、LNA(Low Noise Amplifier,低噪声放大器)、双工器等。此外,RF电路110还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于GSM(Global System of Mobile communication,全球移动通讯系统)、GPRS(General Packet Radio Service,通用分组无线服务)、CDMA(CodeDivision Multiple Access,码分多址)、WCDMA(Wideband Code Division MultipleAccess,宽带码分多址)、LTE(Long Term Evolution,长期演进)、电子邮件、SMS(ShortMessaging Service,短消息服务)等。
存储器120可用于存储软件程序以及模块,处理器180通过运行存储在存储器120的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器120可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端800的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器120可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器120还可以包括存储器控制器,以提供处理器180和输入单元130对存储器120的访问。
输入单元130可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,输入单元130可包括触敏表面131以及其他输入设备132。触敏表面131,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面131上或在触敏表面131附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面131可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器180,并能接收处理器180发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面131。除了触敏表面131,输入单元130还可以包括其他输入设备132。具体地,其他输入设备132可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元140可用于显示由用户输入的信息或提供给用户的信息以及终端800的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元140可包括显示面板141,可选的,可以采用LCD(Liquid Crystal Display,液晶显示器)、OLED(Organic Light-Emitting Diode,有机发光二极管)等形式来配置显示面板141。进一步的,触敏表面131可覆盖显示面板141,当触敏表面131检测到在其上或附近的触摸操作后,传送给处理器180以确定触摸事件的类型,随后处理器180根据触摸事件的类型在显示面板141上提供相应的视觉输出。虽然在图7中,触敏表面131与显示面板141是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面131与显示面板141集成而实现输入和输出功能。
终端800还可包括至少一种传感器150,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板141的亮度,接近传感器可在终端800移动到耳边时,关闭显示面板141和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别终端姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端800还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路160、扬声器161,传声器162可提供用户与终端800之间的音频接口。音频电路160可将接收到的音频数据转换后的电信号,传输到扬声器161,由扬声器161转换为声音信号输出;另一方面,传声器162将收集的声音信号转换为电信号,由音频电路160接收后转换为音频数据,再将音频数据输出处理器180处理后,经RF电路110以发送给比如另一终端,或者将音频数据输出至存储器120以便进一步处理。音频电路160还可能包括耳塞插孔,以提供外设耳机与终端800的通信。
WiFi属于短距离无线传输技术,终端800通过WiFi模块170可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图7示出了WiFi模块170,但是可以理解的是,其并不属于终端800的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器180是终端800的控制中心,利用各种接口和线路连接整个终端的各个部分,通过运行或执行存储在存储器120内的软件程序和/或模块,以及调用存储在存储器120内的数据,执行终端800的各种功能和处理数据,从而对终端进行整体监控。可选的,处理器180可包括一个或多个处理核心;优选的,处理器180可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器180中。
终端800还包括给各个部件供电的电源190(比如电池),优选的,电源可以通过电源管理系统与处理器180逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源190还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端800还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端的显示单元是触摸屏显示器,终端还包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行述一个或者一个以上程序包含用于进行以下操作的指令:
步骤1、扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
步骤2、获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
步骤3、遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
步骤4、根据所述目标内存对象的引用关系链和调用栈信息,对逻辑泄漏和/或物理泄漏的泄漏点进行分析调试。
本发明并不限定于将在一个终端上执行上述指令步骤,比如,步骤1和步骤2在第一终端上运行,步骤3和步骤4在第二终端运行,所述第一终端与第二终端通信连接,第一终端上实现信息的获取,并将带完整信息的目标对象集合发送给第二终端,所述第二终端接收输出信息,并据此对目标对象集合进行分析,以辅助泄漏调试,本发明对终端分配执行方式不作具体形式的限定,本发明对步骤1和步骤2的先后执行顺序也不作具体的限定。
具体地,终端的处理器还用于执行以下操作的指令:
根据所述每个内存对象引用的其他内存对象的地址列表,获取引用所述目标内存对象的内存对象的地址列表,进而将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合,所述一级引用对象为所述引用目标内存对象的内存对象。
具体地,终端的处理器还用于执行以下操作的指令:根据所述目标内存对象的调用栈信息,推测所述目标内存对象及相应的引用对象的数据类型,进而构造出带数据类型信息的引用关系链。
具体地,终端的处理器还用于执行以下操作的指令:获取引用所述一级引用对象的内存对象的地址列表,进而得到目标内存对象及相应的一级引用对象和二级引用对象的集合,所述二级引用对象为所述引用一级引用对象的内存对象。
具体地,终端的处理器还用于执行以下操作的指令:取出每个内存对象引用的其他内存对象的地址列表,针对每一个目标内存对象,遍历所述地址列表,创建所述目标内存对象的引用对象列表项目,所述项目包括目标内存对象及所有引用该目标内存对象的一级引用对象,遍历目标对象集合,得到目标内存对象的引用对象列表项目的集合。
具体地,终端的处理器还用于执行以下操作的指令:针对引用关系链上的每一个内存对象,根据分配函数栈信息,得到对应的分配内存对象的代码行,由所述代码行内容推测所述引用关系链上的内存对象的数据类型。
具体地,终端的处理器还用于执行以下操作的指令:根据所述活跃对象集合中内存对象的目标数目和实际数目,判断所述内存对象是否为逻辑泄漏对象。
通过以上实施方式的描述,本领域的技术人员可以清楚地了解到本发明提供的内存泄漏调试技术方案可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
在本发明的一个实施例中,提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中的存储器中所包含的计算机可读存储介质;也可以是单独存在,未装配入终端中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,一个或者一个以上程序被一个或者一个以上的处理器用来执行内存泄漏调试的方法,所述方法包括:
扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
根据所述目标内存对象的引用关系链和调用栈信息,对逻辑泄漏和/或物理泄漏的泄漏点进行分析调试。
进一步地,所述构造所述目标内存对象的引用关系链包括:
根据所述每个内存对象引用的其他内存对象的地址列表,获取引用所述目标内存对象的内存对象的地址列表,进而将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合,所述一级引用对象为所述引用目标内存对象的内存对象。
本发明提供的内存泄漏调试方法还包括:根据所述目标内存对象的调用栈信息,推测所述目标内存对象及相应的引用对象的数据类型,进而构造出带数据类型信息的引用关系链。
进一步地,所述内存泄漏调试方法还包括:获取引用所述一级引用对象的内存对象的地址列表,进而得到目标内存对象及相应的一级引用对象和二级引用对象的集合,所述二级引用对象为所述引用一级引用对象的内存对象。
具体地,所述目标对象集合包括活跃对象集合和物理泄漏对象集合,通过遍历标记算法区分所述活跃对象集合和物理泄漏对象集合。
优选地,所述将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合包括:取出每个内存对象引用的其他内存对象的地址列表,针对每一个目标内存对象,遍历所述地址列表,创建所述目标内存对象的引用对象列表项目,所述项目包括目标内存对象及所有引用该目标内存对象的一级引用对象,遍历目标对象集合,得到目标内存对象的引用对象列表项目的集合。
具体地,所述推测所述所述目标内存对象及相应引用对象的数据类型包括:针对引用关系链上的每一个内存对象,根据分配函数栈信息,得到对应的分配内存对象的代码行,由所述代码行内容推测所述引用关系链上的内存对象的数据类型。
可选地,根据所述活跃对象集合中目标内存对象的目标数目和实际数目,判断所述目标内存对象是否为逻辑泄漏对象,若目标数目与实际数目相等,则判定所述目标内存对象不是逻辑泄露对象,否则判定所述目标内存对象为逻辑泄露对象。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (14)

1.一种内存泄漏调试方法,其特征在于,所述方法包括:
扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
根据所述目标内存对象的引用关系链和调用栈信息,对逻辑泄漏和/或物理泄漏的泄漏点进行分析调试。
2.根据权利要求1所述的内存泄漏调试方法,其特征在于,所述构造所述目标内存对象的引用关系链包括:
根据所述每个内存对象引用的其他内存对象的地址列表,获取引用目标内存对象的内存对象的地址列表,进而将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合,所述一级引用对象为所述引用目标内存对象的内存对象。
3.根据权利要求2所述的内存泄漏调试方法,其特征在于,所述方法还包括:
根据所述目标内存对象的调用栈信息,推测所述所述目标内存对象及一级引用对象的数据类型,进而构造出带数据类型信息的引用关系链。
4.根据权利要求2所述的内存泄漏调试方法,其特征在于,所述方法还包括:
获取引用所述一级引用对象的内存对象的地址列表,进而得到目标内存对象及相应的一级引用对象和二级引用对象的集合,所述二级引用对象为所述引用一级引用对象的内存对象。
5.根据权利要求1-4所述的内存泄漏调试方法,其特征在于,所述目标对象集合包括活跃对象集合和物理泄漏对象集合,通过遍历标记算法区分所述活跃对象集合和物理泄漏对象集合。
6.根据权利要求2所述的内存泄漏调试方法,其特征在于,所述将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合包括:
取出每个内存对象引用的其他内存对象的地址列表,针对每一个目标内存对象,遍历所述地址列表,创建所述目标内存对象的引用对象列表项目,所述项目包括目标内存对象及所有引用该目标内存对象的一级引用对象,遍历目标对象集合,得到目标内存对象的引用对象列表项目的集合。
7.根据权利要求3所述内存泄漏调试方法,其特征在于,所述推测所述所述目标内存对象及一级引用对象的数据类型包括:
针对引用关系链上的每一个内存对象,根据分配函数栈信息,得到对应的分配内存对象的代码行,由所述代码行内容推测引用关系链上的内存对象的数据类型。
8.根据权利要求5所述内存泄漏调试方法,其特征在于,获取所述活跃对象集合中目标内存对象的目标数目和实际数目,判断所述目标内存对象是否为逻辑泄漏对象,若目标数目与实际数目相等,则判定所述目标内存对象不是逻辑泄露对象,否则判定所述目标内存对象为逻辑泄露对象。
9.一种内存泄漏调试装置,其特征在于,包括:
扫描模块,用于扫描每个内存对象,获取每个内存对象引用的其他内存对象的地址列表;
获取模块,用于获取目标对象集合,所述目标对象集合包括待调试的目标内存对象;
构造模块,用于遍历所述目标对象集合,根据所述地址列表,构造所述目标内存对象的引用关系链;
存储模块,用于存储内存对象的调用栈信息。
10.根据权利要求9所述的装置,其特征在于,所述构造模块包括转换单元,用于根据所述每个内存对象引用的其他内存对象的地址列表,获取引用所述目标内存对象的内存对象的地址列表,进而将所述目标对象集合转换为目标内存对象及相应的一级引用对象的集合,所述一级引用对象为所述引用目标内存对象的内存对象。
11.根据权利要求10所述的装置,其特征在于,还包括推测模块,用于根据所述目标内存对象的调用栈信息,得到对应的分配内存对象的代码行,由所述代码行内容推测所述所述目标内存对象及一级引用对象的数据类型。
12.根据权利要求10所述的装置,其特征在于,还包括深度模块,用于获取所述目标内存对象的多级引用对象。
13.根据权利要求9所述的装置,其特征在于,所述获取模块包括活跃对象获取模块和物理泄漏对象获取模块,所述活跃对象获取模块用于获取活跃对象集合,所述物理泄漏对象获取模块用于获取物理泄漏对象集合。
14.根据权利要求13所述的装置,其特征在于,还包括判断模块,用于根据所述活跃对象集合中目标内存对象的目标数目和实际数目,判断所述目标内存对象是否为逻辑泄漏对象,若目标数目与实际数目相等,则判定所述目标内存对象不是逻辑泄露对象,否则判定所述目标内存对象为逻辑泄露对象。
CN201610997589.6A 2016-11-11 2016-11-11 内存泄漏调试方法及装置 Active CN108073461B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610997589.6A CN108073461B (zh) 2016-11-11 2016-11-11 内存泄漏调试方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610997589.6A CN108073461B (zh) 2016-11-11 2016-11-11 内存泄漏调试方法及装置

Publications (2)

Publication Number Publication Date
CN108073461A true CN108073461A (zh) 2018-05-25
CN108073461B CN108073461B (zh) 2021-01-19

Family

ID=62161964

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610997589.6A Active CN108073461B (zh) 2016-11-11 2016-11-11 内存泄漏调试方法及装置

Country Status (1)

Country Link
CN (1) CN108073461B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109783371A (zh) * 2018-12-27 2019-05-21 江苏博智软件科技股份有限公司 一种关于iOS应用程序内存泄漏的即时检测方法
CN117435440A (zh) * 2023-12-20 2024-01-23 麒麟软件有限公司 一种程序堆空间的动态分析方法及系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050071387A1 (en) * 2003-09-29 2005-03-31 International Business Machines Corporation Automated scalable and adaptive system for memory analysis via the discovery of co-evolving regions
US7403961B1 (en) * 2003-03-14 2008-07-22 Xilinx, Inc. Dangling reference detection and garbage collection during hardware simulation
US20110238940A1 (en) * 2010-03-25 2011-09-29 Fujitsu Limited Operation processing device and method of detecting memory leak
CN102999328A (zh) * 2011-09-09 2013-03-27 微软公司 在循环图中管理对象生命期
CN105808369A (zh) * 2016-03-29 2016-07-27 北京系统工程研究所 一种基于符号执行的内存泄漏检测方法
CN106055478A (zh) * 2016-05-31 2016-10-26 腾讯科技(深圳)有限公司 检测内存泄漏的方法和装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7403961B1 (en) * 2003-03-14 2008-07-22 Xilinx, Inc. Dangling reference detection and garbage collection during hardware simulation
US20050071387A1 (en) * 2003-09-29 2005-03-31 International Business Machines Corporation Automated scalable and adaptive system for memory analysis via the discovery of co-evolving regions
US20110238940A1 (en) * 2010-03-25 2011-09-29 Fujitsu Limited Operation processing device and method of detecting memory leak
CN102999328A (zh) * 2011-09-09 2013-03-27 微软公司 在循环图中管理对象生命期
CN105808369A (zh) * 2016-03-29 2016-07-27 北京系统工程研究所 一种基于符号执行的内存泄漏检测方法
CN106055478A (zh) * 2016-05-31 2016-10-26 腾讯科技(深圳)有限公司 检测内存泄漏的方法和装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
AGESEN O, DETLEFS D, MOSS J E B: "《Garbage Collection and Local Variable Typeprecisionand Liveness in Java Virtual Machines》", 《NEW YORK:PROGRAMMING LANGUAGE DESIGN AND IMPLEMENTATION (PLDI)》 *
孔凡良: "《Java程序内存泄漏研究》", 《科技广场》 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109783371A (zh) * 2018-12-27 2019-05-21 江苏博智软件科技股份有限公司 一种关于iOS应用程序内存泄漏的即时检测方法
CN117435440A (zh) * 2023-12-20 2024-01-23 麒麟软件有限公司 一种程序堆空间的动态分析方法及系统
CN117435440B (zh) * 2023-12-20 2024-04-05 麒麟软件有限公司 一种程序堆空间的动态分析方法及系统

Also Published As

Publication number Publication date
CN108073461B (zh) 2021-01-19

Similar Documents

Publication Publication Date Title
CN108415739B (zh) 一种动态链接库函数的钩挂方法、装置和存储介质
CN105788612B (zh) 一种检测音质的方法和装置
CN106488296B (zh) 一种显示视频弹幕的方法和装置
CN106126411B (zh) 一种对被测程序代码进行测试的方法和装置
CN104519262B (zh) 获取视频数据的方法、装置及终端
CN105022616A (zh) 一种生成网页页面的方法及装置
CN106933525A (zh) 一种显示图像的方法和装置
CN104699501B (zh) 一种运行应用程序的方法及装置
CN104077184B (zh) 一种应用程序的进程控制方法及计算机系统
CN104965722B (zh) 一种显示信息的方法及装置
CN106775267A (zh) 一种显示游戏插件的功能菜单的方法和装置
CN107396193B (zh) 视频播放的方法和装置
CN104951637B (zh) 一种获取训练参数的方法及装置
CN107276602A (zh) 射频干扰处理方法、装置、存储介质及终端
CN107171740A (zh) 射频干扰处理方法、装置、存储介质及终端
CN105550316A (zh) 音频列表的推送方法及装置
CN106057213B (zh) 一种显示人声音高数据的方法和装置
CN103823851B (zh) 网页显示方法和装置
CN104102560B (zh) 系统性能测试的方法及装置
CN107577795A (zh) 一种推荐歌曲的方法、装置和系统
CN108073461A (zh) 内存泄漏调试方法及装置
CN106708500A (zh) 卸载界面的显示方法及装置
CN104965825B (zh) 一种数据处理的方法及终端
CN106098088A (zh) 一种显示歌词的方法和装置
CN106775745A (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