CN113297074A - 一种内存跟踪方法及装置 - Google Patents

一种内存跟踪方法及装置 Download PDF

Info

Publication number
CN113297074A
CN113297074A CN202110558235.2A CN202110558235A CN113297074A CN 113297074 A CN113297074 A CN 113297074A CN 202110558235 A CN202110558235 A CN 202110558235A CN 113297074 A CN113297074 A CN 113297074A
Authority
CN
China
Prior art keywords
memory
tracking
tested
function
monitoring
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
CN202110558235.2A
Other languages
English (en)
Other versions
CN113297074B (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.)
Bigo Technology Pte Ltd
Original Assignee
Bigo Technology Pte 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 Bigo Technology Pte Ltd filed Critical Bigo Technology Pte Ltd
Priority to CN202110558235.2A priority Critical patent/CN113297074B/zh
Publication of CN113297074A publication Critical patent/CN113297074A/zh
Application granted granted Critical
Publication of CN113297074B publication Critical patent/CN113297074B/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/3636Software debugging by tracing the execution of the program
    • 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

Landscapes

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

Abstract

本申请公开了一种内存跟踪方法及装置,应用于部署有被测进程的实例的主机上,主机与外部设备连接,主机包括监控进程以及内存跟踪进程;该方法包括:通过监控进程接收外部设备下发的被测进程的名称,被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程;监控进程根据被测进程的名称,获取被测进程在本机的内存资源数据;当监控进程根据内存资源数据确定被测进程在本机疑似存在内存泄露时,则启动内存跟踪进程;由内存跟踪进程调用进程跟踪ptrace函数对被测进程进行内存跟踪,该内存跟踪无需修改被测进程的现有代码逻辑,从而实现对被测进行的非侵入式的、实时的内存跟踪和内存泄露检测,提高内存泄漏排查的效率。

Description

