CN102981919A - 快速定位错误源头的内存管理方法 - Google Patents
快速定位错误源头的内存管理方法 Download PDFInfo
- Publication number
- CN102981919A CN102981919A CN2012104361508A CN201210436150A CN102981919A CN 102981919 A CN102981919 A CN 102981919A CN 2012104361508 A CN2012104361508 A CN 2012104361508A CN 201210436150 A CN201210436150 A CN 201210436150A CN 102981919 A CN102981919 A CN 102981919A
- Authority
- CN
- China
- Prior art keywords
- memory
- internal memory
- static
- internal
- mistake
- 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
Links
Images
Landscapes
- Techniques For Improving Reliability Of Storages (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种快速定位错误源头的内存管理方法,从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;将所述静态内存划分为复数个静态管理块;通过内存分配登记步骤、执行内存变更步骤以及内存释放步骤实现,极大地节约了开发过程中的关于动态内存的除错时间,同时大幅提高产品在这方面的稳定性和可靠性。
Description
【技术领域】
本发明涉及一种内存管理方法,特别涉及快速定位错误源头的内存管理方法。
【背景技术】
在嵌入式产品的软件开发过程中经常出现的动态内存问题包括:动态内存泄漏、动态内存错误地址、动态内存多次释放等,严重影响了嵌入式产品的开发进度、可靠性、稳定性。
随着嵌入式产品软件功能的日益复杂,同时客户对嵌入式产品的可靠性和稳定性要求越来越高,有必要找到一种相对简易同时快速但又要比较通用的动态内存管理方法,能够快速且准确定位内存错误的源头。现有技术中,一般是通过内存检测工具发现内存问题,常见的有动态检测工具和静态检测工具。动态检测工具中有代表性的有valgrind,静态检测工具中有代表性的有lint。valgrind是一款linux下寻找内存管理的问题的开源工具,虽然具有比较丰富的内存管理能力但仅能适用于x86/amd/ppc的硬件平台和linux的软件平台。lint是对程序进行更加广泛的错误分析,是一种更加严密的编译工具,但无法检测到软件中稍微复杂的动态内存使用问题,而面对更加微妙的内存分配策略,lint无法胜任。还有一种是特定IDE开发平台提供的针对特定平台的动态内存检测模块,典型的有vc++提供的debuger和crt堆除错函数,但是这些函数无法跨越软件平台。
【发明内容】
本发明要解决的技术问题,在于提供一种快速定位错误源头的内存管理方法,其可以快速发现内存的使用问题,同时具有无MCU依赖,支持检测有源代码模块的动态内存,也支持监测仅提供二进制形式的模块,全面监测软件中动态分配用到的各种应用编程接口。
本发明要解决的技术问题之一,在于提供一种快速定位错误源头的内存管理方法,其可以运行在绝大多数的mcu硬件架构上,也可以移植到支持c库的任意软件平台上。该方法可以快速发现内存的使用问题,通过查看静态管理块快速定位错误的源头,极大地节约了开发过程中的关于动态内存的除错时间,同时大幅提高产品的稳定性和可靠性。
本发明通过以下技术方案解决上述技术问题一:
一种快速定位错误源头的内存管理方法,所述内存管理方法适用于基于C语言的嵌入式软件,首先从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;其次,将所述静态内存划分为复数个静态管理块;
当动态分配新的内存时,执行内存分配登记步骤;当已分配的内存大小发生变化时,执行内存变更步骤;当已分配的内存需要释放时,执行内存释放步骤;
所述内存分配登记步骤具体为:
步骤1、查找未使用的静态管理块,若找到,执行步骤2,若未找到,输出错误信息并等待开发人员快速分析定位错误;
步骤2、动态分配内存,若分配成功,将被分配的内存的首地址和内存大小记录到所述静态管理块,并将该静态管理块标记为已使用;若分配不成功,输出错误信息并等待开发人员快速分析定位错误;
若需要多次动态分配内存,重复执行步骤1和步骤2;
所述内存变更步骤具体为:
步骤3、根据将要发生变更的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块;搜索到,执行步骤4,未搜索到,输出错误信息并等待;
步骤4、若变更后的内存大小比原来大,则重新动态分配内存,若分配成功,则将重新分配的内存的新首地址以及内存大小更新至所述静态管理块,若分配不成功,输出错误信息并等待开发人员快速分析定位错误;
若变更后的内存大小比原来小,则直接把变更后的内存大小直接更新所述静态管理块中;
所述内存释放步骤具体为:
步骤5、根据需要释放的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块,释放该内存,并将该静态管理块标记为未使用;若未搜索到,输出错误信息并等待开发人员快速分析定位错误。
进一步地,所述内存分配登记步骤通过Malloc或Calloc宏调用实现。
进一步地,所述内存变更步骤通过Realloc宏调用实现。
进一步地,所述内存变更步骤通过Free宏调用实现。
本发明要解决的技术问题之二,在于提供一种快速定位错误源头的内存管理方法,其可以运行在绝大多数的mcu硬件架构上,也可以移植到支持c++库的任意软件平台上。该方法可以快速发现内存的使用问题,通过查看静态管理块快速定位错误的源头,极大地节约了开发过程中的关于动态内存的除错时间,同时大幅提高产品的稳定性和可靠性。
本发明通过以下技术方案解决上述技术问题二:
一种快速定位错误源头的内存管理方法,所述内存管理方法适用于基于C++语言的嵌入式软件,首先,从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;其次,将所述静态内存划分为复数个静态管理块;
当动态分配新的内存时,执行内存分配登记步骤;当已分配的内存大小发生变化时,也必须重新分配新的内存,执行所述内存分配登记步骤;当已分配的内存需要释放时,执行内存释放步骤;
所述内存分配登记步骤具体为:
步骤10、查找未使用的静态管理块,若找到,执行步骤20,若未找到,输出错误信息并等待开发人员快速分析定位错误;
步骤20、动态分配内存,若分配成功,将被分配的内存的首地址和内存大小记录到所述静态管理块,并将该静态管理块标记为已使用;若分配不成功,输出错误信息并等待开发人员快速分析定位错误;
若需要多次动态分配内存,重复执行步骤10和步骤20;
所述内存释放步骤具体为:
步骤30、根据需要释放的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块,释放该内存,并将该静态管理块标记为未使用;若未搜索出,则输出错误信息并等待开发人员快速分析定位错误。
进一步地,所述内存分配登记步骤是通过重载C++库提供的new函数实现。
进一步地,所述内存释放步骤是通过重载C++库提供的delete函数实现。
本发明具有如下优点:本发明的内存管理方法可以基于c语言或c++语言开发,可以运行在绝大多数的mcu硬件架构上,也可以移植到基于c语言或c++语言的任意软件平台上。本发明通过查看记录有各个动态内存首地址和大小的静态管理块快速定位错误的源头,极大地节约了开发过程中的关于动态内存的除错时间,同时大幅提高产品的稳定性和可靠性。
【附图说明】
下面参照附图结合实施例对本发明作进一步的说明。
图1为本发明技术方案一的内存分配登记步骤流程图。
图2为本发明技术方案一的内存变更步骤流程图。
图3为本发明技术方案一的内存释放步骤流程图。
图4为本发明技术方案二的内存分配登记步骤流程图。
图5为本发明技术方案二的内存释放步骤流程图。
【具体实施方式】
技术方案一:
请参阅图1和图3,一种快速定位错误源头的内存管理方法,所述内存管理方法适用于基于C语言的嵌入式软件,首先从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;其次,将所述静态内存划分为复数个静态管理块;
当动态分配新的内存时,执行内存分配登记步骤,所述内存分配登记步骤通过Malloc或Calloc宏调用实现;当已分配的内存大小发生变化时,执行内存变更步骤,所述内存变更步骤通过Realloc宏调用实现;当已分配的内存需要释放时,执行内存释放步骤,所述内存变更步骤通过Free宏调用实现;
请参阅图1,所述内存分配登记步骤具体为:
步骤1、通过Malloc或Calloc宏调用,查找未使用的静态管理块,若找到,执行步骤2,若未找到,输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户静态管理块耗尽或动态内存耗尽,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存泄露错误;
步骤2、动态分配内存,若分配成功,将被分配的内存的首地址和内存大小记录到所述静态管理块,并将该静态管理块标记为已使用;若分配不成功,输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户静态管理块耗尽或动态内存耗尽,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存泄露错误;
若需要多次动态分配内存,重复执行步骤1和步骤2;
请参阅图2,所述内存变更步骤具体为:
步骤3、通过Realloc宏调用,根据将要发生变更的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块;搜索到,执行步骤4,未搜索到,输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户需要重新分配的动态内存首地址(宏参数)错误或动态内存耗尽,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存错误地址或动态内存泄露错误;
步骤4、若变更后的内存大小比原来大,则重新动态分配内存,若分配成功,则将重新分配的内存的新首地址以及内存大小更新至所述静态管理块,若分配不成功,输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户需要重新分配的动态内存首地址(宏参数)错误或动态内存耗尽,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存错误地址或动态内存泄露错误;
若变更后的内存大小比原来小,则直接把变更后的内存大小直接更新所述静态管理块中;
请参阅图3,所述内存释放步骤具体为:
步骤5、根据需要释放的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块,通过Free宏释放该内存,并将该静态管理块标记为未使用;若未搜索到,输出错误信息并等待开发人员快速分析定位错误,其输出的错误信息是提示用户需要释放的动态内存首地址(宏参数)错误,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存错误地址或单次分配而多次释放的错误。
所述静态管理块记录有各个被分配的动态内存的首地址和大小的静态管理块,因而可以通过静态管理块快速定位错误的源头,极大地节约了开发过程中的关于动态内存的除错时间,同时大幅提高产品的稳定性和可靠性。
技术方案二:
请参阅图4和图5,一种快速定位错误源头的内存管理方法,所述内存管理方法适用于基于C++语言的嵌入式软件,首先,从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;其次,将所述静态内存划分为复数个静态管理块;
当动态分配新的内存时,通过重载C++库提供的new函数,执行内存分配登记步骤;当已分配的内存大小发生变化时,也必须重新分配新的内存,执行所述内存分配登记步骤;当已分配的内存需要释放时,通过重载C++库提供的delete函数,执行内存释放步骤;
请参阅图4,所述内存分配登记步骤具体为:
步骤10、查找未使用的静态管理块,若找到,执行步骤20,若未找到,输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户静态管理块耗尽或动态内存耗尽,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存泄露错误;
步骤20、动态分配内存,若分配成功,将被分配的内存的首地址和内存大小记录到所述静态管理块,并将该静态管理块标记为已使用;若分配不成功,输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户静态管理块耗尽或动态内存耗尽,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存泄露错误;
若需要多次动态分配内存,重复执行步骤10和步骤20;
请参阅图5,所述内存释放步骤具体为:
步骤30、根据需要释放的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块,释放该内存,并将该静态管理块标记为未使用;若未搜索出,则输出错误信息并等待开发人员快速分析定位错误;其输出的错误信息是提示用户需要释放的动态内存首地址(宏参数)错误,同时可以打印出所有静态管理块的内部信息,该类错误可能是动态内存错误地址或单次分配而多次释放的错误。
本发明的内存管理方法可以基于c语言或c++语言开发,可以运行在绝大多数的mcu硬件架构上,也可以移植到基于c语言或c++语言的任意软件平台上。本发明通过查看记录有各个动态内存首地址和大小的静态管理块快速定位错误的源头,极大地节约了开发过程中的关于动态内存的除错时间,同时大幅提高产品的稳定性和可靠性。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。
Claims (7)
1.快速定位错误源头的内存管理方法,其特征在于:所述内存管理方法适用于基于C语言的嵌入式软件,首先从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;其次,将所述静态内存划分为复数个静态管理块;
当动态分配新的内存时,执行内存分配登记步骤;当已分配的内存大小发生变化时,执行内存变更步骤;当已分配的内存需要释放时,执行内存释放步骤;
所述内存分配登记步骤具体为:
步骤1、查找未使用的静态管理块,若找到,执行步骤2,若未找到,输出错误信息并等待开发人员快速分析定位错误;
步骤2、动态分配内存,若分配成功,将被分配的内存的首地址和内存大小记录到所述静态管理块,并将该静态管理块标记为已使用;若分配不成功,输出错误信息并等待开发人员快速分析定位错误;
若需要多次动态分配内存,重复执行步骤1和步骤2;
所述内存变更步骤具体为:
步骤3、根据将要发生变更的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块;搜索到,执行步骤4,未搜索到,输出错误信息并等待;
步骤4、若变更后的内存大小比原来大,则重新动态分配内存,若分配成功,则将重新分配的内存的新首地址以及内存大小更新至所述静态管理块,若分配不成功,输出错误信息并等待开发人员快速分析定位错误;
若变更后的内存大小比原来小,则直接把变更后的内存大小直接更新所述静态管理块中;
所述内存释放步骤具体为:
步骤5、根据需要释放的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块,释放该内存,并将该静态管理块标记为未使用;若未搜索到,输出错误信息并等待开发人员快速分析定位错误。
2.根据权利要求1所述的快速定位错误源头的内存管理方法,其特征在于:所述内存分配登记步骤通过Malloc或Calloc宏调用实现。
3.根据权利要求1所述的快速定位错误源头的内存管理方法,其特征在于:所述内存变更步骤通过Realloc宏调用实现。
4.根据权利要求1所述的快速定位错误源头的内存管理方法,其特征在于:所述内存变更步骤通过Free宏调用实现。
5.快速定位错误源头的内存管理方法,其特征在于:所述内存管理方法适用于基于C++语言的嵌入式软件,首先,从内存单元中预分配出部分内存作为静态内存,其余内存均为用于动态分配的内存;其次,将所述静态内存划分为复数个静态管理块;
当动态分配新的内存时,执行内存分配登记步骤;当已分配的内存大小发生变化时,也必须重新分配新的内存,执行所述内存分配登记步骤;当已分配的内存需要释放时,执行内存释放步骤;
所述内存分配登记步骤具体为:
步骤10、查找未使用的静态管理块,若找到,执行步骤20,若未找到,输出错误信息并等待开发人员快速分析定位错误;
步骤20、动态分配内存,若分配成功,将被分配的内存的首地址和内存大小记录到所述静态管理块,并将该静态管理块标记为已使用;若分配不成功,输出错误信息并等待开发人员快速分析定位错误;
若需要多次动态分配内存,重复执行步骤10和步骤20;
所述内存释放步骤具体为:
步骤30、根据需要释放的内存的首地址从所述静态内存中搜索出该首地址对应的静态管理块,释放该内存,并将该静态管理块标记为未使用,若未搜索出,则输出错误信息并等待开发人员快速分析定位错误。
6.根据权利要求5所述的快速定位错误源头的内存管理方法,其特征在于:所述内存分配登记步骤是通过重载C++库提供的new函数实现。
7.根据权利要求5所述的快速定位错误源头的内存管理方法,其特征在于:所述内存释放步骤是通过重载C++库提供的delete函数实现。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210436150.8A CN102981919B (zh) | 2012-11-02 | 2012-11-02 | 快速定位错误源头的内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210436150.8A CN102981919B (zh) | 2012-11-02 | 2012-11-02 | 快速定位错误源头的内存管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102981919A true CN102981919A (zh) | 2013-03-20 |
CN102981919B CN102981919B (zh) | 2015-07-01 |
Family
ID=47855975
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210436150.8A Active CN102981919B (zh) | 2012-11-02 | 2012-11-02 | 快速定位错误源头的内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102981919B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103064754A (zh) * | 2012-11-14 | 2013-04-24 | 福建升腾资讯有限公司 | 快速定位错误源头的内存管理方法 |
CN104808985A (zh) * | 2015-04-02 | 2015-07-29 | 小米科技有限责任公司 | 应用程序中对象的管理方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020035676A1 (en) * | 1997-09-25 | 2002-03-21 | Richard Weeks | Apparatus and method for allocating memory space for program use and management purposes |
CN1532708A (zh) * | 2003-03-19 | 2004-09-29 | 华为技术有限公司 | 一种静态内存管理方法 |
CN1570883A (zh) * | 2003-07-15 | 2005-01-26 | 中兴通讯股份有限公司 | 嵌入式实时操作系统中非缓冲内存动态分配方法 |
CN101149703A (zh) * | 2007-10-10 | 2008-03-26 | 中兴通讯股份有限公司 | 一种固定内存的管理方法 |
-
2012
- 2012-11-02 CN CN201210436150.8A patent/CN102981919B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020035676A1 (en) * | 1997-09-25 | 2002-03-21 | Richard Weeks | Apparatus and method for allocating memory space for program use and management purposes |
CN1532708A (zh) * | 2003-03-19 | 2004-09-29 | 华为技术有限公司 | 一种静态内存管理方法 |
CN1570883A (zh) * | 2003-07-15 | 2005-01-26 | 中兴通讯股份有限公司 | 嵌入式实时操作系统中非缓冲内存动态分配方法 |
CN101149703A (zh) * | 2007-10-10 | 2008-03-26 | 中兴通讯股份有限公司 | 一种固定内存的管理方法 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103064754A (zh) * | 2012-11-14 | 2013-04-24 | 福建升腾资讯有限公司 | 快速定位错误源头的内存管理方法 |
CN104808985A (zh) * | 2015-04-02 | 2015-07-29 | 小米科技有限责任公司 | 应用程序中对象的管理方法及装置 |
CN104808985B (zh) * | 2015-04-02 | 2019-02-19 | 小米科技有限责任公司 | 应用程序中对象的管理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102981919B (zh) | 2015-07-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3352083B1 (en) | Debugging method, multi-core processor, and debugging equipment | |
CN101599046B (zh) | 一种内存检测方法及装置 | |
US10949342B2 (en) | Persistent memory garbage collection | |
US6523141B1 (en) | Method and apparatus for post-mortem kernel memory leak detection | |
RU2011103059A (ru) | Пакеты компьютерных прикладных программ с индивидуальной настройкой | |
CN101308471B (zh) | 一种恢复数据的方法及装置 | |
CN111158741B (zh) | 监控业务模块对第三方类库依赖关系变化的方法及装置 | |
CN101339533A (zh) | 基于分区的诊断Java系统的内存泄漏的方法及装置 | |
CN100590598C (zh) | 内存泄露检查方法及装置 | |
US8683450B2 (en) | Systems, methods, and media for testing software patches | |
RU2009103626A (ru) | Программно-реализованная транзакционная защита управляемых указателей | |
CN102681938A (zh) | 一种内存泄漏检测方法及装置 | |
CN103713998A (zh) | 一种可扩展的在线静态代码缺陷分析方法 | |
CN103186400A (zh) | Web应用程序升级方法及系统 | |
US8898644B2 (en) | Efficient unified tracing of kernel and user events with multi-mode stacking | |
US20120174076A1 (en) | Systems and methods for profiling servers | |
CN102981919B (zh) | 快速定位错误源头的内存管理方法 | |
Seo et al. | A profiling method by PCB hooking and its application for memory fault detection in embedded system operational test | |
CN104102563A (zh) | 一种发现服务器系统的mca错误的方法及装置 | |
US20120266028A1 (en) | Electronic device and method for debugging programs | |
CN103049376A (zh) | 一种进程的内存溢出测试方法、装置及设备 | |
CN103176897B (zh) | 一种软件回归测试的方法及系统 | |
CN107766247A (zh) | Bootloader的测试方法、装置及可读存储介质 | |
CN103810087A (zh) | 测试应用程序性能的方法和装置 | |
CN110750579A (zh) | 一种云数据库Redis的高效内存分布方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |