CN113886114B - 一种内存泄漏的定位方法 - Google Patents

一种内存泄漏的定位方法 Download PDF

Info

Publication number
CN113886114B
CN113886114B CN202111029601.1A CN202111029601A CN113886114B CN 113886114 B CN113886114 B CN 113886114B CN 202111029601 A CN202111029601 A CN 202111029601A CN 113886114 B CN113886114 B CN 113886114B
Authority
CN
China
Prior art keywords
memory
leakage
observing
size
log
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
CN202111029601.1A
Other languages
English (en)
Other versions
CN113886114A (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.)
Shanghai Hongji Information Technology Co Ltd
Original Assignee
Shanghai Hongji Information Technology 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 Shanghai Hongji Information Technology Co Ltd filed Critical Shanghai Hongji Information Technology Co Ltd
Priority to CN202111029601.1A priority Critical patent/CN113886114B/zh
Publication of CN113886114A publication Critical patent/CN113886114A/zh
Application granted granted Critical
Publication of CN113886114B publication Critical patent/CN113886114B/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/0706Error 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 the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/073Error 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 the processing taking place on a specific hardware platform or in a specific software environment in a memory management context, e.g. virtual memory or cache management
    • 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/0766Error or fault reporting or storing
    • 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
    • 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

Abstract

本发明公开了一种内存泄漏的定位方法,包括以下步骤:初步缩小内存泄漏的范围,定位到某个模块,通过控制变量的操作方式来缩小排查范围;寻找此模块内所有申请堆内存的地方;在找到的所有申请堆内存的地方上扩大欲申请的内存大小,加上特殊的魔术字;编译,运行进程;采用top命令观察对应进程的内存增涨情况,且记录到日志中;分析日志,观察内存增涨的规律,对应魔术字,定位泄漏点。本发明不依赖任何第三方工具,可以直接在程序中使用堆内存申请的地方进行操作,通过在内存申请处扩大欲申请的内存大小,加上特殊的魔术字,从而在进程运行起来后,通过观察内存的增涨变化,确定泄漏点所在,具有普遍适用性。

Description

一种内存泄漏的定位方法
技术领域
本发明涉及通信技术领域,具体是指一种内存泄漏的定位方法。
背景技术
在进行应用程序编程时,内存的使用主要有以下几种方式:
(1)全局变量:位于代码段中,分配一次,生命周期为整个应用程序生命周期;
(2)栈内存:位于栈中,系统自动维护,即时申请,即时释放;
(3)堆内存:位于堆中,开发人员自己申请,自己释放;
上述三种内存使用方式中,一旦申请了内存,但是忘记了释放,就会产生内存泄漏的问题。其中,前两种方式不会产生内存泄漏,第三种会产生。
第三种也是最普遍的内存泄漏问题,一旦产生内存泄漏,长时间下去,系统会触发OOM机制杀掉内存占用过多的进程(一般就是由于内存泄漏产生的),导致服务中断。
目前稍成规模的软件系统中,堆内存是不可避免要使用的,但是内存泄漏问题的发生会严重影响系统的运行。故而在进行编程时,开发人员要严格使用堆内存的操作方式,即一次申请,一次释放,以避免内存泄漏的发生。
当前情况下,一旦发生内存泄漏,基本上都会采用类似于valgrind之类的工具拉起进程进行复现,之后分析日志确定泄漏点,具体操作如下:
1)采用valgrind工具拉起进程进行复现,之后分析对应日志;
2)采用glibc自带的mtrace工具运行进程,之后分析对应日志;
3)采用自定义内存分配器进行统计,之后分析统计数据;
4)采用gcc的wrapper机制,替换malloc,运行进程,之后分析统计数据。
上述方法具有以下缺点:
1)采用valgrind工具拉起进程进行复现,之后分析对应日志:此方法为最常用的方法,编译出对应系统的valgrind工具,然后使用valgrind工具拉起会产生内存泄漏的进程,最后分析valgrind产生的日志,从而确定泄漏点。但是,许多系统下不能编译出对应的valgrind工具,或者编译非常麻烦,此时要想获取valgrind就不是很便捷。
2)采用glibc自带的mtrace工具运行进程,之后分析对应日志:一般堆内存管理均采用glibc自带的malloc函数,glibc库提供了对应的内存申请、释放记录工具mtrace。可以修改应用程序,引入mtrace工具,然后运行进程,之后分析mtrace工具产生的日志。目前,除了glibc的内存分配器外,还有其他内存分配器,例如jemalloc,一旦不使用glibc的内存分配器,mtrace也就无法使用了。
3)采用自定义内存分配器进行统计,之后分析统计数据:多数情况下,我们可以将系统的内存分配器函数进行封装,加上统计信息,然后使用堆内存时采用我们自定义的封装后的分配器函数,运行进程后,对统计信息进行分析,即可定位泄漏点。但是,由于各种原因(例如开发人员习惯),应用程序内可能不会全部使用封装后的分配器,这样就无法对所有堆内存使用进行统计分析了。
4)采用gcc的wrapper机制,替换malloc,运行进程,之后分析统计数据:常用编译器为gcc,其提供了wrapper机制,我们可以单独封装系统的内存分配器,然后在编译时采用wrapper机制替换掉系统自带的内存分配器。但是,除了gcc编译器之外,还有其他编译器,其可能没有提供这样的机制。
所以,一种定位、分析应用程序产生内存泄漏原因的方法成为人们亟待解决的问题。
发明内容
本发明的目的是通过在内存申请处扩大欲申请的内存大小,加上特殊的魔术字,从而在进程运行起来后,通过观察内存的增涨变化,确定泄漏点所在。
为实现上述目的,本发明提供的技术方案为:一种内存泄漏的定位方法,包括以下步骤:
步骤1、初步缩小内存泄漏的范围,定位到某个模块,通过控制变量的操作方式来缩小排查范围;
步骤2、寻找此模块内所有申请堆内存的地方:一旦通过排查缩小了内存泄漏的范围,定位到某个模块后,就可以分析此模块的逻辑,找出其申请堆内存的所有地方;
步骤3、在找到的所有申请堆内存的地方上扩大欲申请的内存大小,加上特殊的魔术字;
步骤4、编译,运行进程:按照步骤3中所述的方式修改好代码后,重新编译代码,得到新的程序,并运行新的程序,同时使用之前的配置、环境进行操作复现;
步骤5、采用top命令观察对应进程的内存增涨情况,且记录到日志中;
步骤6、分析日志,观察内存增涨的规律,对应魔术字,定位泄漏点:采用Linux下的文本处理工具对日志文件进行处理,观察内存增长的规律,通过增长量的大小和之前扩充的魔术字大小比较,即可判断出内存泄漏的地方。
作为改进,所述步骤1中内存泄漏的原因包括修改配置导致内存泄漏,处理业务流量导致内存泄漏,内部的定时器、日志导致内存泄漏;
作为改进,所述步骤3中的魔术字要求大小各不相同。
作为改进,所述步骤5中的top命令为Linux下的用于观察系统进程运行情况的工具,其也能观察进程的内存使用情况,重点是输出结果的RES列,其表示进程所使用的物理内存大小。
作为改进,所述步骤6中的文本处理工具包括cat、awk、sed、grep、sort。
本发明与现有技术相比的优点在于:本发明不用依赖于类似valgrind之类的工具,也不依赖具体的内存分配器,可以直接在程序中使用堆内存申请的地方进行操作,通过在内存申请处扩大欲申请的内存大小,加上特殊的魔术字,从而在进程运行起来后,通过观察内存的增涨变化,确定泄漏点所在,具有普遍适用性。
具体实施方式
下面对本发明一种内存泄漏的定位方法做进一步的详细说明。
一种内存泄漏的定位方法,包括以下步骤:
步骤1、初步缩小内存泄漏的范围,定位到某个模块:一般地,当观察到某个进程的内存使用增长不正常时,可以分析该进程所承载的业务,确定是修改配置导致,还是处理业务流量导致,亦或是内部的定时器、日志等所导致;此时可以通过控制变量的操作方式来缩小排查范围;
步骤2、寻找此模块内所有申请堆内存的地方:一旦通过排查缩小了内存泄漏的范围,定位到某个模块后,就可以分析此模块的逻辑,找出其申请堆内存的所有地方;
步骤3、在找到的所有申请堆内存的地方上扩大欲申请的内存大小,加上特殊的魔术字:即在怀疑的模块中申请堆内存的地方,加上大小不一的魔术字,比如,申请64K内存的地方,变成64K+1M,申请256K的地方,变成256K+3M等;此处扩大内存的申请大小,一旦真正存在内存泄漏时,非常便于观察;
步骤4、编译,运行进程:按照步骤3中所述的方式修改好代码后,重新编译代码,得到新的程序,并运行新的程序,同时使用之前的配置、环境进行操作复现;
步骤5、采用top命令观察对应进程的内存增涨情况,且记录到日志中:top命令为Linux下的用于观察系统进程运行情况的工具,其也能观察进程的内存使用情况,重点是输出结果的RES列,其表示进程所使用的物理内存大小;记录到日志中,是便于采用Linux下的文本处理工具进行分析,探究内存增长规律;
步骤6、分析日志,观察内存增涨的规律,对应魔术字,定位泄漏点:采用Linux下的文本处理工具cat、awk、sed、grep、sort等对日志文件进行处理,观察内存增长的规律,通过增长量的大小和之前扩充的魔术字大小比较,即可判断出内存泄漏的地方;例如,增长量5M比较多,那么上述修改代码处,采用5M魔术字的申请处就是一处内存泄漏点;这是因为,当时申请了5M多的内存,后续也观察到了这5M多的内存增长量,而这5M多的内存增长量又没有归还给系统(归还系统后,内存使用大小会变小),那只能是申请了但没有释放,即产生了内存泄漏。
本发明一种内存泄漏的定位方法的具体实施过程如下:
1)准备示例程序:memory_leak_test.c(不含行号);
2)编译上述程序:产生可执行文件memory_leak_test;
gcc-g3-O0-o memory_leak_test memory_leak_test.c
3)运行进程:
./memory_leak_test
4)采用top命令观察对应进程的内存增涨情况,且记录到日志中:
top-d 1-b-p`pidof memory_leak_test`2>&1|tee-a origin_data.log
5)处理日志:
cat origin_data.log|sed-n'/load/p'|awk-F”'{printf$3"\n"}'|awk'{printFNR","$0}'>>time_data.log
cat origin_data.log|sed-n'/memory/p'|awk-F”'{printf$6"\n"}'|awk'{print FNR","$0}'>>memory_data.log
awk-F',”NR==FNR{a[$1]=$2}NR>FNR{print$2,a[$1]}'memory_data.logtime_data.log|awk'{print FNR,$0}'>time_memory_data.log
6)分析日志,观察内存增涨的规律,对应魔术字,定位泄漏点:
7)输出解释:针对日志time_memory_data.log
第一列:序号,top命令采集的次数;
第二列:时间,top命令采集的时间;
第三列:内存,top命令集采内存泄漏进程的内存使用情况,单位为KB;
对于第三列,采用下一行内存使用量减去上一行内存使用量的方式,得出两次采集的内存增涨情况,经过计算、筛选后如表1所示:
表1:两次采集的内存增涨计算、筛选表
从表1中可以看出,上下两行的差值中,存在5212(5M)、3100(3M)、2904(3M)、3104(3M)几组数据,且3M的较多,此时就能定位到泄漏点为魔术字3M所在的内存申请处,即代码的25行附近。
以上对本发明及其实施方式进行了描述,上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,如果本领域的普通技术人员受其启示,在不脱离本发明创造宗旨的情况下,不经创造性的设计出与该技术方案相似的结构方式及实施例,均应属于本发明的保护范围。