一种内存跟踪方法及装置
技术领域
本申请实施例涉及内存检测技术领域,尤其涉及一种内存跟踪方法及装置。
背景技术
随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂,开发人员在程序实现的过程中处理的变量也大量增加,如何有效进行内存分配和释放,防止内存泄漏(Memory Leak)的问题变得越来越突出。其中,内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。
在相关技术中,有如下几种内存泄露检测工具:
一种是Valgrind,Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind中包含的最常用的工具是Memcheck,Memcheck用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。但是,在日常线上系统里面,由于某些内存泄漏不是必现行为,假定发生的概率只有1%,那么部署有1000个实例,可能只有10个实例会发生泄漏。而发生泄漏的时机也不确定,可能受到业务场景以及相应的触发条件才能触发。此时如果大范围使用Valgrind去启动线上进程来进行内存泄露追踪,例如如果1000个实例都进行实时监控,则会导致整个系统耗费比较大,并对业务运行产生严重的影响。而如果不实时进行监控,则不能判断具体哪些实例会产生内存泄漏。并且Valgrind的采样次数有限(上限是一千万次),如果超过采样次数后Valgrind便不再收集数据。
另一种是堆分配工具massif,massif通过监测进程在堆上分配的内存数量来判断是否存在内存泄漏的可能。然而massif有个比较大的缺陷是其需要通过valgrind启动并监控内存分配与释放,导致性能受损。
还有一种方式是对malloc()/free()/new/delete进行接管,在运行过程中通过记录内存分配与释放的数量并进行对比,来判断是否存在泄漏的可能,但是这种方式对于现有代码的侵入比较大,且影响运行效率。
发明内容
本申请提供一种内存跟踪方法及装置,以解决现有的内存泄露检测存在的对于被测进程的现有代码的侵入大、检测效率低、大规模内存泄露检测导致的系统耗费大等问题。
第一方面,本申请实施例提供了一种内存跟踪方法,所述方法应用于部署有被测进程的实例的主机上,所述主机与外部设备连接,所述主机包括监控进程以及内存跟踪进程;所述方法包括:
通过所述监控进程接收所述外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程;
所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据;
当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动所述内存跟踪进程;
由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪。
第二方面,本申请实施例还提供了一种内存跟踪装置,所述装置位于部署有被测进程的实例的主机上,所述主机与外部设备连接,所述主机包括监控进程以及内存跟踪进程;所述装置包括:
被测进程名称接收模块,用于通过所述监控进程接收所述外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程;
内存资源数据获取模块,用于由所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据;
内存跟踪进程启动模块,用于当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动所述内存跟踪进程;
内存跟踪模块,用于由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪。
第三方面,本申请实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述的方法。
第四方面,本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的方法。
本申请具有如下有益效果:
在本实施例中,针对大规模部署实例的场景,对于每个实例所在的主机都设置有监控进程以及内存跟踪进程,各主机通过监控进程接收外部设备下发的、疑似发生内存泄露的、需要进行内存跟踪的被测进程的名称。当监控进程根据该被测进程在本机的内存资源数据确定被测进程疑似存在内存泄露时,则启动本机的内存跟踪进程,由内存跟踪进程调用进程跟踪ptrace函数构造中断的方式对被测进程进行实时的内存跟踪。整个跟踪过程无需修改被测进程的现有代码逻辑,从而实现对被测进行的非侵入式的、实时的内存跟踪和内存泄露检测,提高内存泄漏排查的效率,方便大规模部署在生成环境中使用。
附图说明
图1是本申请实施例一提供的一种内存跟踪方法实施例的流程图;
图2是本申请实施例一提供的内存占用示例的示意图;
图3是本申请实施例二提供的一种内存跟踪方法实施例的流程图;
图4是本申请实施例三提供的一种内存跟踪装置实施例的结构框图;
图5是本申请实施例四提供的一种电子设备的结构示意图。
具体实施方式
下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本申请,而非对本申请的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本申请相关的部分而非全部结构。
内存泄漏在服务器C++进程中比较常见但是不好解决,体现在:1、不好追踪,因为往往发现时内存泄漏已经成既定现实,而不是正在发生泄漏;2、发生内存泄漏一般是累积超过一定阈值后才会触发向系统申请内存,因此实际上持续申请内存的过程时间比较短。
在大范围部署的情况下,同时随着业务场景相关的偶现情况去跟踪内存泄漏情况更是异常困难。此类问题会困扰线上业务系统花费较长的时间去跟进、复现、debug(排除故障)。有些场景下,经过长时间无法解决的问题只能被动的定期重启进程来作为workaround(应变方法),某些情况下业务服务还会受到影响。
基于此,本申请通过如下实施例来描述针对大规模部署的非侵入式动态监控、并实时监控追踪内存泄漏的解决方案,来解决内存泄漏处理难题,从而提高解决问题的效率和生产力。
实施例一
图1为本申请实施例一提供的一种内存跟踪方法实施例的流程图,本实施例可以应用于部署有被测进程的实例的主机上,在本申请实施例中,各主机可以预先配置有监控进程以及内存跟踪进程。监控进程用于监控本主机上运行的各个进程的内存使用情况,而内存跟踪进程则用于根据指令对存在内存泄露嫌疑的进程进行内存跟踪。在一种实现中,各主机还可以与进程发布系统连接,接收进程发布系统统一发布的监控进程以及内存跟踪进程的安装包,并根据安装包在本机中安装监控进程以及内存跟踪进程。
在本实施例中,主机可以通过监控进程与外部设备连接。在一种可能的场景中,假设被测进程有1000个实例,每个实例部署在一台主机上,则有1000台主机,外部设备可以分别与这1000台主机连接,从而实现外部设备与各主机的数据交互。其中,外部设备可以包括用于进行数据配置的服务器(或称为配置服务器或配置中心)。
本实施例具体可以包括如下步骤:
步骤110,通过所述监控进程接收所述外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程。
在一种实施例中,当外部设备检测到某个进程可能发生内存泄露时,可以将该进程作为被测进程,并将该被测进程的名称下发到部署有该进程的实例的所有主机中。各主机通过监控进程接收外部设备下发的被测进程的名称,并在本机对该被测进程进行监控或内存跟踪。
在一种可能的实现中,外部设备可以通过预设的内存泄露检测逻辑来检测各个进程,以确定可能发生内存泄露的被测进程。而该内存泄露检测逻辑可以在外部设备本地运行并获得检测结果(如疑似发生内存泄露的进程名称),也可以由其他设备运行并将获得的检测结果发送至外部设备,本实施例对此不作限定。另外,本实施例也不对具体的内存泄露检测逻辑进行限定,只要能发现存在内存泄露嫌疑的进程即可。例如,如图2所示,如果某个进程的占用内存呈阶梯状递增,表示该进程的内存占用不断增加,但没有内存释放的情况,则可以认为该进程存在内存泄露嫌疑,那么就可以跟踪该进程,外部设备可以将该进程的名称下发到部署有该进程实例的各个主机中进行监控或跟踪。被测进程又可以称为需要跟踪的进程,可以用MemTracee表示。
在其他实施例中,被测进程的名称还可以由用户通过外部设备直接指定,例如,若用户想要了解某个进程是否存在内存泄露,则可以在外部设备中直接指定该进程作为被测进程,然后由外部设备将该被测进程的名称下发到部署有该进程的实例的所有主机中。
步骤120,所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据。
在该步骤中,监控进程接收到外部设备发送的被测进程的名称以后,可以在本机中对该被测进程进行内存监控,以实时获取该被测进程在本机中的内存资源数据。
在一种实施方式中,步骤120进一步可以包括如下步骤:
步骤120-1,所述监控进程根据所述被测进程的名称确定所述被测进程的进程ID。
进程ID,即PID(Process Identification,进程标识符),是操作系统为每个运行的进程分配的唯一编号。
根据进程的名称确定进程PID的方式有很多,本实施例对此不作限定,例如,可以通过grep(如ps-elf|grep MemTracee命令)来获取被测进程的PID。
步骤120-2,按照预设时间间隔从文件系统中获取所述进程ID对应的物理内存资源值,作为所述被测进程在本机的内存资源数据。
示例性地,文件系统可以包括proc文件系统,对应于Linux系统上的/proc目录,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息。在实现时,物理内存资源值即RSS(Resident Set Size),用于表示进程使用了多少RAM(Random AccessMemory,随机存取存储器)中的物理内存。监控进程可以通过/proc/pid/status来查找当前进程的状态信息,并从该状态信息中查找出物理内存资源值VmRss作为被测进程在本机的内存资源数据。
其中,预设时间间隔可以根据实际业务需求确定,本实施例对此不作限定,例如,预设时间间隔可以设定为1秒,即每秒获取被测进程所在的/proc/pid/status里面的VmRss数值。
步骤130,当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动所述内存跟踪进程。
在该步骤中,当监控进程按照预设时间间隔获得被测进程在本机的内存资源数据以后,可以对获得的内存资源数据进行分析,从而判断被测进程在本机中是否疑似存在内存泄露。
在一种实施方式中,监控进程可以采用如下方式来确定被测进程是否疑似存在内存泄露:计算相邻两个物理内存资源值的差值;若连续多个差值呈现递增状态,则判定所述被测进程疑似存在内存泄露。
例如,每获得一个VmRss数值以后,可以计算当前VmRss数值与上一秒获得的VmRss数值的差值,然后分析多个差值,如果多个差值是递增的,则监控进程可以判定该被测进程在本机中发生连续内存增加,则可以初步确定被测进程在本机存在内存泄露嫌疑。
当监控进程确定被测进程在本机存在内存泄露嫌疑,则启动本机的内存跟踪进程(又可以称为MemTracer),并通知MemTracer需要进行内存跟踪的被测进程的PID。
步骤140,由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪。
在该步骤中,MemTracer可以通过调用进程跟踪ptrace函数来对被测进程MemTracee进行内存跟踪。当MemTracer使用被测进程MemTracee的PID调用ptrace函数时,相当于MemTracee成为MemTracer的子进程,而MemTracer是父进程。ptrace提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像(包括寄存器)的值。其基本原理是:当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED。而父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行。
在本实施例中,针对大规模部署实例的场景,对于每个实例所在的主机都设置有监控进程以及内存跟踪进程,各主机通过监控进程接收外部设备下发的、疑似发生内存泄露的、需要进行内存跟踪的被测进程的名称。当监控进程根据该被测进程在本机的内存资源数据确定被测进程在本机疑似存在内存泄露时,则启动本机的内存跟踪进程,由内存跟踪进程调用进程跟踪ptrace函数构造中断的方式对被测进程进行实时的内存跟踪。整个跟踪过程无需修改被测进程的现有代码逻辑,从而实现对被测进行的非侵入式的、实时的内存跟踪和内存泄露检测,提高内存泄漏排查的效率,方便大规模部署在生成环境中使用。
实施例二
图3为本申请实施例二提供的一种内存跟踪方法实施例的流程图,本实施例在实施例一的基础上,对内存跟踪的过程进行更具体的说明。如图3所示,本实施例可以包括如下步骤:
步骤310,通过监控进程接收外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程。
步骤320,所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据。
步骤330,当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动内存跟踪进程。
步骤340,由所述内存跟踪进程获取所述被测进程的多个动态内存函数的函数地址,并记录所述函数地址。
动态内存函数可以包括申请动态内存的函数和释放内存的函数。示例性地,动态内存函数可以包括但不限于如下函数的一种或结合:malloc函数、free函数、calloc函数、realloc函数、new函数、delete函数等。
在一种实现中,内存跟踪进程MemTracer在获得被测进程MemTracee的PID以后,可以通过该PID获取MemTracee的BIN文件,然后从BIN文件的符号表中查找出各动态内存函数的函数地址并记录下来。
步骤350,调用ptrace系统接口建立所述内存跟踪进程与所述被测进程的跟踪关系。
在实现时,MemTracer可以调用ptrace(PTRACE_ATTACH,pid,...)接口来将MemTracer附到(attach)MemTracee上,以建立MemTracer与MemTracee的跟踪关系,即利用PTRACE_ATTACH,使MemTracer变成MemTracee的父进程。
步骤360,将各函数地址对应位置中的指令替换为指定中断指令。
在该步骤中,MemTracer可以使用断点原理,在MemTracee中设置断点。在一种实现中,MemTracer可以借鉴gdb中使用的单步跟踪思路,采用如下命令,将步骤340中记录的函数地址对应位置中的指令替换为指定中断指令(INT3),操作码是0xCC:
ptrace(PTRACE_POKETEXT,tracee_pid,symbolAddr,0xCC);
其中,symbolAddr是动态内存函数的函数地址。
步骤370,监听所述指定中断指令被执行时生成的中断信号。
具体的,当MemTracee需要内存分配操作时,则会运行对应的指定中断指令,从而触发中断,产生中断信号(又可以称为SIGTRAP信号),这个SIGTRAP信号会被MemTracer捕获。对于MemTracer而言,当其设置了断点以后,就会一直监听MemTracee的SIGTRAP信号。
步骤380,当监听到所述中断信号时,确定触发所述中断信号的目标内存分配操作。
在该步骤中,当MemTracer捕获到SIGTRAP信号以后,则可以对该SIGTRAP信号进行分析,以确定MemTracee是执行哪一种内存分配操作导致的中断,从而触发该中断信号。
在一种实施方式中,步骤380进一步可以包括如下步骤:
步骤380-1,通过信号处理函数从所述中断信号中提取发生中断时的现场信息,所述现场信息包括寄存器值。
在该步骤中,MemTracer捕获到SIGTRAP信号以后,则对SIGTRAP信号进行处理。在一种实现中,MemTracer可以通过信号处理函数sighandler来对SIGTRAP信号进行处理,sighandler可以返回发生中断时的现场信息。
示例性地,该现场信息可以包括发生中断时的寄存器值,该寄存器值可以包括要执行的指令位置RIP值。
步骤380-2,根据所述寄存器值确定触发中断的指令地址。
在该实施例中,RIP值是程序执行的下一条指令地址,则对RIP减1操作就可以得到触发中断对应的指令地址(对应的函数地址)。
步骤380-3,从记录的函数地址中匹配所述指令地址,以获得触发所述中断信号的目标动态内存函数,并将所述目标动态内存函数对应的内存分配操作作为目标内存分配操作。
在该步骤中,当获得触发中断对应的指令地址以后,可以在所记录的函数地址中匹配该指令地址,并将匹配成功的函数地址对应的动态内存函数作为目标动态内存函数,然后将该目标动态内存函数对应的内存分配操作作为目标内存分配操作。
步骤390,采用所述目标内存分配操作对应的接管函数、来执行所述目标内存分配操作对应的目标动态内存函数。
在该实施例中,内存跟踪进程MemTracer中可以设置有各动态内存函数对应的接管函数,该接管函数用于执行对应的动态内存函数,以及,记录各动态内存函数分配的内存大小、分配内存的时间以及调用栈。例如,对于malloc函数、free函数、calloc函数、realloc函数,在MemTracer中会设置对应的接管函数,分别是hack_malloc函数、hack_free函数、hack_calloc函数、hack_realloc函数。其中,hack_malloc函数会执行正常的malloc函数,同时会记录该函数分配的内存大小、分配内存的时间以及调用栈等信息,其他的接管函数也同理。
为了确保MemTracee功能的正常执行,当找到触发中断信号的目标内存分配操作以后,可以采用MemTracer中的该目标内存分配操作对应的接管函数、来执行该目标内存分配操作对应的目标动态内存函数。例如,如果目标内存分配操作为malloc操作,则可以采用hack_malloc函数来执行该malloc操作对应的malloc函数。
步骤3110,获取所述目标内存分配操作对应的调用栈,并记录所述调用栈。
在一种实施方式中,可以通过调用unwind库来获取目标内存分配操作对应的调用栈。具体的,在实现时,根据步骤380-2可以知道触发中断对应的RIP值,然后通过调用unwind库可以获取该RIP值对应的完整的调用栈(callstack)。
步骤3120,当内存跟踪时间到期时,停止所述内存跟踪进程对所述被测进程的内存跟踪。
步骤340-步骤3110的过程可以看作是MemTracer对MemTracee的内存跟踪过程,由于执行ptrace系统调用会影响MemTracee的执行性能,因此需要在尽量短的时间内完成trace(内存跟踪),对此,本实施例设定了内存跟踪时间。在该内存跟踪时间内,MemTracer对MemTracee进行内存跟踪。当内存跟踪时间到期时,则MemTracer停止对MemTracee的内存跟踪。
在一种实施方式中,步骤3120进一步可以包括如下步骤:
步骤3120-1将各函数地址对应位置中的所述指定中断指令替换回原有的指令。
当内存跟踪结束以后,则需要恢复MemTracee的现场信息,包括将各函数地址对应位置中的指定中断指令替换回原有的指令。
步骤3120-2,解除所述内存跟踪进程与所述被测进程的跟踪关系。
在实现时,MemTracer可以调用ptrace(PTRACE_DETACH,pid,...)接口来解除MemTracer对MemTracee的跟踪关系。
步骤3130,汇总记录的所述调用栈,生成分析报告,并输出所述分析报告。
在实现时,上述汇总包括,对相同的调用栈进行合并。然后,计算各调用栈的分配内存大小以及释放内存大小,得到汇总结果,并针对汇总结果生成分析报告并输出,以便于后续对该分析报告进一步分析。
示例性地,分析报告中可以包括如下信息:各调用栈对应的动态内存函数的函数名称及函数地址、分配内存的次数、内存累计大小、释放内存大小、未被释放内存大小、超期未被释放的内存大小等。
其中,上述超期未被释放的内存大小中的超期是指超过预设的泄露临界时长。具体的,由于有些内存分配到释放是需要一定的时间的,例如某些业务进程使用内存保存一些消息处理信息,待消息处理完毕后,再进行free,这个时间有时候会伴随着整个业务进程生命周期,有的则可能只保持数秒便释放。因此,本实施例可以设定一个判断泄漏的泄露临界时长minLeakTime,如果未被释放内存的时间超过了这个minLeakTime,便认为该内存为超期未被释放的内存,而超期未被释放的内存认为有泄漏嫌疑。
在本实施例中,内存跟踪进程调用进程跟踪ptrace函数构造中断的方式对被测进程进行实时的内存跟踪,并获取触发中断的目标内存分配操作对应的调用栈以及记录对应的调用栈。当内存跟踪结束以后,则可以根据记录的调用栈进行汇总生成分析报告,分析报告中包含了各调用栈对应的动态内存函数的函数名称及函数地址、分配内存的次数、内存累计大小、释放内存大小、未被释放内存大小、超期未被释放的内存大小等,从而可以便于快速确定本机中由超期未被释放的内存大小确定的内存泄露,提高内存泄露检测的效率。
实施例三
图4为本申请实施例三提供的一种内存跟踪装置实施例的结构框图,所述装置位于部署有被测进程的实例的主机上,所述主机与外部设备连接,所述主机包括监控进程以及内存跟踪进程;所述装置可以包括如下模块:
被测进程名称接收模块410,用于通过所述监控进程接收所述外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程;
内存资源数据获取模块420,用于由所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据;
内存跟踪进程启动模块430,用于当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动所述内存跟踪进程;
内存跟踪模块440,用于由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪。
在一种实施例中,所述内存跟踪模块440可以包括如下子模块:
函数地址获取子模块,用于由所述内存跟踪进程获取所述被测进程的多个动态内存函数的函数地址,并记录所述函数地址;
跟踪关系建立子模块,用于调用ptrace系统接口建立所述内存跟踪进程与所述被测进程的跟踪关系;
指令替换子模块,用于将各函数地址对应位置中的指令替换为指定中断指令;
中断信号监听子模块,用于监听所述指定中断指令被执行时生成的中断信号。
在一种实施例中,所述装置还可以包括如下模块:
目标内存分配操作确定模块,用于当监听到所述中断信号时,确定触发所述中断信号的目标内存分配操作;
调用栈获取模块,用于获取所述目标内存分配操作对应的调用栈,并记录所述调用栈。
在一种实施例中,所述目标内存分配操作确定模块具体用于:
通过信号处理函数从所述中断信号中提取发生中断时的现场信息,所述现场信息包括寄存器值;
根据所述寄存器值确定触发中断的指令地址;
从记录的函数地址中匹配所述指令地址,以获得触发所述中断信号的目标动态内存函数,并将所述目标动态内存函数对应的内存分配操作作为目标内存分配操作。
在一种实施例中,所述调用栈获取模块具体用于:
通过调用unwind库获取所述目标内存分配操作对应的调用栈。
在一种实施例中,所述内存跟踪进程中设置有各动态内存函数对应的接管函数;所述接管函数用于执行对应的动态内存函数,以及,记录各动态内存函数分配的内存大小、分配内存的时间以及调用栈;
所述装置还包括如下模块:
函数执行模块,用于采用所述目标内存分配操作对应的接管函数、来执行所述目标内存分配操作对应的目标动态内存函数。
在一种实施例中,所述内存跟踪具有对应的内存跟踪时间;所述装置还包括如下模块:
停止跟踪模块,用于当所述内存跟踪时间到期时,停止所述内存跟踪;
调用栈汇总模块,用于汇总记录的所述调用栈,生成分析报告,并输出所述分析报告,其中,所述分析报告包括:各调用栈对应的动态内存函数的函数名称及函数地址、分配内存的次数、内存累计大小、释放内存大小、未被释放内存大小、超期未被释放的内存大小。
在一种实施例中,所述停止跟踪模块具体用于:
将各函数地址对应位置中的所述指定中断指令替换回原有的指令;
解除所述内存跟踪进程与所述被测进程的跟踪关系。
在一种实施例中,所述内存资源数据确定模块420具体用于:
所述监控进程根据所述被测进程的名称确定所述被测进程的进程ID;
按照预设时间间隔从文件系统中获取所述进程ID对应的物理内存资源值,作为所述被测进程在本机的内存资源数据。
在一种实施例中,所述装置还包括如下模块:
疑似内存泄露判断模块,用于计算相邻两个物理内存资源值的差值;若连续多个差值呈现递增状态,则判定所述被测进程疑似存在内存泄露。
需要说明的是,本申请实施例所提供的上述一种内存跟踪装置可执行本申请实施例一或实施例二所提供的一种内存跟踪方法,具备执行方法相应的功能模块和有益效果。
实施例四
图5为本申请实施例四提供的一种电子设备的结构示意图,该电子设备可以包括安装有被测进程的实例的主机。如图5所示,该电子设备包括处理器510、存储器520、输入装置530和输出装置540;电子设备中处理器510的数量可以是一个或多个,图5中以一个处理器510为例;电子设备中的处理器510、存储器520、输入装置530和输出装置540可以通过总线或其他方式连接,图5中以通过总线连接为例。
存储器520作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本申请实施例中的方法对应的程序指令/模块。处理器510通过运行存储在存储器520中的软件程序、指令以及模块,从而执行电子设备的各种功能应用以及数据处理,即实现上述的方法。
存储器520可主要包括存储程序区和存储数据区,其中,存储程序区
可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器520可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器520可进一步包括相对于处理器510远程设置的存储器,这些远程存储器可以通过网络连接至电子设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置530可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。输出装置540可包括显示屏等显示设备。
实施例五
本申请实施例五还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由服务器的处理器执行时用于执行实施例一中任一实施例中的方法。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本申请可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
值得注意的是,上述装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。
注意,上述仅为本申请的较佳实施例及所运用技术原理。本领域技术人员会理解,本申请不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本申请的保护范围。因此,虽然通过以上实施例对本申请进行了较为详细的说明,但是本申请不仅仅限于以上实施例,在不脱离本申请构思的情况下,还可以包括更多其他等效实施例,而本申请的范围由所附的权利要求范围决定。

Claims (13)

1.一种内存跟踪方法,其特征在于,所述方法应用于部署有被测进程的实例的主机上,所述主机与外部设备连接,所述主机包括监控进程以及内存跟踪进程;所述方法包括:
通过所述监控进程接收所述外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程;
所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据;
当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动所述内存跟踪进程;
由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪。
2.根据权利要求1所述的方法,其特征在于,所述由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪,包括:
由所述内存跟踪进程获取所述被测进程的多个动态内存函数的函数地址,并记录所述函数地址;
调用ptrace系统接口建立所述内存跟踪进程与所述被测进程的跟踪关系;
将各函数地址对应位置中的指令替换为指定中断指令;
监听所述指定中断指令被执行时生成的中断信号。
3.根据权利要求2所述的方法,其特征在于,在所述由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪之后,所述方法还包括:
当监听到所述中断信号时,确定触发所述中断信号的目标内存分配操作;
获取所述目标内存分配操作对应的调用栈,并记录所述调用栈。
4.根据权利要求3所述的方法,其特征在于,所述确定触发所述中断信号的目标内存分配操作,包括:
通过信号处理函数从所述中断信号中提取发生中断时的现场信息,所述现场信息包括寄存器值;
根据所述寄存器值确定触发中断的指令地址;
从记录的函数地址中匹配所述指令地址,以获得触发所述中断信号的目标动态内存函数,并将所述目标动态内存函数对应的内存分配操作作为目标内存分配操作。
5.根据权利要求3或4所述的方法,其特征在于,所述获取所述目标内存分配操作对应的调用栈,包括:
通过调用unwind库获取所述目标内存分配操作对应的调用栈。
6.根据权利要求3所述的方法,其特征在于,所述内存跟踪进程中设置有各动态内存函数对应的接管函数;所述接管函数用于执行对应的动态内存函数,以及,记录各动态内存函数分配的内存大小、分配内存的时间以及调用栈;
在确定触发所述中断信号的目标内存分配操作之后,所述方法还包括:
采用所述目标内存分配操作对应的接管函数、来执行所述目标内存分配操作对应的目标动态内存函数。
7.根据权利要求3所述的方法,其特征在于,所述内存跟踪具有对应的内存跟踪时间;
在所述记录所述调用栈之后,所述方法还包括:
当所述内存跟踪时间到期时,停止所述内存跟踪;
汇总记录的所述调用栈,生成分析报告,并输出所述分析报告,其中,所述分析报告包括:各调用栈对应的动态内存函数的函数名称及函数地址、分配内存的次数、内存累计大小、释放内存大小、未被释放内存大小、超期未被释放的内存大小。
8.根据权利要求7所述的方法,其特征在于,所述停止所述内存跟踪包括:
将各函数地址对应位置中的所述指定中断指令替换回原有的指令;
解除所述内存跟踪进程与所述被测进程的跟踪关系。
9.根据权利要求1所述的方法,其特征在于,所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据,包括:
所述监控进程根据所述被测进程的名称确定所述被测进程的进程ID;
按照预设时间间隔从文件系统中获取所述进程ID对应的物理内存资源值,作为所述被测进程在本机的内存资源数据。
10.根据权利要求9所述的方法,其特征在于,所述根据所述内存资源数据确定所述被测进程疑似存在内存泄露,包括:
计算相邻两个物理内存资源值的差值;
若连续多个差值呈现递增状态,则判定所述被测进程疑似存在内存泄露。
11.一种内存跟踪装置,其特征在于,所述装置位于部署有被测进程的实例的主机上,所述主机与外部设备连接,所述主机包括监控进程以及内存跟踪进程;所述装置包括:
被测进程名称接收模块,用于通过所述监控进程接收所述外部设备下发的被测进程的名称,所述被测进程为疑似发生内存泄露的、需要进行内存跟踪的进程;
内存资源数据获取模块,用于由所述监控进程根据所述被测进程的名称,获取所述被测进程在本机的内存资源数据;
内存跟踪进程启动模块,用于当所述监控进程根据所述内存资源数据确定所述被测进程在本机疑似存在内存泄露时,则启动所述内存跟踪进程;
内存跟踪模块,用于由所述内存跟踪进程调用进程跟踪ptrace函数对所述被测进程进行内存跟踪。
12.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-10中任一所述的方法。
13.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-10任一所述的方法。
CN202110558235.2A 2021-05-21 2021-05-21 一种内存跟踪方法及装置 Active CN113297074B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110558235.2A CN113297074B (zh) 2021-05-21 2021-05-21 一种内存跟踪方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110558235.2A CN113297074B (zh) 2021-05-21 2021-05-21 一种内存跟踪方法及装置

