CN115220970B - 一种定位内存泄漏方法、装置、计算机设备及存储介质 - Google Patents

一种定位内存泄漏方法、装置、计算机设备及存储介质 Download PDF

Info

Publication number
CN115220970B
CN115220970B CN202111510857.4A CN202111510857A CN115220970B CN 115220970 B CN115220970 B CN 115220970B CN 202111510857 A CN202111510857 A CN 202111510857A CN 115220970 B CN115220970 B CN 115220970B
Authority
CN
China
Prior art keywords
memory
function
application
linked list
node
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
CN202111510857.4A
Other languages
English (en)
Other versions
CN115220970A (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.)
Guangzhou Automobile Group Co Ltd
Original Assignee
Guangzhou Automobile Group 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 Guangzhou Automobile Group Co Ltd filed Critical Guangzhou Automobile Group Co Ltd
Priority to CN202111510857.4A priority Critical patent/CN115220970B/zh
Publication of CN115220970A publication Critical patent/CN115220970A/zh
Application granted granted Critical
Publication of CN115220970B publication Critical patent/CN115220970B/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/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/2205Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing using arrangements specific to the hardware being tested
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/2273Test methods
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种定位内存泄漏方法、装置、计算机设备及存储介质,可解决无法快速定位内存泄漏的问题。方法部分包括:当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点;根据内存申请函数的函数信息,检索第二链表中是否有内存申请函数的申请内存;若有,则将调用对应的内存大小叠加至第二链表记录的内存申请函数的申请内存中;当有内存释放函数释放动态内存成功,且从第一链表中查询出内存释放函数的释放指针地址对应的节点为第一节点,则删除第一链表中的第一节点,并将第二链表中与函数名对应的内存申请函数的申请内存大小减去内存释放函数释放的内存大小;根据第二链表内存记录信息对内存泄漏进行检测。

Description