Claims (5)

1.一种内存泄漏的定位方法,其特征在于:包括以下步骤:
步骤1、初步缩小内存泄漏的范围,定位到某个模块,通过控制变量的操作方式来缩小排查范围;
步骤2、寻找此模块内所有申请堆内存的地方:一旦通过排查缩小了内存泄漏的范围,定位到某个模块后,就可以分析此模块的逻辑,找出其申请堆内存的所有地方;
步骤3、在找到的所有申请堆内存的地方上扩大欲申请的内存大小,加上特殊的魔术字;
步骤4、编译,运行进程:按照步骤3中所述的方式修改好代码后,重新编译代码,得到新的程序,并运行新的程序,同时使用之前的配置、环境进行操作复现;
步骤5、采用top命令观察对应进程的内存增涨情况,且记录到日志中;
步骤6、分析日志,观察内存增涨的规律,对应魔术字,定位泄漏点:采用Linux下的文本处理工具对日志文件进行处理,观察内存增长的规律,通过增长量的大小和之前扩充的魔术字大小比较,即可判断出内存泄漏的地方。
2.根据权利要求1所述的一种内存泄漏的定位方法,其特征在于:所述步骤1中内存泄漏的原因包括修改配置导致内存泄漏,处理业务流量导致内存泄漏,内部的定时器、日志导致内存泄漏。
3.根据权利要求1所述的一种内存泄漏的定位方法,其特征在于:所述步骤3中的魔术字要求大小各不相同。
4.根据权利要求1所述的一种内存泄漏的定位方法,其特征在于:所述步骤5中的top命令为Linux下的用于观察系统进程运行情况的工具,其也能观察进程的内存使用情况,重点是输出结果的RES列,其表示进程所使用的物理内存大小。
5.根据权利要求1所述的一种内存泄漏的定位方法,其特征在于:所述步骤6中的文本处理工具包括cat、awk、sed、grep、sort。
CN202111029601.1A 2021-09-03 2021-09-03 一种内存泄漏的定位方法 Active CN113886114B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111029601.1A CN113886114B (zh) 2021-09-03 2021-09-03 一种内存泄漏的定位方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111029601.1A CN113886114B (zh) 2021-09-03 2021-09-03 一种内存泄漏的定位方法