Publications (2)

Publication Number Publication Date
CN113297074A true CN113297074A (zh) 2021-08-24
CN113297074B CN113297074B (zh) 2023-12-22

Family

ID=77323678

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110558235.2A Active CN113297074B (zh) 2021-05-21 2021-05-21 一种内存跟踪方法及装置

Country Status (1)

Country Link
CN (1) CN113297074B (zh)

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101251822A (zh) * 2008-03-11 2008-08-27 中兴通讯股份有限公司 一种内存被改写的监控方法
CN101615143A (zh) * 2008-06-27 2009-12-30 国际商业机器公司 用于内存泄漏诊断的方法和装置
CN101814049A (zh) * 2010-03-23 2010-08-25 北京大学 一种内存泄漏探测方法
US20110145918A1 (en) * 2009-12-15 2011-06-16 Jaeyeon Jung Sensitive data tracking using dynamic taint analysis
CN103064784A (zh) * 2012-11-29 2013-04-24 福建师范大学 面向Xen环境的运行时内存泄漏检测方法及其实现系统
CN107066390A (zh) * 2017-04-24 2017-08-18 许继集团有限公司 一种动态内存泄漏检测方法及系统
CN108255746A (zh) * 2017-12-29 2018-07-06 北京元心科技有限公司 内存改写检测方法及装置
CN109981580A (zh) * 2019-02-25 2019-07-05 浪潮软件集团有限公司 一种防止cmsp被动态跟踪的安全方法和系统
CN110781075A (zh) * 2019-09-19 2020-02-11 深圳震有科技股份有限公司 一种内存泄漏的检测方法、装置、系统及存储介质
CN111290952A (zh) * 2020-01-22 2020-06-16 北京深之度科技有限公司 一种动态链接库函数的跟踪方法及装置
CN112199669A (zh) * 2020-09-25 2021-01-08 杭州安恒信息技术股份有限公司 一种检测rop攻击的方法和装置

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101251822A (zh) * 2008-03-11 2008-08-27 中兴通讯股份有限公司 一种内存被改写的监控方法
CN101615143A (zh) * 2008-06-27 2009-12-30 国际商业机器公司 用于内存泄漏诊断的方法和装置
US20110145918A1 (en) * 2009-12-15 2011-06-16 Jaeyeon Jung Sensitive data tracking using dynamic taint analysis
CN101814049A (zh) * 2010-03-23 2010-08-25 北京大学 一种内存泄漏探测方法
CN103064784A (zh) * 2012-11-29 2013-04-24 福建师范大学 面向Xen环境的运行时内存泄漏检测方法及其实现系统
CN107066390A (zh) * 2017-04-24 2017-08-18 许继集团有限公司 一种动态内存泄漏检测方法及系统
CN108255746A (zh) * 2017-12-29 2018-07-06 北京元心科技有限公司 内存改写检测方法及装置
CN109981580A (zh) * 2019-02-25 2019-07-05 浪潮软件集团有限公司 一种防止cmsp被动态跟踪的安全方法和系统
CN110781075A (zh) * 2019-09-19 2020-02-11 深圳震有科技股份有限公司 一种内存泄漏的检测方法、装置、系统及存储介质
CN111290952A (zh) * 2020-01-22 2020-06-16 北京深之度科技有限公司 一种动态链接库函数的跟踪方法及装置
CN112199669A (zh) * 2020-09-25 2021-01-08 杭州安恒信息技术股份有限公司 一种检测rop攻击的方法和装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Q. GAO 等: "Safe Memory-Leak Fixing for C Programs", 《 2015 IEEE/ACM 37TH IEEE INTERNATIONAL CONFERENCE ON SOFTWARE ENGINEERING》, pages 459 - 470 *
张爱国 等: "基于RelayFS的内核态内存泄露的检测和跟踪", 《电脑与电信》, no. 07, pages 16 - 18 *