一种定位内存泄漏方法、装置、计算机设备及存储介质
技术领域
本发明涉及计算机技术领域,尤其涉及一种定位内存泄漏方法、装置、计算机设备及存储介质。
背景技术
由于一些使用场景的特殊性,对于软件的可靠性提出了苛刻要求,内存泄漏在软件开发过程中会给该应用的可靠性造成很大影响。因此在软件开发中能够识别到内存泄漏,并且可以快速定位到内存泄漏成了提高软件开发过程中必不可少的工具。
但是目前,大多通过嵌入式Linux系统来检测内存泄漏的问题,一般根据系统信息只能判断当前应用是否存在内存泄漏,而无法定位到内存泄漏在代码中的具体位置。
因此,确有必要提供一种解决上述问题的技术方案。
发明内容
本发明实施例提供一种定位内存泄漏方法、装置、计算机设备及存储介质,可解决无法快速定位内存泄漏的问题。
本发明第一方面提供了一种定位内存泄漏方法,包括:
当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
根据所述第二链表内存记录信息对内存泄漏进行检测。
在一种可能的设计中,所述根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,所述方法还包括:
当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
在一种可能的设计中,所述根据所述第二链表内存的记录信息对内存泄漏进行检测,包括:
在所述第二链表内存的记录信息对内存泄漏进行检测时,启动预先设置的定时器,定时获取预设时段内所述第二链表中所述内存申请函数的申请内存总大小;
根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测。
在一种可能的设计中,所述根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测,包括:
当所述内存申请函数申请的内存大小不断增大时,则判断所述内存申请函数存在内存泄漏。
在一种可能的设计中,所述将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小之后,所述方法还包括:
当所述第二链表中与所述函数名对应的内存申请函数的申请内存总大小已经全部释放,则删除所述第二链表中保存所述内存申请函数的相关节点。
在一种可能的设计中,所述在第一链表中插入第一节点,包括:
在所述第一链表的末尾插入所述第一节点。
本发明第二方面提供了一种定位内存泄漏的装置,包括:
插入模块,用于当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
判断模块,用于根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
叠加模块,用于若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
删除模块,用于当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
检测模块,用于根据所述第二链表内存记录信息对内存泄漏进行检测。
在一种可能的设计中,所述根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,所述插入模块,还用于:
当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述的定位内存泄漏方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如上述的定位内存泄漏方法的步骤。
在上述提供的其中一个方案中,当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;根据所述第二链表内存记录信息对内存泄漏进行检测。
也就是说,由于第二链表记录着申请内存与释放内存的内存使用情况和对应的内存申请函数,可以直接根据第二链表输出的内存使用信息,判断所述内存申请函数存在内存泄漏,从而可以实现快速定位内存泄漏的具体位置并且该方法可以在短时间内一次检测不同位置的内存泄漏,也可以大大提高了开发效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例中定位内存泄漏方法一个流程示意图;
图2是本实施例中定位内存泄漏方法的一个具体实施方式流程示意图;
图3是本发明实施例中定位内存泄漏的装置的一个结构示意图;
图4是本发明实施例中计算机设备的一个结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
关于本发明实施例提供的定位内存泄漏方法,其完整流程可以参见图1,需要说明的是,在本实施例中,该定位内存泄漏方法可应用于诸如Linux应用中的动态内存泄漏检测中,以Linux应用为例,Linux应用中内存分为静态内存和动态内存,静态内存由系统自动申请释放,动态内存需要软件工程师自己申请和释放,在开发中内存申请调用用malloc函数,释放调用用free函数,GAC_为全局应用程序集缓存(Global Assembly Cache),GAC_Malloc是内存申请封装函数,GAC_Free是内存释放封装函数。
下面结合图1,通过具体实施例对定位内存泄漏方法进行详细地描述:
在一实施例中,如图2所示,提供一种定位内存泄漏方法,包括如下步骤:
S10:当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
在步骤S10中,当有内存申请函数调用动态内存成功,则在第一链表插入第一节点,该第一节点保存当前内存申请函数对应的调用动态内存的指针地址、函数信息和内存大小,并且以指针地址作为检索键值。需要注意的是:函数信息包括但不局限于函数名和文件名等。
另外,在一个实施例中,在调用内存申请函数或者调用内存释放函数前,首先将动态内存的申请和释放都进行封装,形成封装函数,该封装函数可将调用该封装函数的函数名,该函数所在的文件名以及调用封装函数所在文件的函数,一起传递到封装函数内,封装函数会做多个链表,例如,可将申请内存的函数信息以及申请内存的指针地址、内存大小记录在第一链表中。调用该封装函数的函数时,可通过使用C语言中的宏(__FUNCTION__)获取函数名,在申请内存成功后将相关信息保存在第一链表中。
该封装函数包括内存申请封装函数和内存释放封装函数,内存申请封装函数指应用层的封装内存申请函数,用于应用中申请内存调用,同样,内存释放封装函数指应用层的内存释放封装函数,用于应用中释放内存调用。通过将内存申请和释放的接口封装,同时调用该接口时将调用该接口的函数(内存申请函数或内存释放函数)记录做成链表,这样调试人员可以根据这些记录快速定位应用是否存在内存泄漏,以及内存泄漏在代码中的具体位置。因此,本申请可以通过内存申请封装函数,确定内存申请函数调用动态内存的情况。
S20:根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
S30:若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
对于步骤S20和S30,根据所述内存申请函数的函数信息,具体是指根据第一链表中的第一节点保存有的函数名,检索第二链表中是否有所述内存申请函数的申请内存;如果检索到第二链表中含有所述内存申请函数的申请内存,则获取该函数在第二链表中的具体位置,并将本次所调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中。
示例性的,假设此次该内存申请函数的函数为函数A,该函数为函数A申请的内存大小为a兆,若通过函数名A在第二链表中检索到该函数A,且第二链表中记录的函数A的申请内存总大小为b兆,则在第二链表中,往记录的b兆基础上叠加上a兆,此时第二链表中记录的该函数A的申请内存总大小更改为(a+b)兆。
S40:当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
在步骤S40中,当有内存释放函数释放动态内存成功,则根据第一链表的第一节点所保存的指针地址获取该指针地址对应的申请函数名以及内存大小,将第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小,并删除所述第一链表中的所述第一节点。
需要注意的是,由于每一次申请加入第一链表,都会有一次新的节点的加入,因此,对应的函数每次释放后都需要删除该函数对应的节点。
同样,内存释放封装函数指应用层的内存释放封装函数,用于应用中释放内存调用。通过将内存释放的接口封装,同时调用该接口时将调用该接口的函数(内存申请函数或内存释放函数)记录做成链表,这样调试人员可以根据这些记录快速定位应用是否存在内存泄漏,以及内存泄漏在代码中的具体位置。因此,本申请可以通过内存释放封装函数,确定内存释放函数调用动态内存的情况。
S50:根据所述第二链表内存记录信息对内存泄漏进行检测。
具体地,第二链表内存记录信息包括该应用瞬时动态的内存大小以及各内存申请函数申请的内存总大小。假设释放的内存大小为c兆,则此时第二链表的内存总大小为(a+b-c)兆,若是第二链表中相应函数的申请内存在不断增长,则可以判断出其存在内存泄漏的可能。并且只要筛选出第二链表中申请内存不断增大的值,就可以相应的得出相应函数的函数信息,因此,工程师不仅可以根据第二链表输出的内存使用信息快速定位内存泄漏的具体位置,而且可以在短时间内一次检测多个位置的内存泄漏,大大提高了开发效率。
在一实施例中,步骤S20之后,即根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,所述方法还包括以下步骤:
S21:当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
对于步骤S21,具体是指根据第一链表中的第一节点保存有的函数名,检索第二链表中是否有所述内存申请函数的申请内存;如果检索到第二链表中未含有所述内存申请函数的申请内存,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,第二节点保存当前所述内存申请函数的函数信息(例如函数名)和内存总大小,并以函数名作为检索键值。
在一实施例中,步骤S50,根据所述第二链表内存的记录信息对内存泄漏进行检测,包括以下步骤:
S51:在所述第二链表内存的记录信息对内存泄漏进行检测时,启动预先设置的定时器,定时获取预设时段内所述第二链表中所述内存申请函数的申请内存总大小;
S52:根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测。
对于步骤S51和S52,也就是说,在所述第二链表内存的记录信息对内存泄漏进行检测时,应用中会启动一个预先设置的定时器,使其进入定时模式,并可根据实际情况的需要设置多组开关时间段,从而定时获取第二个链表中的内容,输出该应用瞬时动态内存大小以及各内存申请函数申请的内存总大小。
在一实施例中,步骤S52,根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测,包括以下步骤:
S53:当所述内存申请函数申请的内存大小不断增大时,则判断所述内存申请函数存在内存泄漏。
所谓内存泄漏指程序中已动态分配的内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,并且持续的内存泄漏会使程序性能下降、运行速度减慢、可能影响到其它有动态内存需求的程序运行甚至造成系统崩溃等后果(例如汽车软件的执行需要一直执行直到汽车报废,在这么长时间内很多隐蔽的内存泄漏可能就会积累很大,最终导致应用的崩溃)。
导致软件内存泄漏的原因很多,有可能是软件开发者的失误,(例如当代码条件判断分叉过多,工程师可能会疏忽忘了将某些已分配的内存释放)也可能是软件运行环境(操作系统、第三方库)存在问题。例如软件函数中有多个退出分支,导致前面申请到的内存申请函数退出时并不一定得到释放,这时系统也会出现内存泄漏问题。
需要注意的是,c语言开发中一般遵循两种申请内存方式,长期和短期,长期申请与应用存在时间相同,短期是在使用完后释放掉,如果没有及时释放掉已分配的内存,则第二链表中关于该内存申请函数的申请内存大小就会不断增大,进而判断该内存申请函数存在内存泄漏的可能。
在一实施例中,步骤S40之后,即将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小之后,所述方法还包括以下步骤:
S41:当所述第二链表中与所述函数名对应的内存申请函数的申请内存总大小已经全部释放,则删除所述第二链表中保存所述内存申请函数的相关节点。
具体地,由于第二链表是记录函数总共申请内存大小的,不是每一次申请都会有新节点产生,因此只有该内存申请函数的申请内存完全被释放,即内存的总大小为零时才需要将第二链表关于该内存申请函数的相关节点删除,删除该相关节点能够方便管理。该相关节点包括上述提到的插入第二链表中的第二节点,即包括但不局限于当前所述内存申请函数的函数信息和内存总大小。
在一实施例中,步骤S10中,在第一链表中插入第一节点,包括以下步骤:
S11:在所述第一链表的末尾插入所述第一节点。
具体地,在本实施例中,第一节点插在所述第一链表的末尾,因为插在末尾的话处理逻辑相对会简单。但是在其他实施例中,第一节点也可以插在第一链表的其他位置,例如表头或中部,具体不做限定。
在一实施例中,提供一种定位内存泄漏的装置,如图3所示,该定位内存泄漏的装置包括插入模块101、判断模块102、叠加模块103、删除模块104和检测模块105。各功能模块详细说明如下:
插入模块101,用于当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
判断模块102,用于根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
叠加模块103,用于若第二链表中含有所述内存申请函数的申请内存,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
删除模块104,用于当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
检测模块105,用于根据所述第二链表内存记录信息对内存泄漏进行检测。
在一实施例中,根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,所述插入模块101,具体用于:
当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
在一实施例中,根据所述第二链表内存的记录信息对内存泄漏进行检测,所述检测模块105,具体用于:
在所述第二链表内存的记录信息对内存泄漏进行检测时,启动预先设置的定时器,定时获取预设时段内所述第二链表中所述内存申请函数的申请内存总大小;
根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测。
在一实施例中,根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测,所述检测模块105,具体用于:
当所述内存申请函数申请的内存大小不断增大时,则判断所述内存申请函数存在内存泄漏。
在一实施例中,将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小之后,所述删除模块105,具体用于:
当所述第二链表中与所述函数名对应的内存申请函数的申请内存总大小已经全部释放,则删除所述第二链表中保存所述内存申请函数的相关节点。
在一实施例中,在第一链表中插入第一节点,所述插入模块101,具体用于:
当有内存申请函数调用动态内存成功,则在所述第一链表的末尾插入所述第一节点。
关于定位内存泄漏的装置的具体限定可以参见上文中对于定位内存泄漏方法的限定,在此不再赘述。上述定位内存泄漏的装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是车载终端,包括车机等,其内部结构图可以如图4所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机程序被处理器执行时以实现一种定位内存泄漏的方法。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
根据所述第二链表内存记录信息对内存泄漏进行检测。
优选地,处理器执行计算机程序时还实现以下步骤:
根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
优选地,处理器执行计算机程序时具体还实现以下步骤:
在所述第二链表内存的记录信息对内存泄漏进行检测时,启动预先设置的定时器,定时获取预设时段内所述第二链表中所述内存申请函数的申请内存总大小;
根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测。
优选地,处理器执行计算机程序时具体还实现以下步骤:
当所述内存申请函数申请的内存大小不断增大时,则判断所述内存申请函数存在内存泄漏。
优选地,处理器执行计算机程序时具体还实现以下步骤:
当所述第二链表中与所述函数名对应的内存申请函数的申请内存总大小已经全部释放,则删除所述第二链表中保存所述内存申请函数的相关节点。
优选地,处理器执行计算机程序时还实现以下步骤:
在所述第一链表的末尾插入所述第一节点。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
根据所述第二链表内存记录信息对内存泄漏进行检测。
优选地,计算机程序被处理器执行时还实现以下步骤:
当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
优选地,计算机程序被处理器执行时具体还实现以下步骤:
在所述第二链表内存的记录信息对内存泄漏进行检测时,启动预先设置的定时器,定时获取预设时段内所述第二链表中所述内存申请函数的申请内存总大小;
根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测。
优选地,计算机程序被处理器执行时具体还实现以下步骤:
当所述内存申请函数申请的内存大小不断增大时,则判断所述内存申请函数存在内存泄漏。
优选地,计算机程序被处理器执行时还实现以下步骤:
当所述第二链表中与所述函数名对应的内存申请函数的申请内存总大小已经全部释放,则删除所述第二链表中保存所述内存申请函数的相关节点。
优选地,计算机程序被处理器执行时具体还实现以下步骤:
在所述第一链表的末尾插入所述第一节点。
需要说明的是,上述关于计算机设备和计算机存储介质的具体描述,可对应参阅前述关于定位内存泄漏方法的相关描述,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