Publications (2)

Publication Number Publication Date
CN113886114A CN113886114A (zh) 2022-01-04
CN113886114B true CN113886114B (zh) 2023-09-01

Family

ID=79012260

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111029601.1A Active CN113886114B (zh) 2021-09-03 2021-09-03 一种内存泄漏的定位方法

Country Status (1)

Country Link
CN (1) CN113886114B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106648893A (zh) * 2016-12-20 2017-05-10 北京匡恩网络科技有限责任公司 一种内存管理方法及设备
CN112445686A (zh) * 2019-08-27 2021-03-05 Oppo(重庆)智能科技有限公司 内存泄漏检测方法、装置以及计算机可读存储介质
CN112650692A (zh) * 2019-10-12 2021-04-13 北京华为数字技术有限公司 堆内存分配方法、装置及存储介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7478243B2 (en) * 2001-03-21 2009-01-13 Microsoft Corporation On-disk file format for serverless distributed file system with signed manifest of file modifications
US8245209B2 (en) * 2007-05-29 2012-08-14 International Business Machines Corporation Detecting dangling pointers and memory leaks within software
CN101339533B (zh) * 2007-07-04 2012-10-10 国际商业机器公司 基于分区的诊断Java系统的内存泄漏的方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106648893A (zh) * 2016-12-20 2017-05-10 北京匡恩网络科技有限责任公司 一种内存管理方法及设备
CN112445686A (zh) * 2019-08-27 2021-03-05 Oppo(重庆)智能科技有限公司 内存泄漏检测方法、装置以及计算机可读存储介质
CN112650692A (zh) * 2019-10-12 2021-04-13 北京华为数字技术有限公司 堆内存分配方法、装置及存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
内存泄漏的动态跟踪分析;吴民, 涂奉生;计算机工程与应用(第14期);21-23 *

Also Published As

Publication number Publication date
CN113886114A (zh) 2022-01-04

Similar Documents

Publication Publication Date Title
US7774761B2 (en) Use of memory watch points and a debugger to improve analysis of runtime memory access errors
US5673387A (en) System and method for selecting test units to be re-run in software regression testing
US6996808B1 (en) Function injector
Chen et al. TestTube: A system for selective regression testing
US9274923B2 (en) System and method for stack crawl testing and caching
US5987250A (en) Transparent instrumentation for computer program behavior analysis
US8091075B2 (en) Method and apparatus for breakpoint analysis of computer programming code using unexpected code path conditions
CN105808369B (zh) 一种基于符号执行的内存泄漏检测方法
US5805863A (en) Memory pattern analysis tool for use in optimizing computer program code
US7536680B2 (en) Method for modifying a class file to monitor data flow
US8479162B2 (en) Method and apparatus for locating memory leak in a program
CN100440163C (zh) 对计算机程序进行运行时分析的方法和系统
US20070150879A1 (en) Error Detection on the Stack
US20080319959A1 (en) Generating information on database queries in source code into object code compiled from the source code
CN112631893B (zh) 面向异构平台的多层次存储结构内存检测方法
CN104133733B (zh) 一种内存错误检测方法
CN104252402A (zh) 一种程序调试方法及装置
CN114546868A (zh) 代码覆盖率测试方法、装置和电子设备
CN107025175A (zh) 一种模糊测试种子用例变长字段修剪方法
Zhang et al. Intelligen: Automatic driver synthesis for fuzz testing
CN113886114B (zh) 一种内存泄漏的定位方法
CN107480048A (zh) 测试工具生成方法、装置、存储介质及计算机设备
CN110633199A (zh) 用于支持智能合约的区块链的测试装置、方法及介质
CN100470683C (zh) 嵌入式系统动态存储错误静态检测的实现方法
CN114282227B (zh) 一种Fabric区块链系统智能合约的安全分析检测方法

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