CN108664394B - 一种内存泄露过程追溯方法及装置 - Google Patents

一种内存泄露过程追溯方法及装置 Download PDF

Info

Publication number
CN108664394B
CN108664394B CN201810316302.8A CN201810316302A CN108664394B CN 108664394 B CN108664394 B CN 108664394B CN 201810316302 A CN201810316302 A CN 201810316302A CN 108664394 B CN108664394 B CN 108664394B
Authority
CN
China
Prior art keywords
memory
operation function
memory operation
calling
updated
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
CN201810316302.8A
Other languages
English (en)
Other versions
CN108664394A (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.)
Qianxin Technology Group Co Ltd
Original Assignee
Qianxin Technology 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 Qianxin Technology Group Co Ltd filed Critical Qianxin Technology Group Co Ltd
Priority to CN201810316302.8A priority Critical patent/CN108664394B/zh
Publication of CN108664394A publication Critical patent/CN108664394A/zh
Application granted granted Critical
Publication of CN108664394B publication Critical patent/CN108664394B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources

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

一种内存泄露过程追溯方法及装置
技术领域
本发明实施例涉及计算机技术领域,具体涉及一种内存泄露过程追溯方法及装置。
背景技术
在软件开发过程中,内核泄漏是常见的问题,它直接影响软件***的长期稳定运行。内存泄漏是指程序中己动态分配的堆内存由于某种原因未释放或无法释放,造成***内存的浪费,导致程序运行速度减慢甚至***崩溃等严重后果。
目前检测内存泄漏的方法主要是使用内存快照对比的方法,即在程序运行过程每隔一段时间抓取内存分配操作的快照,通过人工方式查找相邻两次抓取的快照的差异,找出没有释放的内存块,但这种方法人工成本较高,需要测试人员比较了解业务。另一种方法是获取内存分配器分配的内存的地址堆栈信息,通过与可执行程序依赖的动态库的基地址和尾地址比较,获取地址堆栈信息对应的具***置信息,但这种方法确定的是内存泄漏的具***置,无法确定内存泄漏发生时程序的执行逻辑,即无法获取为何会发生内存泄漏。
在实现本发明实施例的过程中,发明人发现现有的方法缺乏对内存泄露过程的追溯,必须由开发和测试人员人工进行代码逻辑分析,耗费时间和精力。
发明内容
由于现有方法存在上述问题,本发明实施例提出一种内存泄露过程追溯方法及装置。
第一方面,本发明实施例提出一种内存泄露过程追溯方法,包括:
根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存;
若根据预先获取的可执行程序和保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯;
通过所述更新后内存操作函数将所述第二内存添加至全局链表中,或,通过内存释放函数将所述第二内存从所述全局链表中移除;
若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
可选地,所述通过所述更新后内存操作函数将所述第二内存添加至全局链表中,具体包括:
所述更新后内存操作函数根据当前函数的调用栈信息获取当前函数的调用链关系,将所述调用链关系存储在所述第二内存的头部,并将所述第二内存添加至全局链表中。
可选地,所述方法还包括:
若后一次获取的调用链的调用次数大于前一次获取的调用链的调用次数,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
可选地,所述根据原生内存操作函数生成更新后内存操作函数,具体包括:
在不改变可执行程序中调用所述原生内存操作函数的逻辑和调用代码的条件下,修改所述原生内存操作函数的预加载的环境变量或钩子函数,或重新定义所述原生内存操作函数的链接关系,或根据目标标识优先解析链接器。
可选地,所述头部中存储的信息包括:调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小和内存越界确认信息。
第二方面,本发明实施例还提出一种内存泄露过程追溯装置,包括:
内存更新模块,用于根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存;
追溯判断模块,用于若根据预先获取的可执行程序和保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯;
内存操作模块,用于通过所述更新后内存操作函数将所述第二内存添加至全局链表中,或,通过内存释放函数将所述第二内存从所述全局链表中移除;
泄露追溯模块,用于若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
可选地,所述内存操作模块具体用于所述更新后内存操作函数根据当前函数的调用栈信息获取当前函数的调用链关系,将所述调用链关系存储在所述第二内存的头部,并将所述第二内存添加至全局链表中。
可选地,所述装置还包括:
泄露判断模块,用于若后一次获取的调用链的调用次数大于前一次获取的调用链的调用次数,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
可选地,所述内存更新模块具体用于在不改变可执行程序中调用所述原生内存操作函数的逻辑和调用代码的条件下,修改所述原生内存操作函数的预加载的环境变量或钩子函数,或重新定义所述原生内存操作函数的链接关系,或根据目标标识优先解析链接器。
可选地,所述头部中存储的信息包括:调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小和内存越界确认信息。
第三方面,本发明实施例还提出一种电子设备,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行上述方法。
第四方面,本发明实施例还提出一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机程序,所述计算机程序使所述计算机执行上述方法。
由上述技术方案可知,本发明实施例通过确定第二内存可追溯和判断全局链表不为空后,根据调用关系追溯内存泄露的过程,通过获取更新后内存操作函数的执行路径来获取导致内存泄漏的执行过程,使得开发和测试人员对内存泄漏的位置和为什么会发生内存泄漏一目了然,无需耗费时间和精力再去分析代码逻辑。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些图获得其他的附图。
图1为本发明一实施例提供的一种内存泄露过程追溯方法的流程示意图;
图2为本发明另一实施例提供的一种内存泄露过程追溯方法的流程示意图;
图3为本发明一实施例提供的一种内存泄露过程追溯装置的结构示意图;
图4为本发明一实施例提供的电子设备的逻辑框图。
具体实施方式
下面结合附图,对本发明的具体实施方式作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
图1示出了本实施例提供的一种内存泄露过程追溯方法的流程示意图,包括:
S101、根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存。
其中,所述原生内存操作函数为***自带的内存操作函数,主要用于进行内存分配。
所述更新后内存操作函数为在所述原生内存操作函数的基础上,增加了部分功能,本实施例中增加的功能包括为原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存。
所述第一内存为原生内存操作函数分配的内存。
所述第二内存为更新后内存操作函数对第一内存处理得到的内存。
所述头部中存储的信息包括:调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小和内存越界确认信息。
具体地,在实际执行过程中,头部中存储的信息不仅仅包括上述信息,根据不同应用场景,可能会增加和减少一些头部信息,例如头部中存储的信息为:调用信息、分配的内存地址和实际使用的内存地址;或者调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小以及poison信息,其中poison信息用来确认内存越界。
S102、若根据预先获取的可执行程序和保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯。
其中,所述起止地址为预先获取的起始地址和结束地址,用于判断上述更新后内存操作函数生成的第二内存是否可追溯:当所述第二内存对应的更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯,否则确定所述第二内存不可追溯。
所述更新后内存操作函数的地址包括所述更新后内存操作函数及其所有的上级调用函数的地址,该地址是所述更新后内存操作函数的虚拟地址,目的是要保证所述更新后内存操作函数及其所有的上级调用函数的地址均在所述起止地址内。
例如通过读取可执行程序对应的进程下的文件,如/proc/[进程号]/maps或者smaps文件,可以获取可执行程序和其依赖动态库的堆栈信息,从而获取可执行程序和保留有栈帧的动态库的虚拟地址的起止地址。
进一步地,当所述第二内存可追溯时,能够根据后续的操作追溯内存泄露的过程;反之,当所述第二内存不可追溯时,则无法追溯内存泄露的过程。
S103、通过所述更新后内存操作函数将所述第二内存添加至全局链表中,或,通过内存释放函数将所述第二内存从所述全局链表中移除。
其中,所述全局链表为用于存储可执行程序运行过程中分配的内存的链表,当全局链表中的内存释放后,则将对应的内存从全局链表中移除。
S104、若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
具体地,全局链表为存储可执行程序运行过程中分配的内存的链表,当全局链表中的内存释放后,则将对应的内存从全局链表中移除,因此,当可执行程序运行结束后,正常情况下,全局链表中的内存将全部被释放,即全局链表为空。换言之,如果可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露。
更新后内存操作函数的调用关系为更新后内存操作函数的调用信息,可执行程序在执行过程中,可执行程序及其依赖的库调用更新后内存操作函数时,更新后内存操作函数会根据当前函数的调用栈信息获取该函数的调用链关系,即调用更新后内存操作函数的函数、调用更新后内存操作函数的函数的函数等等,例如可以通过__builtin_return_address函数等获取函数的返回地址信息,从而获取函数的调用关系,并根据该调用关系追溯内存泄露的过程。
本实施例通过确定第二内存可追溯和判断全局链表不为空后,根据调用关系追溯内存泄露的过程,通过获取更新后内存操作函数的执行路径来获取导致内存泄漏的执行过程,使得开发和测试人员对内存泄漏的位置和为什么会发生内存泄漏一目了然,无需耗费时间和精力再去分析代码逻辑。
进一步地,在上述方法实施例的基础上,S103中所述通过所述更新后内存操作函数将所述第二内存添加至全局链表中,具体包括:
所述更新后内存操作函数根据当前函数的调用栈信息获取当前函数的调用链关系,将所述调用链关系存储在所述第二内存的头部,并将所述第二内存添加至全局链表中。
具体地,可执行程序在执行过程中,可执行程序及其依赖的库调用内存操作函数时,调用的是所述更新后内存操作函数,所述更新后内存操作函数会根据当前函数的调用栈信息获取该函数的调用链关系,即调用内存操作函数的函数、调用内存操作函数的函数的函数等,例如通过__builtin_return_address函数等获取函数的返回地址信息,从而获取函数的调用链,这些信息存储在分配的内存的头部,然后将该内存块挂到全局链表中,以方便后续出现内存泄露问题时追溯内存泄露过程。
进一步地,在上述方法实施例的基础上,所述方法还包括:
S105、若后一次获取的调用链的调用次数大于前一次获取的调用链的调用次数,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
具体地,对于与***运行时间相同的可执行程序(例如后台进程deamon进程)而言,其生命周期与***同步,因此该可执行程序不存在步骤S104中执行结束的情况,因为该可执行程序执行结束时,***也结束运行,计算机无法进行判断和后续处理。因此,可以通过统计调用链的调用次数,如果次数递增,则说明该调用链导致了内存泄漏。
具体地,读取链表上的内存信息,读取方式可以是在可执行程序特定位置读取,也可以通过发送信号的方式在可执行程序某个时刻读取;然后统计内存信息中相同调用链的次数,如果两次统计过程中,次数有增加,则说明该调用链对应的执行过程会发生内存泄漏,进一步可根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
举例来说,如图2所示,首先确定内存操作函数的集合,根据该原生的内存操作函数,重新实现新的内存操作函数,即更新后内存操作函数,使得该更新后内存操作函数能够记录内存分配信息;然后钩取Hook可执行程序中的更新后内存操作函数,运行可执行程序,并获取可执行程序及其所依赖的动态库代码的起止地址,根据起止地址确定是否可追溯;判断当前是否为内存释放函数,如果是,则从全局链表上移除释放的内存,否则将当前的更新后内存操作函数的调用信息记录在分配的内存中,同时将分配的内存添加到全局链表上;通过读取链表上的内存信息,统计更新后内存操作函数调用的次数,如果调用的次数递增,则确定调用链发生内存泄露,若内存泄露过程可追溯,则通过调用关系确定内存泄露过程。
进一步地,在上述方法实施例的基础上,S101中所述根据原生内存操作函数生成更新后内存操作函数,具体包括:
在不改变可执行程序中调用所述原生内存操作函数的逻辑和调用代码的条件下,修改所述原生内存操作函数的预加载的环境变量或钩子函数,或重新定义所述原生内存操作函数的链接关系,或根据目标标识优先解析链接器。
具体地,重新实现内存操作函数的过程中,可以通过dlsym获取原生的内存操作函数,如malloc函数;然后将重新实现的内存操作函数的原型与原生的内存操作函数的原型保持一致,如实现malloc函数void*malloc(size_t size);通过获取的原生的内存操作函数分配的内存,给原生的内存操作函数分配的内存添加头部和尾部,头部包含了要使用的内存相关信息:内存起始地址、该函数的调用信息、内存总大小等等,也可通过其他方式分配内存。
在不改变可执行程序(包括其依赖的库文件等)中调用内存操作函数的逻辑和调用代码的条件下,可以通过多种方式生成更新后内存操作函数:
例如,采用hook的方法替换可执行程序及其依赖库文件中的内存操作函数,hook的方法有:修改LD_PRELOAD环境变量;或者,修改原生内存操作函数的的hook(钩子)函数,如__malloc_hook重新实现内存操作函数;或者,在可执行程序链接的时候通过-l链接,以重新定义原生内存操作函数的链接关系后,得到更新后内存操作函数;再或者,通过-wrap标识(目标标识)优先解析__wrap_symbol链接器,其中symbol是各种内存操作函数的符号,如malloc、realloc等函数,然后实现__wrap_malloc。
本实施例能够定位到内存泄漏的位置以及导致内存泄漏的过程,而非仅定位内存泄漏点,能够让开发和测试人员一目了然的知道内存泄漏的位置和为什么会发生内存泄漏,无需开发或者测试人员再去分析代码逻辑。
图3示出了本实施例提供的一种内存泄露过程追溯装置的结构示意图,所述装置包括:内存更新模块301、追溯判断模块302、内存操作模块303和泄露追溯模块304,其中:
所述内存更新模块301用于根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存;
所述追溯判断模块302用于若根据预先获取的可执行程序和保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯;
所述内存操作模块303用于通过所述更新后内存操作函数将所述第二内存添加至全局链表中,或,通过内存释放函数将所述第二内存从所述全局链表中移除;
所述泄露追溯模块304用于若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
具体地,所述内存更新模块301根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存;所述追溯判断模块302若根据预先获取的可执行程序和保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯;所述内存操作模块303通过所述更新后内存操作函数将所述第二内存添加至全局链表中,或,通过内存释放函数将所述第二内存从所述全局链表中移除;所述泄露追溯模块304若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
本实施例通过确定第二内存可追溯和判断全局链表不为空后,根据调用关系追溯内存泄露的过程,通过获取更新后内存操作函数的执行路径来获取导致内存泄漏的执行过程,使得开发和测试人员对内存泄漏的位置和为什么会发生内存泄漏一目了然,无需耗费时间和精力再去分析代码逻辑。
进一步地,在上述装置实施例的基础上,所述内存操作模块303具体用于所述更新后内存操作函数根据当前函数的调用栈信息获取当前函数的调用链关系,将所述调用链关系存储在所述第二内存的头部,并将所述第二内存添加至全局链表中。
进一步地,在上述装置实施例的基础上,所述装置还包括:
泄露判断模块,用于若后一次获取的调用链的调用次数大于前一次获取的调用链的调用次数,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
进一步地,在上述装置实施例的基础上,所述内存更新模块具301体用于在不改变可执行程序中调用所述原生内存操作函数的逻辑和调用代码的条件下,修改所述原生内存操作函数的预加载的环境变量或钩子函数,或重新定义所述原生内存操作函数的链接关系,或根据目标标识优先解析链接器。
进一步地,在上述装置实施例的基础上,所述头部中存储的信息包括:调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小和内存越界确认信息。
本实施例所述的内存泄露过程追溯装置可以用于执行上述方法实施例,其原理和技术效果类似,此处不再赘述。
参照图4,所述电子设备,包括:处理器(processor)401、存储器(memory)402和总线403;
其中,
所述处理器401和存储器402通过所述总线403完成相互间的通信;
所述处理器401用于调用所述存储器402中的程序指令,以执行上述各方法实施例所提供的方法。
本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法。
本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种内存泄露过程追溯方法,其特征在于,包括:
根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存;
若根据预先获取的可执行程序,以及所述可执行程序对应保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯;其中,所述起止地址为预先获取的起始地址和结束地址;所述更新后内存操作函数的地址包括所述更新后内存操作函数及其所有的上级调用函数的地址,且所述更新后内存操作函数的地址是所述更新后内存操作函数的虚拟地址;
所述可执行程序在执行过程中,所述可执行程序及其依赖的动态库调用内存操作函数时,调用所述更新后内存操作函数,根据当前函数的调用栈信息获取当前函数的调用链关系,将所述调用链关系存储在所述第二内存的头部,并将所述第二内存添加至全局链表中,或,判断所述当前函数为内存释放函数,将所述第二内存通过所述内存释放函数从所述全局链表中移除;
若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若后一次获取的调用链的调用次数大于前一次获取的调用链的调用次数,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
3.根据权利要求1-2任一项所述的方法,其特征在于,所述根据原生内存操作函数生成更新后内存操作函数,具体包括:
在不改变可执行程序中调用所述原生内存操作函数的逻辑和调用代码的条件下,修改所述原生内存操作函数的预加载的环境变量或钩子函数,或重新定义所述原生内存操作函数的链接关系,或根据目标标识优先解析链接器。
4.根据权利要求1-2任一项所述的方法,其特征在于,所述头部中存储的信息包括:调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小和内存越界确认信息。
5.一种内存泄露过程追溯装置,其特征在于,包括:
内存更新模块,用于根据原生内存操作函数生成更新后内存操作函数,通过所述更新后内存操作函数对所述原生内存操作函数分配的第一内存添加头部和尾部,得到第二内存;
追溯判断模块,用于若根据预先获取的可执行程序,以及所述可执行程序对应保留栈帧的动态库的虚拟地址的起止地址判断获知所述更新后内存操作函数的地址在所述起止地址内,则确定所述第二内存可追溯;其中,所述起止地址为预先获取的起始地址和结束地址;所述更新后内存操作函数的地址包括所述更新后内存操作函数及其所有的上级调用函数的地址,且所述更新后内存操作函数的地址是所述更新后内存操作函数的虚拟地址;
内存操作模块,用于所述可执行程序在执行过程中,所述可执行程序及其依赖的动态库调用内存操作函数时,调用所述更新后内存操作函数,根据当前函数的调用栈信息获取当前函数的调用链关系,将所述调用链关系存储在所述第二内存的头部,并将所述第二内存添加至全局链表中,或,判断所述当前函数为内存释放函数,将所述第二内存通过所述内存释放函数从所述全局链表中移除;
泄露追溯模块,用于若所述可执行程序执行结束后所述全局链表不为空,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
6.根据权利要求5所述的装置,其特征在于,所述装置还包括:
泄露判断模块,用于若后一次获取的调用链的调用次数大于前一次获取的调用链的调用次数,则确定存在内存泄露,并根据所述更新后内存操作函数的调用关系追溯内存泄露的过程。
7.根据权利要求5-6任一项所述的装置,其特征在于,所述内存更新模块具体用于在不改变可执行程序中调用所述原生内存操作函数的逻辑和调用代码的条件下,修改所述原生内存操作函数的预加载的环境变量或钩子函数,或重新定义所述原生内存操作函数的链接关系,或根据目标标识优先解析链接器。
8.根据权利要求5-6任一项所述的装置,其特征在于,所述头部中存储的信息包括:调用信息、分配的内存地址、实际使用的内存地址、分配的内存总大小、实际使用的内存总大小和内存越界确认信息。
9.一种电子设备,其特征在于,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至4任一所述的方法。
10.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机程序,所述计算机程序使所述计算机执行如权利要求1至4任一所述的方法。
CN201810316302.8A 2018-04-10 2018-04-10 一种内存泄露过程追溯方法及装置 Active CN108664394B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810316302.8A CN108664394B (zh) 2018-04-10 2018-04-10 一种内存泄露过程追溯方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810316302.8A CN108664394B (zh) 2018-04-10 2018-04-10 一种内存泄露过程追溯方法及装置