Claims (10)

1.一种定位内存泄漏的方法,其特征在于,包括:
当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述释放指针地址对应的申请函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
根据所述第二链表内存记录信息对内存泄漏进行检测。
2.根据权利要求1所述的定位内存泄漏的方法,其特征在于,所述根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,所述方法还包括:
当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
3.根据权利要求1所述的定位内存泄漏的方法,其特征在于,所述根据所述第二链表内存的记录信息对内存泄漏进行检测,包括:
在所述第二链表内存的记录信息对内存泄漏进行检测时,启动预先设置的定时器,定时获取预设时段内所述第二链表中所述内存申请函数的申请内存总大小;
根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测。
4.根据权利要求3所述的定位内存泄漏的方法,其特征在于,所述根据所述预设时段内所述内存申请函数的申请内存总大小,对内存泄漏进行检测,包括:
当所述内存申请函数申请的内存大小不断增大时,则判断所述内存申请函数存在内存泄漏。
5.根据权利要求1所述的定位内存泄漏的方法,其特征在于,所述将所述第二链表中与所述函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小之后,所述方法还包括:
当所述第二链表中与所述函数名对应的内存申请函数的申请内存总大小已经全部释放,则删除所述第二链表中保存所述内存申请函数的相关节点。
6.根据权利要求1-5任一项所述的定位内存泄漏的方法,其特征在于,所述在第一链表中插入第一节点,包括:
在所述第一链表的末尾插入所述第一节点。
7.一种定位内存泄漏的装置,其特征在于,包括:
插入模块,用于当有内存申请函数调用动态内存成功,则在第一链表中插入第一节点,所述第一节点保存当前所述调用对应的调用指针地址、函数信息和内存大小;
判断模块,用于根据所述内存申请函数的函数信息,检索第二链表中是否有所述内存申请函数的申请内存;
叠加模块,用于若有,则将所述调用对应的内存大小叠加至所述第二链表记录的所述内存申请函数的申请内存中;
删除模块,用于当有内存释放函数释放动态内存成功,且从所述第一链表中查询出所述内存释放函数的释放指针地址对应的节点为所述第一节点,则删除所述第一链表中的所述第一节点,并将所述第二链表中与所述释放指针地址对应的申请函数名对应的内存申请函数的申请内存大小减去所述内存释放函数释放的内存大小;
检测模块,用于根据所述第二链表内存记录信息对内存泄漏进行检测。
8.根据权利要求7所述的定位内存泄漏的装置,其特征在于,所述根据所述内存申请函数的函数信息,检索所述第二链表中是否有所述内存申请函数的申请内存之后,所述插入模块,还用于:
当检索到所述第二链表未含有所述内存申请函数的申请内存时,则按照所述内存申请函数的函数信息在所述第二链表中插入第二节点,所述第二节点保存当前所述内存申请函数的函数信息和内存总大小。
9.一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至6任一项所述的定位内存泄漏的方法的步骤。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述的定位内存泄漏的方法的步骤。
CN202111510857.4A 2021-12-10 2021-12-10 一种定位内存泄漏方法、装置、计算机设备及存储介质 Active CN115220970B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111510857.4A CN115220970B (zh) 2021-12-10 2021-12-10 一种定位内存泄漏方法、装置、计算机设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111510857.4A CN115220970B (zh) 2021-12-10 2021-12-10 一种定位内存泄漏方法、装置、计算机设备及存储介质