Also Published As

Publication number Publication date
CN113297074B (zh) 2023-12-22

Similar Documents

Publication Publication Date Title
US8291379B2 (en) Runtime analysis of a computer program to identify improper memory accesses that cause further problems
US7991961B1 (en) Low-overhead run-time memory leak detection and recovery
US8250543B2 (en) Software tracing
US6944796B2 (en) Method and system to implement a system event log for system manageability
US7689872B2 (en) Autonomic program error detection and correction
EP3660684B1 (en) Efficient and comprehensive source code fuzzing
US7992136B2 (en) Method and apparatus for automatic application profiling
US10545807B2 (en) Method and system for acquiring parameter sets at a preset time interval and matching parameters to obtain a fault scenario type
US20080244547A1 (en) Method and system for integrating profiling and debugging
US20090193298A1 (en) System and method of fault detection, diagnosis and prevention for complex computing systems
CN112181833A (zh) 一种智能化模糊测试方法、装置及系统
US20100223306A1 (en) Method and apparatus for discovering application configuration files in a system
US9355003B2 (en) Capturing trace information using annotated trace output
US8793694B2 (en) Policy driven autonomic performance data collection
CN103109276A (zh) 系统测试方法
US11422920B2 (en) Debugging multiple instances of code using thread patterns
CN111309606B (zh) 页面异常处理方法、装置、计算机设备及存储介质
CN111274060A (zh) 一种确定内存异常的方法、装置、设备和存储介质
Chuah et al. Enabling dependability-driven resource use and message log-analysis for cluster system diagnosis
WO2013104964A1 (en) Thread based dynamic data collection
CN113297074B (zh) 一种内存跟踪方法及装置
CN113742113B (zh) 一种嵌入式系统健康管理方法、设备及储存介质
CN116414632A (zh) 片上系统的故障定位方法、片上系统、设备及存储介质
CN113986622A (zh) Sdk异常的自检方法、装置、介质和计算设备
WO2009147738A1 (ja) 情報処理装置及びその制御方法並びにモニタプログラム

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