专利名称:一种内存检测方法及装置的制作方法
技术领域:
本发明属于存储器领域,尤其涉及一种内存检测方法及装置。
背景技术:
内存管理在计算机系统设计中是极其重要的,高效的内存分配、释放和整理在应用中已越来越重要,内存在使用过程中经常出现内存溢出、内存异常或者野指针等现象,导致计算机程序异常或者错误,严重时将导致计算机死机,因此内存的检测对计算机系统和计算机程序是非常重要的。其中内存溢出是指计算机程序按照指定的大小分配内存区域存储数据后,写入内存的数据超出预先分配的内存区域,从而导致改写了其他内存区域的数据。内存异常是指计算机程序按照指定的大小分配内存区域后,该内存区域内的数据被非法改写。野指针是指向"垃圾"内存的指针, 一般是指未被初始化的指针变量,或者指针变量已被释放但在其他地方依旧使用的指针。
在大型的计算机程序中, 一般需要从计算机操作系统中为该计算机程序分配一块内存,并有计算才几程序自行对这块内存进行管理以获得更快的内存分配和释放速度。在现有的需要自行进行内存管理的计算才几程序中, 一般不对内存进行检测,或者仅对内存的申请和释放进行管理,再在计算机程序退出时简单的检测内存泄漏,这种内存检测方法难以在计算机程序运行过程中检测出内存异常、内存溢出或者野指针等现象,在计算机程序出错时,增加了定位内存异常、内存溢出或者野指针等现象的难度,降低了计算机程序效率。
发明内容
本发明实施例的目的在于提供一种内存4全测方法,旨在解决现有内存才企测方法难以及时检测出内存溢出、异常等错误的问题。
本发明实施例是这样实现的, 一种内存检测方法,所述方法包括下述步骤
A、 为不同状态的内存设置对应的状态值;
B、 对内存使用情况进行检测,根椐内存的状态值判断内存是否发生内存错误。
本发明实施例的另一目的在于提供一种内存检测装置,所述装置包括状态值设置单元,用于为不同状态的内存设置对应的状态值;内存检测单元,用于对内存使用情况进行检测,才艮据所述状态值设置单元设置的内存的状态值判断内存是否发生内存错误。
在本发明实施例中,根据内存的不同状态为内存设置对应的状态值,对内存使用情况进行检测,根据内存的状态值判断内存是否发生内存溢出、异常或者野指针现象,/人而可以及时、快速、有效的在计算才几程序运4亍过程中检测出内存中发生的内存溢出、异常或者野指针等错误现象,减少了计算机程序的隐患,给程序调试带来方便。
图1是本发明实施例提供的内存检测方法的实现流程图;图2是本发明实施例提供的内存检测装置的结构框图。
具体实施例方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明实施例中,根据内存的使用状态为内存设置对应的状态值,在使用内存或者内存中的数据时,通过检测该内存的状态值判断该内存是否发生内存错误,如内存溢出、异常或者野指针现象。
6图1示出了本发明实施例提供的内存检测方法的实现流程,详述如下在步骤S101中,为不同状态的内存设置对应的状态值。其具体步骤如下
A、 在对内存进行初始化时,设置该内存的状态值为已初始化。在本发明实施例中,可以通过将该内存中的数据填充为用于标识该内存的状态值为已初始化的数据,如可以将该内存中的数据填充为Oxab,以标识该内存的状态值为已初始4t。
B、 在释放一块内存时,设置该内存的状态值为已释放。在本发明实施例中,可以通过将该内存中的数据填充为用于标识该内存的状态值为已释放的数据,如可以将该内存中的数据填充为Oxfe,以标识该内存的状态值为已释放。
C、 在申请或者重新分配一块内存时,设置该内存的状态值为已申请但未被初始化,并为申请的内存多分配大小为n字节的内存,用于存储申请到的内存的初始值(以后称为magic值)。该magic值一般选择用户数据出现概率较小的一个值。在本发明实施例中,可以通过将已申请到的内存中的数据填充为用于标识该内存的状态值为已申请但未被初始化的数据,如可以将已申请到的内存中的数据填充为0xcd,以标识该内存的状态值为已申请但未^:初始化。其具体步骤如下
a、 在申请或者重新分配一块内存时,在内存地址管理器中记录分配内存代码所对应的文件名和行号,并为申请的内存多分配大小为n字节的内存。其中n为大于或者等于2的自然数。如申请或者重新分配一块内存时,为申请的内存多分配8个字节的内存;
b、 在申请到的内存的前x字节填充第一初始值(以后称为第一 magic值),在申请到的内存的最后y字节填充第二初始值(以后称为第二magic值),以标识申请到的内存的上、下限。其中x、 y均为大于或者等于l且小于n的自然数,lx + y=n。如给申请到的内存的前4字节填充第一magic值为F1F2F3F4,给申请到的内存的最后4个字节填充第二 magic值为F5F6F7F8;
c、 设置已申请到给计算机程序使用的内存的状态值为已申请但未被初始化。如可以将已申请到给计算机程序使用的内存中的数据填充为Oxcd,以标识该内存的状态值为已申请但未被初始化。即该内存中存储的数据是未被初始化的。
请参阅表l.l,为本发明实施例提供的计算机程序申请前、申请到、释放一块内存时内存中的实际数据的一个示例。其中ptr(CD)是指申请到的给计算机程序使用的内存。对于已经初始化的内存,该内存中的数据被填充为Oxab,对于已释放的内存,该内存中的数据被填充为Oxfe,对于已经申请到的内存,该内存的前端部分的数据;陂填充为F1F2F3F4,该内存的后端部分的数据被填充为F5F6F7F8,已申请到给计算才/l4呈序使用的内存,其内存中的数据被填充为Oxcd。
表l.l
…ABABABABABABABAB...ABABABAB...
…F1F2F3F4ptr (CD)F5F6F7F8…
…FEFEFEFEFEFEFEFE…FEFEFEFE…
…F1F2F3F4CDCDCDCD…F5F6F7F8…
在步骤S102中,对内存使用情况进行检测,根据内存的状态值判断内存是否发生错误。其中内存发生错误包括但不限于内存溢出、内存异常、使用未初始化变量或者野指4t"等现象。其具体步骤如下
A、 检测已申请的内存的magic值是否与申请内存时设置的magic值相同,以判断已申请的内存是否发生了内存溢出或者内存异常。其具体过程如下
检测已申请的内存的第一 magic值是否被改写,如果是,则判定此内存发生了内存异常,检测已申请的内存的第二 magic值是否被覆盖,如果是,则判定该内存发生了内存溢出。
如当检测到已申请的内存的前端部分的第一 magic值F1F2F3F4被改写了 ,则判定此内存发生了内存异常,当检测到该内存的后端部分的第二 magic值F5F6F7F8^皮覆盖了,则判定该内存发生了内存溢出。
B、 检测未被分配的内存的状态值是否为已初始化或者已释放,以判断未被分配的内存是否发生了内存异常。其具体过程如下
检测未被分配的内存的状态值是否为已初始化或者已释放,如果不是,则判定未被分配的内存发生了内存异常,即判定未被分配的内存被非法改写了 。
为了达到更好的内存检测效果,在本发明另一实施例中,该方法还包括下述步骤
C、 检测计算机程序使用的数据是否为状态值为已申请但未被初始化的内存中的数据,以判断是否发生了变量未被初始化就使用的现象。其具体判断过程如下
检测计算机程序使用的数据是否为状态值为已申请但未被初始化的内存中的数据,如果是,则判定发生了变量未被初始化就使用的现象。如当通过将已申请到的给计算机程序使用的内存中的数据填充为Oxcd来设置该内存的状态值为已申请但未被初始化时,则如果检测到计算机程序使用的数据是Oxcd,则判定发生了变量未被初始化就使用的现象。
为了更好的内存检测效果,在本发明另一实施例中,该方法还包括下述步
骤
D、 检测计算机程序使用的指针数据是否为状态值为已释放的内存中的数据,以判断是否发生了野指针引用现象。其具体判断过程如下
检测计算机程序使用的指针数据是否为状态值为已释放的内存中的数据,如果是,则判定发生了野指针引用现象。如当通过将已释放的内存中的数据填充为Oxfe来设置该内存的状态值为已释放时,则如果检测到计算机程序使用的指针数据是Oxfe,则判定发生了野指针引用现象。
为了及时的将内存4企测结果呈现给用户,以使用户尽快的定位到内存错误的位置和原因,在本发明另一实施例中,该方法还包"^下述步骤
在步骤S103中,输出内存检测结果。
在本发明实施例中,对S102中出现的各种异常的输出过程具体如下
A、输出发生了何种异常,根据对应检测的到内存异常的地址,在内存地
9址管理器查询对应的文件名和行数,并在内存地址管理器查询此内存地址的前一块和后一块已分配的内存所对应的文件名和行数,输出对应的异常内存的文件名和行数,以及对应可能导致此内存异常的紧邻的前后内存所对应的文件名和行数。
B、 输出发生了何种异常,根据产生异常的内存地址,在内存地址管理器查询此内存地址的前一块和后一块已分配的内存所对应的文件名和行数,输出异常的内存地址和对应可能导致此内存异常的紧邻的前后内存所对应的文件名
和行数o
C、 输出发生了何种异常,并根据内存地址在内存地址管理器查询对应的文件名和行数,输出对应的文件名和行数。
D、 输出发生了何种异常,并根据内存地址在内存地址管理器查询对应的文件名和行it,输出对应的文件名和行数。
图2示出了本发明实施例提供的内存检测装置的结构,为了便于说明,仅示出了与本发明实施例相关的部分。该内存检测装置可以是内置于具有内存应用的电子设备中的软件单元、硬件单元或者软硬件相结合的单元,或者作为独立的挂件集成到具有内存应用的电子设备中。其中
状态值设置单元1为不同状态的内存设置对应的状态值。该状态值设置单元1包括初始化状态值设置单元11、释放状态值设置单元12和已申请状态值设置单元13。其中
初始化状态值设置单元11在对内存进行初始化时,i殳置该内存的状态值为已初始化。在本发明实施例中,可以通过将该内存中的彩:据填充为用于标识该内存的状态值为已初始化的数据,如可以将该内存中的凄t据填充为Oxab,以标识该内存的状态值为已初始化。
释放状态值设置单元12在释放一块内存时,设置该内存的状态值为已释放。在本发明实施例中,可以通过将该内存中的数据填充为用于标识该内存的状态值为已释放的数据,如可以将该内存中的数据填充为Oxfe,以标识该内存的状态值为已释i丈。
已申请状态值设置单元13在申请或者重新分配一块内存时,设置该内存的 状态值为已申请但未被初始化,并为申请的内存多分配大小为n字节的内存, 用于存储申请到的内存的magic值。在本发明实施例中,可以通过将已申请到 给计算机程序使用的内存中的数据填充为用于标识该内存的状态值为已申请但 未被初始化的数据,如可以将已申请到给计算机程序使用的内存中的数据填充 为Oxcd,以标识该内存的状态值为已申请但未被初始化。
该已申请状态值设置单元13包括内存分配模块131、初始值设置模块132 和已申请状态值设置模块133。其中
内存分配模块131在申请或者重新分配一块内存时,为申请的内存多分配 大小为n字节的内存。其中n为大于或者等于2的自然数。如申请或者重新分 配一块内存时,为申请的内存多分配8个字节的内存;
初始值设置模块132在申请到的内存的前x字节填充第一magic值,给申 请到的内存的最后y字节填充第二 magic值,以标识申请到的内存的上、下限。 其中x、 y均为大于或者等于1且小于n的自然数,且x + y-n。如给申请到的 内存的前4字节填充第一 magic值为F1F2F3F4,给申请到的内存的最后4个字 节填充第二 magic值为F5F6F7F8;
已申请状态值设置模块133设置已申请到给计算机程序使用的内存的状态 值为已申请但未被初始化。如可以将已申请到给计算机程序使用的内存中的数 据填充为0xcd,以标识该内存的状态值为已申请但未被初始化。即该内存中存 储的数据是未被初始化的。
内存检测单元2对内存使用情况进行检测,根据内存的状态值判断内存是 否发生错误。其中内存发生错误包括但不限于内存溢出、内存异常、使用未初 始化变量或者野指针等现象。该内存检测单元2包括已申请内存检测单元21 和未分配内存4企测单元22。其中
已申请内存检测单元21检测已申请的内存的magic值 否与申请内存时设置的magic值相同,以判断已申请的内存是否发生了内存溢出或者内存异常。 其具体过程如下
检测已申请的内存的第一 magic值是否被改写,如果是,则判定此内存发 生了内存异常,检测已申请的内存的第二 magic值是否^史覆盖,如果是,则判 定该内存发生了内存溢出。
如当^企测到已申请的内存的前端部分的第一 magic值F1F2F3F4被改写了 , 则判定此内存发生了内存异常,当检测到该内存的后端部分的第二 magic值 F5F6F7F8被覆盖了 ,则判定该内存发生了内存溢出。
未分配内存检测单元22检测未被分配的内存的状态值是否为已初始化或 者已释放,以判断未被分配的内存是否发生了内存异常。其具体过程如下
检测未被分配的内存的状态值是否为已初始化或者已释放,如果不是,则 判定未被分配的内存发生了内存异常,即判定未被分配的内存被非法改写了 。
为了达到更好的内存检测效果,在本发明另一实施例中,内存检测单元2 还包括未初始化检测单元23。该未初始化检测单元23检测计算机程序使用的 数据是否为状态值为已申请但未被初始化的内存中的数据,以判断是否发生了 变量未被初始化就使用的现象。其具体判断过程如下
检测计算机程序使用的数据是否为状态值为已申请但未被初始化的内存中 的数据,如果是,则判定发生了变量未被初始化就使用的现象。如当通过将已 申请到的给计算机程序使用的内存中的数据填充为Oxcd来设置该内存的状态 值为已申请但未被初始化时,则如果检测到计算机程序使用的数据是Oxcd,则 判定发生了变量未被初始化就使用的现象。
为了更好的内存检测效果,在本发明另一实施例中,内存检测单元2还包 括野指针检测单元24。该野指针检测单元24检测计算机程序使用的指针数据 是否为状态值为已释放的内存中的数据,以判断是否发生了野指针引用现象。 其具体判断过程如下
检测计算机程序使用的指针数据是否为状态值为已释放的内存中的数据,
12如果是,则判定发生了野指针引用现象。如当通过将已释放的内存中的数据填
充为Oxfe来设置该内存的状态值为已释放时,则如果检测到计算机程序使用的 指针数据是Oxfe,则判定发生了野指针引用现象。
为了及时的将内存4企测结辱呈现给用户,以使用户尽快的定位到内存错误 的位置和原因,在本发明另一实施例中,该装置还包括-险测结果输出单元3。 该检测结果输出单元3输出内存检测结果。其中输出单元3输出内存检测单元 2检测到的各种异常的过程具体如下
A、 输出发生了何种异常,根据对应检测的到内存异常的地址,在内存地 址管理器查询对应的文件名和^f亍数,并在内存地址管理器查询此内存地址的前 一块和后一块已分配的内存所对应的文件名和行数,输出对应的异常内存的文 件名和行数,以及对应可能导致此内存异常的紧邻的前后内存所对应的文件名 和行数。
B、 输出发生了何种异常,根据产生异常的内存地址,在内存地址管理器 查询此内存地址的前一块和后一块已分配的内存所对应的文件名和4亍数,输出 异常的内存地址和对应可能导致此内存异常的紧邻的前后内存所对应的文件名 和行数0
C、 输出发生了何种异常,并根据内存地址在内存地址管理器查询对应的 文件名和行数,输出对应的文件名和行数。
D、 输出发生了何种异常,并根据内存地址在内存地址管理器查询对应的 文件名和行数,输出对应的文件名和行数。
在本发明实施例中,根据内存的不同状态为内存设置对应的状态值,对内 存使用情况进行检测,根据内存的状态值判断内存是否发生内存溢出、异常或 者野指针现象,可以及时、快速、有效的检测出内存中发生的内存溢出、异常 或者野指针现象,减少计算机程序的隐患,方^f更程序调试。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发 明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1、一种内存检测方法,其特征在于,所述方法包括下述步骤A、为不同状态的内存设置对应的状态值;B、对内存使用情况进行检测,根据内存的状态值判断内存是否发生内存错误。
2、 如权利要求l所述的方法,其特征在于,所述内存错误包括内存溢出、异常、使用未初始化变量或者野指针现象。
3、 如权利要求1或2所述的方法,其特征在于,所述步骤A具体包括Al、在对内存进行初始化时,设置该内存的状态值为已初始化;A2、在释放一块内存时,设置该内存的状态值为已释放;A3、在申请或者重新分配一块内存时,设置该内存的状态值为已申请但未被初始化,并为申请的内存多分配大小为n字节的内存,用于存储申请到的内存的初始^直。
4、 如权利要求3所述的方法,其特征在于,所述步骤A3具体包括在申请或者重新分配一块内存时,为申请的内存多分配大小为n字节的内存,所述n为大于或者等于2的自然数;在申请到的内存的前x字节填充第一初始值,在申请到的内存的最后y字节填充第二初始值,以标识申请到的内存的上、下限;设置已申请到给计算机程序使用的内存的状态值为已申请但未被初始化。
5、 如权利要求3所述的方法,其特征在于,所述步骤B具体包括Bl、检测已申请的内存的初始值是否与申请内存时设置的初始值相同,以判断已申请的内存是否发生了内存溢出或者内存异常;B2、检测未被分配的内存的状态值是否为已初始化或者已释放,以判断未被分配的内存是否发生了内存异常。
6、 如权利要求5所述的方法,其特征在于,所述步骤B还包括检测计算机程序使用的数据是否为状态值为已申请但未被初始化的内存中的数据,以判断是否发生了变量未被初始化就使用的现象;和/或检测计算机程序使用的指针数据是否为状态值为已释放的内存中的数据,以判断是否发生了野指针引用现象。
7、 一种内存检测装置,其特征在于,所述装置包括状态值设置单元,用于为不同状态的内存设置对应的状态值;内存4全测单元,用于对内存使用情况进行检测,才艮据所述状态值设置单元设置的内存的状态值判断内存是否发生内存错误。
8、 如权利要求7所述的装置,其特征在于,所述状态值设置单元包括初始化状态值设置单元,用于在对内存进行初始化时,设置该内存的状态值为已初始化;释放状态值设置单元,用于在释放一块内存时,设置该内存的状态值为已释放;已申请状态值设置单元,用于在申请或者重新分配一块内存时,设置该内存的状态值为已申请但未被初始化,并为申请的内存多分配大小为n字节的内存,用于存储申请到的内存的初始值。
9、 如权利要求8所述的装置,其特征在于,所述已申请状态值设置单元具体包括内存分配模块,用于在申请或者重新分配一块内存时,为申请的内存多分配大小为n字节的内存,所述n为大于或者等于2的自然数;初始值设置模块,用于在申请到的内存的前x字节填充第一初始值,在申请到的内存的最后y字节填充第二初始值,以标识申请到的内存的上、下限;已申请状态值设置模块,用于设置已申请到给计算机程序使用的内存的状态值为已申请但未4皮初始化。
10、 如权利要求8所述的装置,其特征在于,所述内存检测单元包括已申请内存检测单元,用于检测已申请的内存的初始值是否与申请内存时设置的初始值相同,以判断已申请的内存是否发生了内存溢出或者内存异常;未分配内存检测单元,用于检测未被分配的内存的状态值是否为已初始化或者已释放,以判断未被分配的内存是否发生了内存异常。
11、如权利要求IO所述的装置,其特征在于,所述内存检测单元还包括未初始化检测单元,用于检测计算机程序使用的数据是否为状态值为已申请但未被初始化的内存中的数据,以判断是否发生了变量未被初始化就使用的现象;和/或野指针检测单元,用于检测计算机程序使用的指针数据是否为状态值为已释放的内存中的数据,以判断是否发生了野指针引用现象。
全文摘要
本发明适用于存储器领域,提供了一种内存检测方法及装置,所述方法包括下述步骤A.为不同状态的内存设置对应的状态值;B.对内存使用情况进行检测,根据内存的状态值判断内存是否发生内存错误。本发明实施例通过根据内存的不同状态为内存设置对应的状态值,对内存使用情况进行检测,根据内存的状态值判断内存是否发生内存溢出、异常或者野指针现象,从而可以及时、快速、有效的在计算机程序运行过程中检测出内存中发生的内存溢出、异常或者野指针等错误现象,减少了计算机程序的隐患,给程序调试带来方便。
文档编号G06F11/36GK101599046SQ20091010813
公开日2009年12月9日 申请日期2009年6月26日 优先权日2009年6月26日
发明者徐佳宏, 王美聪, 程伯钦, 伟 聂 申请人:深圳市茁壮网络股份有限公司