Publications (2)

Publication Number Publication Date
CN115220970A CN115220970A (zh) 2022-10-21
CN115220970B true CN115220970B (zh) 2023-09-08

Family

ID=83607021

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111510857.4A Active CN115220970B (zh) 2021-12-10 2021-12-10 一种定位内存泄漏方法、装置、计算机设备及存储介质

Country Status (1)

Country Link
CN (1) CN115220970B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007141193A (ja) * 2005-11-14 2007-06-07 Movell Software:Kk ワイヤレスデバイスのリアルタイム性に適用するメモリリーク検出手法
CN102866947A (zh) * 2012-08-29 2013-01-09 深圳市共进电子股份有限公司 一种Linux内核内存泄漏的检测方法
CN103914376A (zh) * 2014-03-12 2014-07-09 汉柏科技有限公司 一种内存泄露的快速定位方法
CN105260314A (zh) * 2015-11-03 2016-01-20 上海斐讯数据通信技术有限公司 内存泄漏的监测方法
CN106802861A (zh) * 2015-11-26 2017-06-06 大唐移动通信设备有限公司 一种检测内存泄露的方法和装置
CN110727585A (zh) * 2019-09-11 2020-01-24 锐捷网络股份有限公司 内存泄漏检测方法、装置、电子设备及可读存储介质

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007141193A (ja) * 2005-11-14 2007-06-07 Movell Software:Kk ワイヤレスデバイスのリアルタイム性に適用するメモリリーク検出手法
CN102866947A (zh) * 2012-08-29 2013-01-09 深圳市共进电子股份有限公司 一种Linux内核内存泄漏的检测方法
CN103914376A (zh) * 2014-03-12 2014-07-09 汉柏科技有限公司 一种内存泄露的快速定位方法
CN105260314A (zh) * 2015-11-03 2016-01-20 上海斐讯数据通信技术有限公司 内存泄漏的监测方法
CN106802861A (zh) * 2015-11-26 2017-06-06 大唐移动通信设备有限公司 一种检测内存泄露的方法和装置
CN110727585A (zh) * 2019-09-11 2020-01-24 锐捷网络股份有限公司 内存泄漏检测方法、装置、电子设备及可读存储介质