Publications (2)

Publication Number Publication Date
CN108664394A CN108664394A (zh) 2018-10-16
CN108664394B true CN108664394B (zh) 2021-12-14

Family

ID=63783413

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810316302.8A Active CN108664394B (zh) 2018-04-10 2018-04-10 一种内存泄露过程追溯方法及装置

Country Status (1)

Country Link
CN (1) CN108664394B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109828916B (zh) * 2018-12-29 2023-04-21 航天信息股份有限公司 一种解决内存泄漏的方法和***
CN111858112B (zh) * 2019-04-26 2023-04-25 腾讯科技(深圳)有限公司 一种检测内存泄露的方法、客户端及服务器
CN110413521B (zh) * 2019-07-24 2023-01-24 杭州迪普信息技术有限公司 一种堆内存的写越界检测方法和装置
CN111931191A (zh) * 2020-09-09 2020-11-13 中国人民解放军国防科技大学 Linux平台二进制软件堆溢漏洞动态检测方法及***

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7895483B2 (en) * 2007-05-25 2011-02-22 International Business Machines Corporation Software memory leak analysis using memory isolation
CN101593152B (zh) * 2009-06-25 2011-07-27 青岛海信移动通信技术股份有限公司 一种移动终端内存泄漏检测方法及装置
CN106933733B (zh) * 2015-12-30 2020-03-10 华为技术有限公司 一种确定内存泄露位置的方法和装置
CN106648893A (zh) * 2016-12-20 2017-05-10 北京匡恩网络科技有限责任公司 一种内存管理方法及设备
CN106844216A (zh) * 2017-01-25 2017-06-13 深圳怡化电脑股份有限公司 一种内存泄露的定位方法及***

