CN111858112B - 一种检测内存泄露的方法、客户端及服务器 - Google Patents

一种检测内存泄露的方法、客户端及服务器 Download PDF

Info

Publication number
CN111858112B
CN111858112B CN201910344979.7A CN201910344979A CN111858112B CN 111858112 B CN111858112 B CN 111858112B CN 201910344979 A CN201910344979 A CN 201910344979A CN 111858112 B CN111858112 B CN 111858112B
Authority
CN
China
Prior art keywords
memory
function
information
module
application program
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
CN201910344979.7A
Other languages
English (en)
Other versions
CN111858112A (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 CN201910344979.7A priority Critical patent/CN111858112B/zh
Publication of CN111858112A publication Critical patent/CN111858112A/zh
Application granted granted Critical
Publication of CN111858112B publication Critical patent/CN111858112B/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/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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/302Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3051Monitoring arrangements for monitoring the configuration of the computing system or of the computing system component, e.g. monitoring the presence of processing resources, peripherals, I/O links, software programs
    • 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

Abstract

本发明实施例提供了一种检测内存泄露的方法、客户端及服务器,涉及内存管理技术领域,客户端监测加载函数的调用状态,获取进程中当前加载的模块的属性信息。监测内存分配函数和内存释放函数的调用状态,获得进程的内存分配信息和内存释放信息,然后将模块的属性信息、内存分配信息以及内存释放信息发送至服务器。服务器根据模块的属性信息、内存分配信息以及内存释放信息确定模块存在内存泄露的函数。由于客户端采用Hook技术监控应用程序在运行时的内存分配和释放信息并发送至服务器,使服务器对监测的信息进行分析,实现在不修改客户端内核的基础上,检测发布后的应用程序的内存泄露问题,从而提高了客户端应用程序的稳定性。

Description

一种检测内存泄露的方法、客户端及服务器
技术领域
本发明实施例涉及内存管理技术领域,尤其涉及一种检测内存泄露的方法、客户端及服务器。
背景技术
作为服务大众用户的客户端应用程序,稳定性是必不可少的参考指标,那么如何减少内存泄露给应用程序所造成的影响便成了客户端应用程序稳定性中的一个不可或缺的环节。若客户端应用程序在运行时有内存泄露,将导致系统内存不足,严重时还会导致系统崩溃。目前,定位内存泄露的工具大多是针对客户端应用程序的测试版本,且需要在特定的调试环境中检测,而客户端应用程序发布后,客户端应用程序运行的环境可能发生变化,此时还可能会出现内存泄露,而目前的检测工具不能很好地检测出客户端应用程序发布后存在的内存泄露问题。
发明内容
由于目前的检测工具针对的是客户端应用程序的测试版本,且需要在特定的调试环境中检测,从而不能很好地检测客户端应用程序发布后存在的内存泄露问题,为此,本发明实施例提供了一种检测内存泄露的方法、客户端及服务器。
一方面,本发明实施例提供了一种检测内存泄露的方法,包括:
客户端在接收到服务器发送的检测指示信息时,监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息;
监测内存分配函数和内存释放函数的调用状态,获得所述进程的内存分配信息和内存释放信息;
将所述模块的属性信息、所述内存分配信息以及所述内存释放信息发送至服务器,以使所述服务器根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存,根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存,根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
一方面,本发明实施例提供了一种检测内存泄露的方法,包括:
服务器接收客户端发送的待检测应用程序对应的进程中加载的模块的属性信息、待检测应用程序对应的进程的内存分配信息以及待检测应用程序对应的进程的内存释放信息,所述模块的属性信息是所述客户端通过监测加载函数的调用状态获取的,所述内存分配信息是所述客户端通过监测内存分配函数的调用状态获得的,所述内存释放信息是所述客户端通过监测内存释放函数的调用状态获得的;
根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存;
根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存;
根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
一方面,本发明实施例提供了一种客户端,包括:
第一接收模块,用于接收服务器发送的检测指示信息;
监测模块,用于监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息;监测内存分配函数和内存释放函数的调用状态,获得所述进程的内存分配信息和内存释放信息;
第一处理模块,用于将所述模块的属性信息、所述内存分配信息以及所述内存释放信息发送至服务器,以使所述服务器根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存,根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存,根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
可选地,所述第一处理模块具体用于:
将所述模块的属性信息、所述内存分配信息以及所述内存释放信息保存在日志中;
当所述进程结束时,将所述日志发送至服务器。
可选地,所述内存分配信息包括被分配内存的属性信息,所述内存释放信息包括被释放内存的属性信息;
所述第一处理模块还用于:
定期扫描日志中的内存分配信息和内存释放信息;
当内存分配信息中被分配内存的属性信息与内存释放信息中被释放内存的属性信息匹配时,删除日志中匹配的被分配内存的属性信息和被释放内存的属性信息。
可选地,还包括第一发送模块;
所述第一发送模块具体用于:
在启动应用程序时,发送所述应用程序的属性信息至服务器,以使所述服务器根据所述应用程序的属性信息确定所述应用程序为待检测应用程序时,发送检测指示信息至所述客户端。
一方面,本发明实施例提供了一种服务器,包括:
第二接收模块,用于接收客户端发送的待检测应用程序对应的进程中加载的模块的属性信息、待检测应用程序对应的进程的内存分配信息以及待检测应用程序对应的进程的内存释放信息,所述模块的属性信息是所述客户端通过监测加载函数的调用状态获取的,所述内存分配信息是所述客户端通过监测内存分配函数的调用状态获得的,所述内存释放信息是所述客户端通过监测内存释放函数的调用状态获得的;
第二处理模块,用于根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存;根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存;
分析模块,用于根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
可选地,所述第二接收模块还用于,接收所述客户端发送的应用程序的属性信息;
所述第二处理模块还用于,根据所述应用程序的属性信息判断所述应用程序是否为待检测应用程序;若是,则第二发送模块发送检测指示信息至所述客户端;否则所述第二发送模块不发送检测指示信息至所述客户端。
一方面,本发明实施例提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现检测内存泄露的方法的步骤。
一方面,本发明实施例提供了一种计算机可读存储介质,其存储有可由计算机设备执行的计算机程序,当所述程序在计算机设备上运行时,使得所述计算机设备执行检测内存泄露的方法的步骤。
本发明实施例中,服务器通过发送检测指示信息至客户端,使客户端在应用程序运行时监测进程中加载的模块、进程的内存分配信息及进程的内存释放信息,然后返回监测的数据至服务器,服务器对监测的数据进行分析,确定发布后的应用程序是否存在内存泄露问题,从而提高了客户端应用程序的稳定性。其次,通过监测加载函数、分配函数和内存释放函数的调用状态获取检测内存泄露的关键数据,而不需要对客户端的系统内核进行修改,从而简化了检测内存泄露的过程。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种应用场景的示意图;
图2为本发明实施例提供的一种检测内存泄露的方法的流程示意图;
图3为本发明实施例提供的一种检测内存泄露的方法的流程示意图;
图4为本发明实施例提供的一种客户端的结构示意图;
图5为本发明实施例提供的一种服务器的结构示意图;
图6为本发明实施例提供的一种计算机设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为了方便理解,下面对本发明实施例中涉及的名词进行解释。
内存泄露:指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
Hook技术:即钩子技术,是消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数可以处理该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
在具体实践过程中,若客户端应用程序在运行时有内存泄露,将导致系统内存不足,严重时还会导致系统崩溃。如果程序运行时间足够长,内存泄露将在很长一段时间不被发现,直到服务器宕机。当程序代码量非常大,后台进程较多时,内存泄露的原因将很难找到。目前,一些平台上提供了检测内存泄露的工具,比如微软在C语言运行时库(C run-timelibrary,简称CRT库)中提供了检测内存泄露的方法,通过调用_malloc_dbg、_free_dbg以及_CrtDumpMemoryLeaks来实现。但是该方法针对的是客户端应用程序的测试版本,且需要在特定的调试环境中定位内存泄露。而客户端应用程序发布后,应用程序运行的环境可能会发生变化,且发布后的应用程序版本也可能与测试版本不是完全相同的,因此目前的检测工具不能很好地检测出客户端应用程序发布后存在的内存泄露问题。
鉴于此,本发明实施例提供了一种检测内存泄露的方法,由客户端和服务器交互执行,即:客户端在接收到检测指示信息时,监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息。监测内存分配函数和内存释放函数的调用状态,获得进程的内存分配信息和内存释放信息,然后将模块的属性信息、内存分配信息以及内存释放信息发送至服务器。服务器首先根据模块的属性信息和内存分配信息确定为模块中每个函数被分配的内存,然后根据模块的属性信息和内存释放信息确定模块中每个函数释放的内存,根据模块中每个函数被分配的内存和模块中每个函数释放的内存确定模块存在内存泄露的函数。
本发明实施例中,服务器通过发送检测指示信息至客户端,使客户端在应用程序运行时监测进程中加载的模块、进程的内存分配信息及进程的内存释放信息,然后返回监测的数据至服务器,服务器对监测的数据进行分析,确定发布后的应用程序是否存在内存泄露问题,从而提高了客户端应用程序的稳定性。其次,通过监测加载函数、分配函数和内存释放函数的调用状态获取检测内存泄露的关键数据,而不需要对客户端的系统内核进行修改,从而简化了检测内存泄露的过程。
本发明实施例中的检测内存泄露的方法可以应用于如图1所示的应用场景,在该应用场景中包括客户端101、服务器102。
客户端101是具有统一的内存分配函数和内存释放函数的电子设备,该电子设备的操作系统可以是Windows、Linux、Unix等操作系统。示例性地,该电子设备可以是智能手机、台式计算机、平板电脑或便携式个人计算机等等。客户端101上安装有应用程序,应用程序可以是社交类应用程序,比如微信、QQ等,也可以是游戏类应用程序,比如绝地求生等,还可以是其他类型的应用程序。服务器102为应用程序对应的后台服务器,服务器102是一台服务器或若干台服务器组成的服务器集群或云计算中心。客户端101通过无线网络与服务器102连接。
基于图1所示的应用场景图,本发明实施例提供了一种检测内存泄露的方法的流程,该方法的流程可以由客户端和服务器交互执行,如图2所示,包括以下步骤:
步骤S201,服务器发送检测指示信息至客户端。
具体地,检测指示信息用于指示客户端监测指定的函数的调用状态,获取用于定位内存泄露的数据。
在一种可能的实施方式中,客户端启动应用程序时,发送应用程序的属性信息至服务器,服务器根据应用程序的属性信息确定应用程序为待检测应用程序时,发送检测指示信息至客户端。
具体地,客户端预先安装应用程序,用户点击应用程序的图标时,客户端启动应用程序,然后获取应用程序的属性信息,其中,应用程序的属性信息包括应用程序名称、应用程序版本、用户标识、客户端操作系统版本等。服务器在接收到客户端发送的应用程序的属性信息后,可以采用以下步骤判断应用程序是否为待检测应用程序:
步骤1、服务器将客户端发送的应用程序的属性信息与预设的筛选条件进行比较。
具体地,筛选条件可以根据用户操作频率、用户访问时间等实际需求进行设定,比如,有些应用程序的用户操作比较频繁,例如游戏应用程序,那么该类应用程序对内存、带宽等资源的要求较高,若对此类应用程序下发检测指示信息检测内存泄露,将占用客户端的内存、宽带等资源,从而影响用户操作应用程序的体验。而对于用户操作不频繁的应用程序来说,下发检测指示信息检测内存泄露,对用户体验影响不大,因此,可以根据应用程序的用户操作频率设置筛选条件。又比如,有些应用程序可能在某个时间段内会出现用户访问高峰,若在该时段下发检测指示信息检测内存泄露,将占用客户端的内存、宽带等资源,从而影响用户访问应用程序的速度。在其他时间段用户访问较少,若下发检测指示信息检测内存泄露,将不会影响用户体验。因此,也可以根据用户访问时间设置筛选条件。
步骤2、判断应用程序的属性信息是否与预设的筛选条件匹配,若是,则执行步骤3,否则执行步骤4。
步骤3,服务器将客户端的应用程序确定为待检测应用程序,并发送检测指示信息至客户端。
步骤4,服务器不发送检测指示信息至客户端。
由于在客户端在启动应用程序时,将应用程序的属性信息发送至服务器,服务器根据应用程序的属性信息判断是否对应用程序进行内存泄露检测,从而实现在不影响用户使用应用程序基础上对客户端的应用程序进行内存泄露检测。
在另一种可能的实施方式中,客户端启动应用程序时,发送应用程序的属性信息至服务器,服务器发送检测指示信息至客户端。
具体地,服务器在接收到应用程序的属性信息时,可以确定客户端的应用程序已启动,说明此时可以监测应用程序中各模块申请和释放内存的情况,因此服务器可以直接发送检测指示信息至客户端,从而实现对每个应用程序进行内存泄露检测。
步骤S202,客户端监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息。
具体地,待检测应用程序启动后,待检测应用程序的进程通过调用加载函数加载模块,其中,模块为实现应用程序的某种的功能的函数集合。客户端通过监测加载函数的调用状态,获得待检测应用程序的进程中当前加载的模块的属性信息。加载函数可以为LdrLoadDll,模块的属性信息包括模块起始地址、模块的大小、模块的程序数据库文件(Program Database File,简称PDB)标识、模块时间戳、模块寿命(Age)、模块PDB路径等。具体实施中,模块的属性信息中模块的PDB标识、模块时间戳、模块寿命(Age)、模块PDB路径是从PE(Portable Executable)文件的头部中获取的。与加载函数LdrLoadDll对应的卸载函数为LdrUnloadDll,待检测应用程序的进程通过调用卸载函数从进程中卸载模块,卸载函数记录模块已经从当前进程中卸载。
步骤S203,客户端监测内存分配函数和内存释放函数的调用状态,获得进程的内存分配信息和内存释放信息。
具体地,待检测应用程序的进程通过调用内存分配函数为进程分配内存,通过调用内存释放函数释放进程中的内存。客户端可以实时监测内存分配函数和内存释放函数的调用状态,通过监测内存分配函数和内存释放函数的调用状态,获得进程中的内存分配信息和内存释放信息。
内存分配信息包括栈回溯信息与被分配内存的对应关系、被分配内存的属性信息,其中,栈回溯信息中包括函数之间的调用关系,被分配内存的属性信息包括被分配的堆地址、堆块地址、堆块的大小。内存释放信息包括栈回溯信息与被释放内存的对应关系、被释放内存的属性信息,其中,栈回溯信息中包括函数之间的调用关系,被释放内存的属性信息包括被释放的堆地址、堆块地址、堆块的大小。
具体实施中,内存分配函数可以为RtlAllocateHeap,内存释放函数可以为RtlFreeHeap。内存分配函数和内存释放函数也可以是RtlAllocateHeap和RtlFreeHeap的上层函数,比如malloc和free、HeapAlloc和HeapFree等。另外,可以使用线程本地存储(Thread Local Storage,简称TLS)解决多线程操作和重入的问题,比如,当MyRtlAllocateHeap函数内部使用到RtlAllocateHeap函数时,MyRtlAllocateHeap函数调用RtlAllocateHeap函数后,RtlAllocateHeap函数会再次调用MyRtlAllocateHeap函数,从而出现死循环,此时,可以采用TLS避免RtlAllocateHeap函数再次调用MyRtlAllocateHeap函数,从而避免栈溢出崩溃的问题。
客户端可以采用Hook技术监控加载函数、内存分配函数和内存释放函数等指定的函数的调用状态。另外,客户端在接收到检测指示信息时,可以先判断之前是否已经采用Hook技术监控过加载函数、内存分配函数和内存释放函数等指定的函数的调用状态,若是,则说明客户端已经对待检测应用程序进行了内存泄露检测,不需要重复检测,因此,可以直接结束进程或者返回已检测的响应信息至服务器。若不是,则采用Hook技术监控过加载函数、内存分配函数和内存释放函数等指定的函数的调用状态,实现对待检测应用程序的内存泄露检测。
步骤S204,客户端将模块的属性信息、内存分配信息以及内存释放信息发送至服务器。
步骤S205,服务器根据内存分配信息和模块的属性信息确定模块中每个函数被分配的内存。
具体地,一个模块中包括多个函数,当进程加载模块时,会调用模块中的函数实现应用程序的功能。内存分配信息中包括栈回溯信息与被分配内存的对应关系,栈回溯信息中包括函数之间的调用关系。即当进程调用模块中的函数时,将该函数的调用记录保存在栈回溯信息中,同时建立栈回溯信息中该函数的调用记录与该函数被分配内存之间的对应关系。服务器在接收到内存分配信息和模块的属性信息时,可以先根据模块的属性信息确定该模块的函数在栈回溯信息中的调用记录,然后根据栈回溯信息与被分配内存的对应关系,得到该模块的函数被调用时分配的内存。
步骤S206,服务器根据内存释放信息和模块的属性信息确定模块中每个函数释放的内存。
具体地,内存释放信息包括栈回溯信息与被释放内存的对应关系,栈回溯信息中包括函数之间的调用关系,即进程结束调用模块中的函数时,将该函数的结束调用记录保存在栈回溯信息中,同时建立栈回溯信息中该函数的结束调用记录与该函数释放的内存之间的对应关系。服务器在接收到内存释放信息和模块的属性信息时,可以先根据模块的属性信息确定该模块的函数在栈回溯信息中的结束调用记录,然后根据栈回溯信息与被释放内存的对应关系,得到该模块的函数结束调用时释放的内存。
步骤S207,服务器根据模块中每个函数被分配的内存和模块中每个函数释放的内存确定模块存在内存泄露的函数。
当进程结束时,为整个进程分配的内存应该与整个进程释放的内存相同,若不相同,则说明进程出现了内存泄露。当进程出现内存泄露时,需要进一步定位进程中内存泄露的原因,即定位出导致内存泄露的具体模块或者模块中的具体函数。本发明实施例中,针对进程中加载的每个模块,服务器确定模块中每个函数被分配的内存和模块中每个函数释放的内存后,将同一函数被分配的内存和释放的内存进行比对,当同一函数被分配的内存和释放的内存相同时,确定该函数不存在内存泄露,否则确定该函数存在内存泄露。通过分析进程中每个模块的函数的内存泄露情况,可以定位出导致进程内存泄露的具体模块以及函数。
由于服务器发送检测指示信息至客户端,使客户端在应用程序运行时监测进程中加载的模块、进程的内存分配信息及进程的内存释放信息,然后返回监测的数据至服务器,服务器对监测的数据进行分析,确定发布后的应用程序是否存在内存泄露问题,从而提高了客户端应用程序的稳定性。其次,通过监测加载函数、分配函数和内存释放函数的调用状态获取检测内存泄露的关键数据,而不需要对客户端的系统内核进行修改,从而简化了检测内存泄露的过程。
可选地,在上述步骤S204中,客户端可以实时将模块的属性信息、内存分配信息以及内存释放信息发送至服务器。也可以先将模块的属性信息、内存分配信息以及内存释放信息保存在日志中,当进程结束时,将日志发送至服务器。具体实施中,可以将日志进行压缩,然后将压缩的日志发送至服务器。另外,也可以定期清理冗余的日志,然后将清理后的日志发送至服务器。
客户端定期清理冗余日志的过程具体为:客户端定期扫描日志中的内存分配信息和内存释放信息。当内存分配信息中被分配内存的属性信息与内存释放信息中被释放内存的属性信息匹配时,删除日志中匹配的被分配内存的属性信息和被释放内存的属性信息。
具体实施中,可以设置清理冗余日志的定时器,比如将定时器的定时时长为10秒,客户端每隔10秒扫描一次日志的内存分配信息和内存释放信息。被分配内存的属性信息和被释放内存的属性信息匹配是指被分配内存和被释放内存是同一块内存,即被分配内存对应的堆地址、堆块地址以及堆块大小与被释放内存对应的堆地址、堆块地址以及堆块大小完全相同。由于当被分配内存和被释放内存是同一块内存时,说明该块内存对应的函数不会存在内存泄露的问题,因此从日志中删除该内存对应的记录时,避免了日志冗余,减少占用的客户端资源。将日志上传至服务器时,也减少占用的服务器带宽。
为了更好的解释本发明实施例,下面结合具体的实施场景描述本发明实施例提供的一种检测内存泄露的方法,该方法由客户端和服务器交互执行,如图3所示,该方法包括以下步骤:
步骤S301,客户端启动应用程序。
客户端预先安装应用程序,用户在需要使用应用程序时,在客户端的界面点击应用程序的图标,客户端启动应用程序。
步骤S302,客户端发送应用程序的属性信息至服务器。
应用程序的属性信息包括应用程序名称(比如微信)、应用程序版本(比如版本7.0.3)、用户标识(比如用户账号)、客户端操作系统版本(比如安卓操作系统)等。
步骤S303,服务器根据应用程序的属性信息确定应用程序为待检测应用程序时,发送检测指示信息至客户端。
服务器可以将客户端发送的应用程序的属性信息与预设的筛选条件进行比较,当应用程序的属性信息是否与预设的筛选条件匹配时,确定应用程序为待检测应用程序,然后发送检测指示信息至客户端。
步骤S304,客户端执行Hook LdrLoadDll和Hook LdrUnloadDll,获取待检测应用程序对应的进程中加载的模块的属性信息。
步骤S305,客户端执行Hook RtlAllocateHeap和Hook RtlFreeHeap,获取进程的内存分配信息和内存释放信息。
客户端在接收到检测指示信息时,可以进一步判断之前是否已经采用执行过HookLdrLoadDll、HookLdrUnloadDll、Hook RtlAllocateHeap、HookRtlFreeHeap,若是,则结束进程,否则执行步骤S304和步骤S305。
步骤S306,客户端将模块的属性信息、内存分配信息和内存释放信息保存至日志中。
模块的属性信息包括模块起始地址、模块的大小、模块的PDB标识、模块时间戳、模块寿命(Age)、模块PDB路径等。内存分配信息包括栈回溯信息与被分配内存的对应关系、被分配内存的属性信息,其中,栈回溯信息中包括函数之间的调用关系,被分配内存的属性信息包括被分配的堆地址、堆块地址、堆块的大小。内存释放信息包括栈回溯信息与被释放内存的对应关系、被释放内存的属性信息,其中,栈回溯信息中包括函数之间的调用关系,被释放内存的属性信息包括被释放的堆地址、堆块地址、堆块的大小。
步骤S307,客户端定期扫描日志中的内存分配信息和内存释放信息。
比如,客户端可以每隔10秒扫描一次日志的内存分配信息和内存释放信息。
步骤S308,当日志中记录的被分配内存的属性信息与被释放内存的属性信息匹配时,删除日志中对应记录。
具体地,当日志中记录的被分配内存的属性信息与被释放内存的属性信息匹配时,说明被分配内存和被释放内存是同一块内存,即被分配内存对应的堆地址、堆块地址以及堆块大小与被释放内存对应的堆地址、堆块地址以及堆块大小完全相同,为了避免了日志冗余,减少占用的客户端资源,删除日志中对应记录。
步骤S309,当进程结束时,客户端将日志发送至服务器。
步骤S310,服务器根据内存分配信息和模块的属性信息确定模块中每个函数被分配的内存。
内存分配信息中包括栈回溯信息与被分配内存的对应关系,栈回溯信息中包括函数之间的调用关系,服务器在接收到内存分配信息和模块的属性信息时,可以先根据模块的属性信息确定该模块的函数在栈回溯信息中的调用记录,然后根据栈回溯信息与被分配内存的对应关系,得到该模块的函数被调用时分配的内存。
步骤S311,服务器根据内存释放信息和模块的属性信息确定模块中每个函数释放的内存。
内存释放信息包括栈回溯信息与被释放内存的对应关系,栈回溯信息中包括函数之间的调用关系,服务器在接收到内存释放信息和模块的属性信息时,可以先根据模块的属性信息确定该模块的函数在栈回溯信息中的结束调用记录,然后根据栈回溯信息与被释放内存的对应关系,得到该模块的函数结束调用时释放的内存。
步骤S312,服务器根据模块中每个函数被分配的内存和模块中每个函数释放的内存确定模块存在内存泄露的函数。
服务器确定模块中每个函数被分配的内存和模块中每个函数释放的内存后,将同一函数被分配的内存和释放的内存进行比对,当同一函数被分配的内存和释放的内存相同时,确定该函数不存在内存泄露,否则确定该函数存在内存泄露。
本发明实施例中,客户端在启动应用程序时,发送应用程序的属性信息至服务器,服务器根据应用程序的属性信息确定应用程序为待检测应用程序时,发送检测指示信息至客户端,否则不发送检测指示信息至客户端,从而避免在用户操作频繁的时候检测内存泄露而影响用户体验。其次,客户端在应用程序运行时监测进程中加载的模块、进程的内存分配信息及进程的内存释放信息,然后返回监测的数据至服务器,服务器对监测的数据进行分析,确定发布后的应用程序是否存在内存泄露问题,从而提高了客户端应用程序的稳定性。另外,通过监测加载函数、分配函数和内存释放函数的调用状态获取检测内存泄露的关键数据,而不需要对客户端的系统内核进行修改,从而简化了检测内存泄露的过程。
基于相同的技术构思,本发明实施例提供了一种客户端,如图4所示,该客户端400包括:
第一接收模块401,用于接收服务器发送的检测指示信息;
监测模块402,用于监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息;监测内存分配函数和内存释放函数的调用状态,获得所述进程的内存分配信息和内存释放信息;
第一处理模块403,用于将所述模块的属性信息、所述内存分配信息以及所述内存释放信息发送至服务器,以使所述服务器根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存,根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存,根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
可选地,所述第一处理模块403具体用于:
将所述模块的属性信息、所述内存分配信息以及所述内存释放信息保存在日志中;
当所述进程结束时,将所述日志发送至服务器。
可选地,所述内存分配信息包括被分配内存的属性信息,所述内存释放信息包括被释放内存的属性信息;
所述第一处理模块403还用于:
定期扫描日志中的内存分配信息和内存释放信息;
当内存分配信息中被分配内存的属性信息与内存释放信息中被释放内存的属性信息匹配时,删除日志中匹配的被分配内存的属性信息和被释放内存的属性信息。
可选地,还包括第一发送模块404;
所述第一发送模块404具体用于:
在启动应用程序时,发送所述应用程序的属性信息至服务器,以使所述服务器根据所述应用程序的属性信息确定所述应用程序为待检测应用程序时,发送检测指示信息至所述客户端。
基于相同的技术构思,本发明实施例提供了一种服务器,如图5所示,该服务器500包括:
第二接收模块501,用于接收客户端发送的待检测应用程序对应的进程中加载的模块的属性信息、待检测应用程序对应的进程的内存分配信息以及待检测应用程序对应的进程的内存释放信息,所述模块的属性信息是所述客户端通过监测加载函数的调用状态获取的,所述内存分配信息是所述客户端通过监测内存分配函数的调用状态获得的,所述内存释放信息是所述客户端通过监测内存释放函数的调用状态获得的;
第二处理模块502,用于根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存;根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存;
分析模块503,用于根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
可选地,所述第二接收模块501还用于,接收所述客户端发送的应用程序的属性信息;
所述第二处理模块502还用于,根据所述应用程序的属性信息判断所述应用程序是否为待检测应用程序;若是,则第二发送模块504发送检测指示信息至所述客户端;否则所述第二发送模块504不发送检测指示信息至所述客户端。
基于相同的技术构思,本发明实施例提供了一种计算机设备,如图6所示,包括至少一个处理器601,以及与至少一个处理器连接的存储器602,本发明实施例中不限定处理器601与存储器602之间的具体连接介质,图6中处理器601和存储器602之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。
在本发明实施例中,存储器602存储有可被至少一个处理器1001执行的指令,至少一个处理器601通过执行存储器602存储的指令,可以执行前述的检测内存泄露的方法中所包括的步骤。
其中,处理器601是计算机设备的控制中心,可以利用各种接口和线路连接计算机设备的各个部分,通过运行或执行存储在存储器602内的指令以及调用存储在存储器602内的数据,从而检测内存泄露。可选的,处理器601可包括一个或多个处理单元,处理器601可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器601中。在一些实施例中,处理器601和存储器602可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。
处理器601可以是通用处理器,例如中央处理器(CPU)、数字信号处理器、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器602作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器602可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(Random AccessMemory,RAM)、静态随机访问存储器(Static Random Access Memory,SRAM)、可编程只读存储器(Programmable Read Only Memory,PROM)、只读存储器(Read Only Memory,ROM)、带电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性存储器、磁盘、光盘等等。存储器602是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器602还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
该计算机设备还包括输入单元603、显示单元604、射频单元605、音频电路606、扬声器607、麦克风608、无线保真(Wireless Fidelity,WiFi)模块609、蓝牙模块610、电源611、外部接口612、耳机插孔613等部件。
输入单元603可用于接收用户启动应用程序的请求等等。例如,输入单元603可包括触摸屏6031以及其它输入设备6032。触摸屏6031可收集用户在其上或附近的触摸操作(比如用户使用手指、关节、触笔等任何适合的物体在触摸屏6031上或在触摸屏6031附近的操作),即触摸屏6031可用于检测触摸压力以及触摸输入位置和触摸输入面积,并根据预先设定的程序驱动相应的连接装置。触摸屏6031可以检测用户对触摸屏6031的触控操作,将触控操作转换为触控信号发送给处理器601,或者理解为可将触控操作的触控信息发送给处理器601,并能接收处理器601发来的命令并加以执行。触控信息至少可以包括压力大小信息和压力持续时长信息中的至少一种。触摸屏6031可以提供计算机设备和用户之间的输入界面和输出界面。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触摸屏6031。除了触摸屏6031,输入单元603还可以包括其它输入设备6032。比如,其它输入设备6032可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元604可用于显示由用户输入的信息或提供给用户的信息。进一步的,触摸屏6031可覆盖显示单元604,当触摸屏6031检测到在其上或附近的触控操作后,传送给处理器601以确定的触控操作的压力信息。在本发明实施例中,触摸屏6031与显示单元604可以集成为一个部件而实现计算机设备的输入、输出、显示功能。为便于描述,本发明实施例以触摸屏6031代表触摸屏6031和显示单元604的功能集合为例进行示意性说明,当然在某些实施例中,触摸屏6031与显示单元604也可以作为两个独立的部件。
当显示单元604和触摸板以层的形式彼此叠加以形成触摸屏6031时,显示单元604可以用作输入装置和输出装置,在作为输出装置时,可以用于显示图像,例如显示目标应用程序的安装界面。显示单元604可以包括液晶显示器(Liquid Crystal Display,LCD)、薄膜晶体管液晶显示器(Thin Film Transistor Liquid Crystal Display,TFT-LCD)、有机发光二极管(Organic Light Emitting Diode,OLED)显示器、有源矩阵有机发光二极体(Active Matrix Organic Light Emitting Diode,AMOLED)显示器、平面转换(In-PlaneSwitching,IPS)显示器、柔性显示器、3D显示器等等中的至少一种。这些显示器中的一些可以被构造为透明状以允许用户从外部观看,这可以称为透明显示器,根据特定想要的实施方式,计算机设备可以包括两个或更多显示单元。
射频单元605可用于收发信息或通话过程中信号的接收和发送。通常,射频电路包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(Low NoiseAmplifier,LNA)、双工器等。此外,射频单元605还可以通过无线通信与网络设备和其它设备通信。无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(GlobalSystem of Mobile communication,GSM)、通用分组无线服务(General Packet RadioService,GPRS)、码分多址(Code Division Multiple Access,CDMA)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、长期演进(Long Term Evolution,LTE)、电子邮件、短消息服务(Short Messaging Service,SMS)等。
音频电路606、扬声器607、麦克风608可提供用户与计算机设备之间的音频接口。音频电路606可将接收到的音频数据转换后的电信号,传输到扬声器607,由扬声器607转换为声音信号输出。另一方面,麦克风608将收集的声音信号转换为电信号,由音频电路606接收后转换为音频数据,再将音频数据输出处理器601处理后,经射频单元605以发送给比如另一电子设备,或者将音频数据输出至存储器602以便进一步处理,音频电路也可以包括耳机插孔613,用于提供音频电路和耳机之间的连接接口。
WiFi属于短距离无线传输技术,计算机设备通过WiFi模块609可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图6示出了WiFi模块609,但是可以理解的是,其并不属于计算机设备的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
蓝牙是一种短距离无线通讯技术。利用蓝牙技术,能够有效地简化掌上电脑、笔记本电脑和手机等移动通信计算机设备之间的通信,也能够成功地简化以上这些设备与因特网(Internet)之间的通信,计算机设备通过蓝牙模块610使计算机设备与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙技术是能够实现语音和数据无线传输的开放性方案。虽然图6示出了WiFi模块609,但是可以理解的是,其并不属于计算机设备的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
计算机设备还可以包括电源611(比如电池),其用于接收外部电力为计算机设备内的各个部件供电。优选的,电源611可以通过电源管理系统与处理器601逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
计算机设备还可以包括外部接口612,该外部接口612可以包括标准的Micro USB接口,也可以包括多针连接器,可以用于连接计算机设备与其它设备进行通信,也可以用于连接充电器为计算机设备充电。
尽管未示出,计算机设备还可以包括摄像头、闪光灯等其它可能的功能模块,在此不再赘述。
基于同一发明构思,本发明实施例提供了一种计算机可读存储介质,其存储有可由计算机设备执行的计算机程序,当所述程序在计算机设备上运行时,使得所述计算机设备执行检测内存泄露的方法的步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (10)

1.一种检测内存泄露的方法,其特征在于,包括:
客户端启动待检测应用程序,所述待检测应用程序为已发布的应用程序;
在接收到服务器发送的检测指示信息时,监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息;
针对所述模块中的每个函数,通过所述进程调用所述函数,并将所述函数的调用记录保存在栈回溯信息中;
通过所述进程调用内存分配函数为所述函数分配内存,并建立所述函数的调用记录与所述函数被分配的内存之间的对应关系;
通过所述进程结束调用所述函数,并将所述函数的结束调用记录保存在栈回溯信息中;
通过所述进程调用内存释放函数释放所述函数占用的内存,并建立所述函数的结束调用记录与所述函数释放的内存之间的对应关系;
监测内存分配函数和内存释放函数的调用状态,获得所述进程的内存分配信息和内存释放信息,所述内存分配信息包括所述栈回溯信息中各函数与相应被分配的内存之间的对应关系,所述内存释放信息包括所述栈回溯信息中各函数与相应释放的内存之间的对应关系;
将所述模块的属性信息、所述内存分配信息以及所述内存释放信息发送至服务器,以使所述服务器根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存,根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存,根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
2.如权利要求1所述的方法,其特征在于,所述将所述模块的属性信息、所述内存分配信息以及所述内存释放信息发送至服务器,包括:
将所述模块的属性信息、所述内存分配信息以及所述内存释放信息保存在日志中;
当所述进程结束时,将所述日志发送至服务器。
3.如权利要求2所述的方法,其特征在于,所述内存分配信息包括被分配内存的属性信息,所述内存释放信息包括被释放内存的属性信息;
所述当所述进程结束时,将所述日志发送至服务器之前,还包括:
定期扫描日志中的内存分配信息和内存释放信息;
当内存分配信息中被分配内存的属性信息与内存释放信息中被释放内存的属性信息匹配时,删除日志中匹配的被分配内存的属性信息和被释放内存的属性信息。
4.如权利要求1至3任一所述的方法,其特征在于,所述客户端在接收检测指示信息之前,还包括:
客户端启动应用程序时,发送所述应用程序的属性信息至服务器,以使所述服务器根据所述应用程序的属性信息确定所述应用程序为待检测应用程序时,发送检测指示信息至所述客户端。
5.一种检测内存泄露的方法,其特征在于,包括:
服务器接收客户端发送的待检测应用程序对应的进程中加载的模块的属性信息、待检测应用程序对应的进程的内存分配信息以及待检测应用程序对应的进程的内存释放信息;
所述模块的属性信息是所述客户端通过监测加载函数的调用状态获取的,所述内存分配信息是所述客户端通过监测内存分配函数的调用状态获得的,所述内存释放信息是所述客户端通过监测内存释放函数的调用状态获得的;
所述待检测应用程序为已发布的应用程序;所述内存分配信息包括保存在栈回溯信息中的所述模块的各函数与相应被分配的内存之间的对应关系,所述内存释放信息包括保存在栈回溯信息中的所述模块的各函数与相应释放的内存之间的对应关系;针对每个函数,所述函数与相应被分配的内存之间的对应关系是所述客户端通过所述进程调用所述函数,并将所述函数的调用记录保存在栈回溯信息后建立的;所述函数与相应释放的内存之间的对应关系是所述客户端通过所述进程结束调用所述函数,并将所述函数的结束调用记录保存在栈回溯信息后建立的;
根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存;
根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存;
根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
6.如权利要求5所述的方法,其特征在于,还包括:
接收所述客户端发送的应用程序的属性信息;
根据所述应用程序的属性信息判断所述应用程序是否为待检测应用程序;
若是,则发送检测指示信息至所述客户端;
否则不发送检测指示信息至所述客户端。
7.一种客户端,其特征在于,包括:
第一接收模块,用于启动待检测应用程序,接收服务器发送的检测指示信息,所述待检测应用程序为已发布的应用程序;
监测模块,用于监测加载函数的调用状态,获取待检测应用程序对应的进程中当前加载的模块的属性信息;
第一处理模块,用于针对所述模块中的每个函数,通过所述进程调用所述函数,并将所述函数的调用记录保存在栈回溯信息中;通过所述进程调用内存分配函数为所述函数分配内存,并建立所述函数的调用记录与所述函数被分配的内存之间的对应关系;通过所述进程结束调用所述函数,并将所述函数的结束调用记录保存在栈回溯信息中;通过所述进程调用内存释放函数释放所述函数占用的内存,并建立所述函数的结束调用记录与所述函数释放的内存之间的对应关系;
所述监测模块,还用于监测内存分配函数和内存释放函数的调用状态,获得所述进程的内存分配信息和内存释放信息,所述内存分配信息包括所述栈回溯信息中各函数与相应被分配的内存之间的对应关系,所述内存释放信息包括所述栈回溯信息中各函数与相应释放的内存之间的对应关系;
所述第一处理模块,还用于将所述模块的属性信息、所述内存分配信息以及所述内存释放信息发送至服务器,以使所述服务器根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存,根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存,根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
8.一种服务器,其特征在于,包括:
第二接收模块,用于接收客户端发送的待检测应用程序对应的进程中加载的模块的属性信息、待检测应用程序对应的进程的内存分配信息以及待检测应用程序对应的进程的内存释放信息,所述模块的属性信息是所述客户端通过监测加载函数的调用状态获取的,所述内存分配信息是所述客户端通过监测内存分配函数的调用状态获得的,所述内存释放信息是所述客户端通过监测内存释放函数的调用状态获得的;所述待检测应用程序为已发布的应用程序;所述内存分配信息包括保存在栈回溯信息中的所述模块的各函数与相应被分配的内存之间的对应关系,所述内存释放信息包括保存在栈回溯信息中的所述模块的各函数与相应释放的内存之间的对应关系;针对每个函数,所述函数与相应被分配的内存之间的对应关系是所述客户端通过所述进程调用所述函数,并将所述函数的调用记录保存在栈回溯信息后建立的;所述函数与相应释放的内存之间的对应关系是所述客户端通过所述进程结束调用所述函数,并将所述函数的结束调用记录保存在栈回溯信息后建立的;
第二处理模块,用于根据所述内存分配信息和所述模块的属性信息确定所述模块中每个函数被分配的内存;根据所述内存释放信息和所述模块的属性信息确定所述模块中每个函数释放的内存;
分析模块,用于根据所述模块中每个函数被分配的内存和所述模块中每个函数释放的内存确定所述模块存在内存泄露的函数。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1~4或5~6任一权利要求所述方法的步骤。
10.一种计算机可读存储介质,其特征在于,其存储有可由计算机设备执行的计算机程序,当所述程序在计算机设备上运行时,使得所述计算机设备执行权利要求1~4或5~6任一所述方法的步骤。
CN201910344979.7A 2019-04-26 2019-04-26 一种检测内存泄露的方法、客户端及服务器 Active CN111858112B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910344979.7A CN111858112B (zh) 2019-04-26 2019-04-26 一种检测内存泄露的方法、客户端及服务器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910344979.7A CN111858112B (zh) 2019-04-26 2019-04-26 一种检测内存泄露的方法、客户端及服务器

Publications (2)

Publication Number Publication Date
CN111858112A CN111858112A (zh) 2020-10-30
CN111858112B true CN111858112B (zh) 2023-04-25

Family

ID=72951343

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910344979.7A Active CN111858112B (zh) 2019-04-26 2019-04-26 一种检测内存泄露的方法、客户端及服务器

Country Status (1)

Country Link
CN (1) CN111858112B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112860574B (zh) * 2021-03-15 2024-02-20 北京车和家信息技术有限公司 Linux内核的内存泄漏检测方法和装置、介质、设备
CN113448735A (zh) * 2021-07-16 2021-09-28 维沃移动通信有限公司 内存泄露处理方法、装置和电子设备
CN113722133B (zh) * 2021-07-28 2023-05-26 苏州浪潮智能科技有限公司 一种内存泄漏检测方法、装置及设备
CN117453446B (zh) * 2023-12-15 2024-04-26 荣耀终端有限公司 一种内存泄露定位的辅助信息获取方法及电子设备

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101814049A (zh) * 2010-03-23 2010-08-25 北京大学 一种内存泄漏探测方法
CN101908018A (zh) * 2010-07-20 2010-12-08 北京海泰方圆科技有限公司 一种判断内存泄露的系统及方法
CN102831068A (zh) * 2011-06-13 2012-12-19 阿里巴巴集团控股有限公司 一种内存操作记录的处理方法及装置
CN106055478A (zh) * 2016-05-31 2016-10-26 腾讯科技(深圳)有限公司 检测内存泄漏的方法和装置
CN108664394A (zh) * 2018-04-10 2018-10-16 北京奇安信科技有限公司 一种内存泄露过程追溯方法及装置
CN109150642A (zh) * 2017-06-16 2019-01-04 腾讯科技(深圳)有限公司 应用内存错误检测方法、检测装置及存储介质

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101763305B (zh) * 2009-12-29 2011-12-14 青岛海信宽带多媒体技术有限公司 一种嵌入式系统内存泄露的检测方法
CN103455424B (zh) * 2013-09-18 2015-12-02 哈尔滨工业大学 基于VxWorks操作系统的动态内存泄漏检测方法及装置
CN105224433B (zh) * 2014-06-23 2018-04-10 阿里巴巴集团控股有限公司 一种内存监控方法及服务器
CN104866409A (zh) * 2015-05-29 2015-08-26 小米科技有限责任公司 内存泄露监控方法和装置
CN107066390B (zh) * 2017-04-24 2020-01-17 许继集团有限公司 一种动态内存泄漏检测方法及系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101814049A (zh) * 2010-03-23 2010-08-25 北京大学 一种内存泄漏探测方法
CN101908018A (zh) * 2010-07-20 2010-12-08 北京海泰方圆科技有限公司 一种判断内存泄露的系统及方法
CN102831068A (zh) * 2011-06-13 2012-12-19 阿里巴巴集团控股有限公司 一种内存操作记录的处理方法及装置
CN106055478A (zh) * 2016-05-31 2016-10-26 腾讯科技(深圳)有限公司 检测内存泄漏的方法和装置
CN109150642A (zh) * 2017-06-16 2019-01-04 腾讯科技(深圳)有限公司 应用内存错误检测方法、检测装置及存储介质
CN108664394A (zh) * 2018-04-10 2018-10-16 北京奇安信科技有限公司 一种内存泄露过程追溯方法及装置

Also Published As

Publication number Publication date
CN111858112A (zh) 2020-10-30

Similar Documents

Publication Publication Date Title
CN111858112B (zh) 一种检测内存泄露的方法、客户端及服务器
CN108959000B (zh) 一种服务器压力测试方法、系统及终端
CN108415739B (zh) 一种动态链接库函数的钩挂方法、装置和存储介质
JP7006780B2 (ja) システムサービスタイムアウト処理方法および装置
EP3531290A1 (en) Data backup method, apparatus, electronic device, storage medium, and system
US20190205147A1 (en) Application running method and device
CN110968508B (zh) 一种小程序的加载时间确定方法、装置、终端及存储介质
CN109002547B (zh) 日志文件存储方法、移动终端及计算机可读存储介质
CN111966491B (zh) 统计占用内存的方法及终端设备
CN104133761A (zh) 一种移动终端的内存占用分析方法、装置和系统
CN108984374B (zh) 一种数据库性能的测试方法和系统
CN107908492B (zh) 黑屏检测方法、移动终端及计算机可读存储介质
CN107360317B (zh) 应用程序资源泄露的检测方法及移动终端、存储介质
CN107015866B (zh) 一种数据处理方法及装置
CN104809054A (zh) 实现程序测试的方法和系统
CN110765085A (zh) 日志信息写入方法、系统、存储介质及移动终端
CN108052430B (zh) 移动终端重启定位方法、移动终端及计算机可读存储介质
EP3129883B1 (en) Method and apparatus for repairing dynamic link library file
CN108089937B (zh) 基于直接内存分配的重启定位方法、移动终端及存储介质
CN105278942B (zh) 组件管理方法及装置
CN107766351B (zh) 文件目录的识别方法及装置
CN106709330B (zh) 记录文件执行行为的方法及装置
CN108228423B (zh) 移动终端重启定位方法、移动终端及计算机可读存储介质
CN113687942B (zh) 检测方法、装置及电子设备
CN104717283A (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