Also Published As

Publication number Publication date
CN115220970A (zh) 2022-10-21

Similar Documents

Publication Publication Date Title
CN106371940B (zh) 一种程序崩溃解决方法及装置
CN108664394B (zh) 一种内存泄露过程追溯方法及装置
CN109766124A (zh) 业务开发方法、装置、计算机设备和存储介质
CN111026663B (zh) 一种软件缺陷检测方法、装置、计算机设备和存储介质
CN109933350B (zh) 在应用中嵌入代码的方法、装置及电子设备
US20210334083A1 (en) Method and Apparatus for Upgrading Firmware of Transfer Device on Mobile Carrier, and Non-Transitory Storage Medium
CN110716845A (zh) 一种Android系统的日志信息读取的方法
CN111897493B (zh) 存储空间管理方法、装置及电子设备、存储介质
CN107368330B (zh) 客户端补丁修复方法、装置和系统
CN109582542B (zh) 一种嵌入式系统核心转储的方法
CN115220970B (zh) 一种定位内存泄漏方法、装置、计算机设备及存储介质
CN110647463B (zh) 一种恢复测试断点的方法、装置、电子设备
CN107301097B (zh) 一种调用java对象、java对象的引用地址信息的存储方法及装置
US20150378799A1 (en) Automatic memory leak detection
CN111309402B (zh) 数据监测及针对应用程序的处理方法、装置及设备
CN112564956A (zh) 一种客户端的远程升级方法及设备、装置、存储介质
CN111625225A (zh) 一种程序指定数据输出方法和装置
CN115454696A (zh) 一种内存泄漏检测的方法、装置及电子设备
CN115328851A (zh) 一种数据保护方法、装置、设备及介质
CN114168389A (zh) Cad文件的恢复方法、装置、存储介质及处理器
CN109343953B (zh) 内存管理方法、装置及电子设备
CN110795100B (zh) 分支合并方法及装置
CN114691496A (zh) 单元测试方法、装置、计算设备及介质
CN112631821A (zh) 内存故障检测定位方法、装置、计算机设备及存储介质
CN110688430B (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