Also Published As

Publication number Publication date
CN108664394A (zh) 2018-10-16

Similar Documents

Publication Publication Date Title
CN108664394B (zh) 一种内存泄露过程追溯方法及装置
CN106933733B (zh) 一种确定内存泄露位置的方法和装置
CN107766236B (zh) 测试任务自动化管理方法、装置、设备及存储介质
CN111680008B (zh) 日志处理方法、***、可读存储介质及智能设备
CN107608609B (zh) 一种事件对象发送方法与装置
CN115391228A (zh) 精准测试方法、装置、设备及介质
CN111090593A (zh) 确定崩溃归属的方法、装置、电子设备及存储介质
CN112181830B (zh) 内存泄露的检测方法、装置、终端及介质
CN110727585A (zh) 内存泄漏检测方法、装置、电子设备及可读存储介质
CN110647463B (zh) 一种恢复测试断点的方法、装置、电子设备
CN110688320A (zh) 全局变量的检测方法、装置及终端设备
CN113821193B (zh) 一种信息生成的方法、装置和存储介质
CN114500249A (zh) 一种根因定位方法和装置
CN114416545A (zh) 确定测试代码覆盖率的方法、装置和电子设备
CN109343953B (zh) 内存管理方法、装置及电子设备
CN113609478A (zh) 一种ios平台应用程序篡改检测方法及装置
CN112631821A (zh) 内存故障检测定位方法、装置、计算机设备及存储介质
CN111338956A (zh) 一种自动化的压测方法、装置、设备和存储介质
CN106897588B (zh) 一种标签函数的处理方法及装置
CN112698832B (zh) 一种识别代码变更影响范围的方法、装置及设备
CN115220970B (zh) 一种定位内存泄漏方法、装置、计算机设备及存储介质
CN111026613A (zh) 日志处理方法及装置
CN110795100A (zh) 分支合并方法及装置
CN106959888B (zh) 云存储***中的任务处理方法及装置
CN116414722B (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
CB02 Change of applicant information

Address after: Room 332, 3 / F, Building 102, 28 xinjiekouwei street, Xicheng District, Beijing 100088

Applicant after: Qianxin Technology Group Co.,Ltd.

Address before: 100015 15, 17 floor 1701-26, 3 building, 10 Jiuxianqiao Road, Chaoyang District, Beijing.

Applicant before: BEIJING QIANXIN TECHNOLOGY Co.,Ltd.

CB02 Change of applicant information
GR01 Patent grant
GR01 Patent grant