CN103914376A - 一种内存泄露的快速定位方法 - Google Patents
一种内存泄露的快速定位方法 Download PDFInfo
- Publication number
- CN103914376A CN103914376A CN201410089673.9A CN201410089673A CN103914376A CN 103914376 A CN103914376 A CN 103914376A CN 201410089673 A CN201410089673 A CN 201410089673A CN 103914376 A CN103914376 A CN 103914376A
- Authority
- CN
- China
- Prior art keywords
- internal memory
- function
- memory
- application
- information
- 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.)
- Pending
Links
Abstract
本发明公开了一种内存泄露的快速定位方法,包括步骤:S1,申请内存时,在内存中申请预定大小的扩展区,用于保存内存头信息;S2,将所述头部标识信息初始化为第一标识,保存调用申请内存的函数信息;S3,将所述内存加入内存链表中;S4,当释放申请的内存时,将所述头部标识信息设置为第三标识,保存调用释放内存的函数信息;S5,将释放的内存从内存链表中删除;S6,需进行内存泄露定位时,遍历内存链表,根据所述函数信息统计相同函数申请内存的次数,其中申请内存的次数不断增长的函数为存在内存泄露的函数,本方法能够清晰地根据函数申请内存的次数,由多到少或由少到多显示内存泄露的具体函数和代码行,便于快速定位。
Description
技术领域
本发明涉及内存管理领域,尤其涉及一种内存泄露的快速定位方法。
背景技术
当今的IT行业中,代码开发中最频繁的操作之一就是内存的申请与释放。如果内存申请后,没有被及时释放,且这种情况频繁出现,就会导致剩余内存不断减少,可用内存逐渐降低的情况,这种情况通常被称之为内存泄露现象。如果出现内存泄露,就需要开发人员花费更多的时间去查看代码,查找没有释放的地方,因此内存泄露问题一直是困扰开发者定位问题的一大难题,往往需要开发者花费大量的时间去查找内存泄露的地方,既费时又费力。现有的一种定位内存泄露的方法为:首先启动程序;然后分配新内存时,根据内存分配的地址,在设定的路径内生成内存跟踪文件,内存跟踪文件的内容或文件名与分配的内存地址、分配内存的文件或分配内存的源代码的行号相关;释放内存时,根据传进的内存地址,删除相应的内存跟踪文件。当程序运行完毕之后,根据设定的路径内所存在的内存跟踪文件判断内存泄露的情况,即,若设定的路径内存在未删除的内存跟踪文件,则说明有分配的内存未被释放。该技术存在的技术问题:需要启动新的程序,对现有程序的运行环境存在影响,可能导致出现未知的问题,并且还需要替换分配内存的接口,创建跟踪文件,需要根据跟踪文件来确认是否存在内存泄露,如果内存申请的地方较多,跟踪文件的信息量很大,不便于定位。
发明内容
本发明鉴于上述情况而作出,其目的是提供一种内存泄露的快速定位方法,能够清晰地根据函数申请内存的次数,由多到少或由少到多显示内存泄露的具体函数和代码行,便于快速定位。
本发明提供一种内存泄露的快速定位方法,包括步骤:
步骤S1,申请内存时,在内存中申请预定大小的扩展区,用于保存内存头信息,所述内存头信息包括:用于确认内存申请和释放情况的头部标识信息,调用申请内存的函数信息,调用释放内存的函数信息。
步骤S2,将所述头部标识信息初始化为第一标识,保存调用申请内存的函数信息。
步骤S3,将所述内存加入内存链表中。
步骤S4,当释放申请的内存时,将所述头部标识信息设置为第三标识,保存调用释放内存的函数信息。
步骤S5,将释放的内存从内存链表中删除。
步骤S6,需进行内存泄露定位时,遍历内存链表,根据所述函数信息统计相同函数申请内存的次数,其中申请内存的次数不断增长的函数为存在内存泄露的函数。
进一步地,所述头部标识信息还用于确认申请内存的起始位置。
进一步地,所述扩展区还用于保存内存尾信息,所述内存尾信息包括尾部标识信息,用于确认申请内存的结束位置。
优选地,所述步骤S6还包括:根据所述申请内存的次数,从大到小打印函数信息中的函数名称及对应的函数申请的次数。
优选地,所述步骤S6还包括:根据所述申请内存的次数,从小到大打印函数信息中的函数名称及对应的函数申请的次数。
进一步地,根据所述申请内存的次数,从大到小打印函数信息中的函数名称及对应的函数申请的次数,包括:根据所述申请内存的次数和输入的参数n,从大到小打印排在前n位的函数名称及对应的函数申请的次数。
进一步地,根据所述申请内存的次数,从小到大打印函数信息中的函数名称及对应的函数申请的次数,包括:根据所述申请内存的次数和输入的参数n,从小到大打印排在前n位的函数名称及对应的函数申请的次数。
进一步地,所述步骤S2还包括:将所述尾部标识信息初始化为第二标识;所述步骤S4还包括:将所述尾部标识信息设置为第四标识。
其中,所述函数信息包括函数地址和对应的代码行数,所述函数地址能够用以翻译成函数名。
其中,所述头部标识信息和尾部标识信息分别为内存头魔数字和内存尾魔数字,所述第一标识、第二标识、第三标识和第四标识分别为不同的特定数字。
根据本发明,提供了一种内存泄露的快速定位方法,能够清晰地根据函数申请内存的次数,由多到少或由少到多显示内存泄露的具体函数和代码行,便于快速定位。
附图说明
图1是本发明的内存泄露的快速定位方法的流程示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
本发明提供一种内存泄露的快速定位方法,能够清晰地由多到少显示内存泄露的具体函数和代码行,便于快速定位。
图1是本发明的内存泄露的快速定位方法的流程示意图。
如图1所示,一种内存泄露的快速定位方法,包括以下步骤:
步骤S1,申请内存时,在内存中申请预定大小的扩展区,用于保存内存头信息,内存头信息包括:用于确认内存申请和释放情况的头部标识信息,调用申请内存的函数信息,调用释放内存的函数信息。
当函数需要内存空间时,函数通过调用申请内存命令来申请一定大小的内存空间,在为该函数分配所需的内存空间的同时还在内存中申请并分配预定大小的扩展区,用于保存内存头信息。
头部标识信息还用于确认申请内存的起始位置。
优选地,扩展区还用于保存内存尾信息,内存尾信息包括尾部标识信息,用于确认申请内存的结束位置。
函数信息包括函数地址和对应的代码行数,函数地址能够用以翻译成函数名。
步骤S2,将头部标识信息初始化为第一标识,保存调用申请内存的函数信息。
优选地,同时将尾部标识信息初始化为第二标识。
步骤S3,将该内存加入内存链表中。
步骤S4,当释放申请的内存时,将头部标识信息设置为第三标识,保存调用释放内存的函数信息。
优选地,同时将尾部标识信息设置为第四标识。
步骤S5,将释放的内存从内存链表中删除。
步骤S6,需进行内存泄露定位时,遍历内存链表,根据所述函数信息统计相同函数申请内存的次数,其中申请内存的次数不断增长的函数为存在内存泄露的函数。
具体地,统计相同函数申请内存的次数,可根据申请内存的次数,从大到小打印函数信息中的函数名称及对应的函数申请的次数,还可进一步根据申请内存的次数和输入的参数n,从大到小打印排在前n位的函数名称及对应的函数申请的次数。
或者,根据申请内存的次数,从小到大打印函数信息中的函数名称及对应的函数申请的次数,还可进一步根据申请内存的次数和输入的参数n,从小到大打印排在前n位的函数名称及对应的函数申请的次数。
其中,头部标识信息和尾部标识信息分别为内存头魔数字和内存尾魔数字,第一标识、第二标识、第三标识和第四标识分别为不同的特定数字。
下面给出具体应用时的实施例。
实施例1
假设函数名为function1()的函数的地址为0x00000001,该函数所对应的代码中的行数为LINE:10021。
当该函数申请内存时,在内存中申请预定大小的扩展区,用于保存内存头信息,内存头信息包括:头部标识信息和函数信息,其中头部标识信息为设置为内存头魔数字“00”,用来表示内存被使用并且未被释放;函数信息包括函数地址0x00000001和对应的代码行数LINE:10021,函数地址0x00000001能够用来翻译成该函数的函数名function1()。
优选地,所述扩展区还保存内存尾信息,内存尾信息包括:尾部标识信息,用于确认申请内存的结束位置。在上述函数申请内存时,同时将尾部标识设置为内存尾魔数字“01”,用来表示内存被使用的结束。
将该内存加入内存链表中。
当释放申请的内存时,将头部标识信息设置为内存头魔数字“10”,用来表示内存被释放的开始,保存调用释放内存的函数信息,包括函数地址0x00000001和对应的代码行数LINE:10021。
对应地,将尾部标识信息设置为内存尾魔数字“11”,用来表示内存被释放的结束。
调用释放函数free(),指定释放内存的首地址,根据该首地址将释放的内存从内存链表中删除,完成释放。
其他函数调用申请内存和释放内存的原理同上,在需进行内存泄露定位时,遍历内存链表,根据所述函数信息统计相同函数申请内存的次数,其中申请内存的次数不断增长的函数为存在内存泄露的函数。具体地,可根据申请内存的次数,从大到小(或从小到大)打印函数信息中的函数名称及对应的函数申请的次数,还可进一步根据申请内存的次数和输入的参数n,从大到小(或从小到大)打印排在前n位的函数名称及对应的函数申请的次数,从而确定存在内存泄露的函数,并根据函数信息中对应的具体代码行数,可快速找到问题所在。
应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
Claims (10)
1.一种内存泄露的快速定位方法,其特征在于,包括步骤:
步骤S1,申请内存时,在内存中申请预定大小的扩展区,用于保存内存头信息,所述内存头信息包括:用于确认内存申请和释放情况的头部标识信息,调用申请内存的函数信息,调用释放内存的函数信息;
步骤S2,将所述头部标识信息初始化为第一标识,保存调用申请内存的函数信息;
步骤S3,将所述内存加入内存链表中;
步骤S4,当释放申请的内存时,将所述头部标识信息设置为第三标识,保存调用释放内存的函数信息;
步骤S5,将释放的内存从内存链表中删除;
步骤S6,需进行内存泄露定位时,遍历内存链表,根据所述函数信息统计相同函数申请内存的次数,其中申请内存的次数不断增长的函数为存在内存泄露的函数。
2.根据权利要求1所述的方法,其特征在于,所述头部标识信息还用于确认申请内存的起始位置。
3.根据权利要求1所述的方法,其特征在于,所述扩展区还用于保存内存尾信息,所述内存尾信息包括尾部标识信息,用于确认申请内存的结束位置。
4.根据权利要求1至3任意一项所述的方法,其特征在于,所述步骤S6还包括:根据所述申请内存的次数,从大到小打印函数信息中的函数名称及对应的函数申请的次数。
5.根据权利要求1至3任意一项所述的方法,其特征在于,所述步骤S6中还包括:根据所述申请内存的次数,从小到大打印函数信息中的函数名称及对应的函数申请的次数。
6.根据权利要求4所述的方法,其特征在于,所述根据所述申请内存的次数,从大到小打印函数信息中的函数名称及对应的函数申请的次数,包括:根据所述申请内存的次数和输入的参数n,从大到小打印排在前n位的函数名称及对应的函数申请的次数。
7.根据权利要求5所述的方法,其特征在于,所述根据所述申请内存的次数,从小到大打印函数信息中的函数名称及对应的函数申请的次数,包括:根据所述申请内存的次数和输入的参数n,从小到大打印排在前n位的函数名称及对应的函数申请的次数。
8.根据权利要求3所述的方法,其特征在于,所述步骤S2还包括:将所述尾部标识信息初始化为第二标识;所述步骤S4还包括:将所述尾部标识信息设置为第四标识。
9.根据权利要求1所述的方法,其特征在于,所述函数信息包括函数地址和对应的代码行数,所述函数地址能够用以翻译成函数名。
10.根据权利要求8所述的方法,其特征在于,所述头部标识信息和尾部标识信息分别为内存头魔数字和内存尾魔数字,所述第一标识、第二标识、第三标识和第四标识分别为不同的特定数字。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410089673.9A CN103914376A (zh) | 2014-03-12 | 2014-03-12 | 一种内存泄露的快速定位方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410089673.9A CN103914376A (zh) | 2014-03-12 | 2014-03-12 | 一种内存泄露的快速定位方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103914376A true CN103914376A (zh) | 2014-07-09 |
Family
ID=51040078
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410089673.9A Pending CN103914376A (zh) | 2014-03-12 | 2014-03-12 | 一种内存泄露的快速定位方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103914376A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104360954A (zh) * | 2014-10-30 | 2015-02-18 | 上海斐讯数据通信技术有限公司 | 一种已申请内存块的统计方法和系统 |
CN104572460A (zh) * | 2014-12-30 | 2015-04-29 | 大唐移动通信设备有限公司 | 一种内存泄露的检测方法和装置 |
WO2016029723A1 (zh) * | 2014-08-26 | 2016-03-03 | 华为技术有限公司 | 一种资源泄漏检测方法、装置及系统 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106407114A (zh) * | 2016-09-20 | 2017-02-15 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法和装置 |
CN106802861A (zh) * | 2015-11-26 | 2017-06-06 | 大唐移动通信设备有限公司 | 一种检测内存泄露的方法和装置 |
CN106844216A (zh) * | 2017-01-25 | 2017-06-13 | 深圳怡化电脑股份有限公司 | 一种内存泄露的定位方法及系统 |
CN111723016A (zh) * | 2020-06-24 | 2020-09-29 | 湖南国科微电子股份有限公司 | 文件关闭方法、装置、电子设备和存储介质 |
CN115220970A (zh) * | 2021-12-10 | 2022-10-21 | 广州汽车集团股份有限公司 | 一种定位内存泄漏方法、装置、计算机设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101145128A (zh) * | 2007-06-13 | 2008-03-19 | 中兴通讯股份有限公司 | 一种检测内存泄露的方法 |
CN101908018A (zh) * | 2010-07-20 | 2010-12-08 | 北京海泰方圆科技有限公司 | 一种判断内存泄露的系统及方法 |
CN102681938A (zh) * | 2012-05-15 | 2012-09-19 | 青岛海信移动通信技术股份有限公司 | 一种内存泄漏检测方法及装置 |
-
2014
- 2014-03-12 CN CN201410089673.9A patent/CN103914376A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101145128A (zh) * | 2007-06-13 | 2008-03-19 | 中兴通讯股份有限公司 | 一种检测内存泄露的方法 |
CN101908018A (zh) * | 2010-07-20 | 2010-12-08 | 北京海泰方圆科技有限公司 | 一种判断内存泄露的系统及方法 |
CN102681938A (zh) * | 2012-05-15 | 2012-09-19 | 青岛海信移动通信技术股份有限公司 | 一种内存泄漏检测方法及装置 |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016029723A1 (zh) * | 2014-08-26 | 2016-03-03 | 华为技术有限公司 | 一种资源泄漏检测方法、装置及系统 |
CN105446871A (zh) * | 2014-08-26 | 2016-03-30 | 华为技术有限公司 | 一种资源泄漏检测方法、装置及系统 |
US10289472B2 (en) | 2014-08-26 | 2019-05-14 | Huawei Technologies Co., Ltd. | Resource leak detection method, apparatus, and system |
CN105446871B (zh) * | 2014-08-26 | 2018-08-17 | 华为技术有限公司 | 一种资源泄漏检测方法、装置及系统 |
CN104360954B (zh) * | 2014-10-30 | 2017-10-24 | 上海斐讯数据通信技术有限公司 | 一种已申请内存块的统计方法和系统 |
CN104360954A (zh) * | 2014-10-30 | 2015-02-18 | 上海斐讯数据通信技术有限公司 | 一种已申请内存块的统计方法和系统 |
CN104572460A (zh) * | 2014-12-30 | 2015-04-29 | 大唐移动通信设备有限公司 | 一种内存泄露的检测方法和装置 |
CN106802861A (zh) * | 2015-11-26 | 2017-06-06 | 大唐移动通信设备有限公司 | 一种检测内存泄露的方法和装置 |
CN106055478A (zh) * | 2016-05-31 | 2016-10-26 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106055478B (zh) * | 2016-05-31 | 2020-09-22 | 腾讯科技(深圳)有限公司 | 检测内存泄漏的方法和装置 |
CN106407114B (zh) * | 2016-09-20 | 2017-12-15 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法和装置 |
CN106407114A (zh) * | 2016-09-20 | 2017-02-15 | 腾讯科技(深圳)有限公司 | 内存泄漏分析方法和装置 |
CN106844216A (zh) * | 2017-01-25 | 2017-06-13 | 深圳怡化电脑股份有限公司 | 一种内存泄露的定位方法及系统 |
CN111723016A (zh) * | 2020-06-24 | 2020-09-29 | 湖南国科微电子股份有限公司 | 文件关闭方法、装置、电子设备和存储介质 |
CN115220970A (zh) * | 2021-12-10 | 2022-10-21 | 广州汽车集团股份有限公司 | 一种定位内存泄漏方法、装置、计算机设备及存储介质 |
CN115220970B (zh) * | 2021-12-10 | 2023-09-08 | 广州汽车集团股份有限公司 | 一种定位内存泄漏方法、装置、计算机设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103914376A (zh) | 一种内存泄露的快速定位方法 | |
CN100487658C (zh) | 一种检测内存访问越界的方法 | |
CN102760080B (zh) | 一种内存管理的方法和装置 | |
CN103914355A (zh) | 对内存重复释放进行定位的方法和装置 | |
CN104008111A (zh) | 一种数据的存储管理方法及装置 | |
CN104572460A (zh) | 一种内存泄露的检测方法和装置 | |
CN105224361A (zh) | 一种对sqlite3型嵌入式数据库进行升级的方法及系统 | |
CN103838859A (zh) | 一种减少linux下多进程间数据拷贝的方法 | |
CN103714013A (zh) | 一种文件系统的存储空间的配置方法及装置 | |
CN104350478A (zh) | 用于使用位图窗口的持久性存储器中对象删除的系统和方法 | |
CN104424030A (zh) | 多进程操作共享内存的方法和装置 | |
CN105718319B (zh) | 一种内存池版图解析方法和内存池装置 | |
CN101727503A (zh) | 一种创建磁盘文件系统的方法 | |
CN103218305A (zh) | 存储空间的分配方法 | |
CN108228091A (zh) | 配置数据分区保存方法及系统、配置数据校验方法及系统 | |
CN105095016A (zh) | 一种磁盘快照回滚方法及装置 | |
CN106933611A (zh) | 类加载方法及类加载器 | |
CN102541969A (zh) | 基于fat文件系统的文件保护方法、系统及存储器 | |
CN105183542A (zh) | 一种内存管理方法及系统 | |
CN105005491B (zh) | 一种Linux内核和应用程序的升级方法及系统 | |
CN104951370A (zh) | 一种内存管理方法及装置 | |
CN101183366A (zh) | 一种图片文件处理方法和系统 | |
CN106484375B (zh) | 一种指令块加载方法、软交换设备及系统 | |
CN103955432A (zh) | 数据存储的方法及装置 | |
US8806465B2 (en) | Refactor exception class hierarchy for reduced footprint and faster application start |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20140709 |