检查指针异常的方法及系统与流程

文档序号:12596929阅读:301来源:国知局
检查指针异常的方法及系统与流程

本发明涉及计算机领域,尤其涉及一种检查指针异常的方法及系统。



背景技术:

在嵌入式系统中,包括通信领域的各种终端产品,经常会遇到因内存被非法改写而导致的系统性灾难,如功能异常,死机等。由于改写内存的线程或函数(通常称肇事者)的行为发生在“过去”,而出现问题的线程或函数(通常称被害者)发生灾难,则是在肇事之后的很长一段时间。因此,面对残留的现场,技术人员往往无法找到肇事者,无从分析发生问题的原因,更无从解决问题。

异常指针(通常称为:野指针)非法改写内存是非法改写内存的一种常用手段。该手段没有一般的系统性的方法解决。对该类问题,目前的方法是不停的加调试信息,不停的复现,逐步总结问题发生的规律,以缩小查找范围,直至找肇事者。这种分析定位野指针改写内存问题的方法,过程复杂,准确率低,尤其是在问题出现概率极其低的情况下,这更是一个非常痛苦并且消耗人力的过程。

因此,需要对现有的方式进行改进。



技术实现要素:

本发明实施例提供一种检查指针异常的方法及系统,用于解决现有技术中难于在第一时间发现异常指针的问题。

本发明实施例采用以下技术方案:

第一方面,提供一种检查指针异常的方法,包括:在检测到分配物理内存的操作时,建立与所分配的物理内存相映射的虚拟内存,并返回所建立的虚拟内存;通过所建立的映射关系,将读/写所述虚拟内存的操作转为相应的读/写所述物理内存的操作;检测是否接收到包含指向未与所述物理内存建立映射关系的虚拟内存的指针的读写操作指令,若是,则发出异常信息,反之,则通过所建立的映射关系,将读/写所述虚拟内存的操作转为相应的读/写所述物理内存的操作。

优选地,所述建立与所分配的物理内存相映射的虚拟内存的方式包括:预先将空闲的虚拟内存进行分组,根据所分配的物理内存的地址段来选取至少一组虚拟内存,并建立所选取的至少一组虚拟内存与所分配的物理内存之间的映射关系。

优选地,所述将空闲的虚拟内存进行分组的方式包括:按照空闲的虚拟内存的地址信息的顺序对空闲的虚拟内存进行分组;将每组的虚拟内存地址信息设置索引。

优选地,所述根据所分配的物理内存的地址段来选取至少一组虚拟内存的方式包括:按照使用频次由低到高的优先级次序,选取对应所分配的物理内存的地址段的至少一组虚拟内存。

优选地,所述方法还包括:在检测到所述物理内存被释放时,断开所述虚拟内存与所述物理内存之间的映射。

优选地,在断开所述虚拟内存与所述物理内存之间的映射的步骤之后,还包括:将所述虚拟内存的地址信息添加到空闲虚拟内存的地址信息列表的末尾。

第二方面,还提供一种检查指针异常的系统,包括:内存分配模块,用于在检测到分配物理内存的操作时,建立与所分配的物理内存相映射的虚拟内存, 并返回所建立的虚拟内存;读写操作模块,用于通过所建立的映射关系,将读/写所述虚拟内存的操作转为相应的读/写所述物理内存的操作;检查模块,用于检测是否接收到包含指向未与所述物理内存建立映射关系的虚拟内存的指针的读写操作指令,若是,则发出异常信息,反之,则执行所述读写操作模块。

优选地,所述内存分配模块用于预先将空闲的虚拟内存进行分组,根据所分配的物理内存的地址段来选取至少一组虚拟内存,并建立所选取的至少一组虚拟内存与所分配的物理内存之间的映射关系。

优选地,所述内存分配模块还用于按照空闲的虚拟内存的地址信息的顺序对空闲的虚拟内存进行分组;将每组的虚拟内存地址信息设置索引。

优选地,所述内存分配模块还用于按照使用频次由低到高的优先级次序,选取对应所分配的物理内存的地址段的至少一组虚拟内存。

优选地,所述系统还包括:内存释放模块,用于在检测到所述物理内存被释放时,断开所述虚拟内存与所述物理内存之间的映射关系。

优选地,所述内存释放模块还用于在断开所述虚拟内存与所述物理内存之间的映射之后,将所述虚拟内存的地址信息添加到空闲虚拟内存的地址信息列表的末尾。

如上所述,本发明的检查指针异常的方法及系统,具有以下有益效果:本方案能够直接确定并发出异常信息,由此实现了野指针潜伏在物理内存,导致后续应用软件调用该指针时造成的各种执行错误;将空闲的虚拟内存进行分组,并以分组形式建立映射关系,能够有效减少虚拟内存碎片的产生,提高虚拟内存的使用率;按照使用频次由低到高的优先级次序来选取对应所分配的物理内存的地址段的至少一组虚拟内存,能有效防止某些虚拟内存频繁被占用,所导致的异常指针未被释放的情况不易被发现的情况;将被释放的虚拟内存的地址 信息添加到空闲虚拟内存的地址信息列表的末尾,对应使用频次的优先级次序,便于所述检查系统在调用时索引空闲的虚拟内存。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据本发明实施例的内容和这些附图获得其他的附图。

图1是本发明的检查指针异常的方法的一个实施例的方法流程图。

图2是本发明的检查指针异常的方法的又一个实施例的方法流程图。

图3是本发明的检查指针异常的系统的一个实施例的结构方框图。

图4是本发明的检查指针异常的系统的又一个实施例的结构方框图。

具体实施方式

为使本发明解决的技术问题、采用的技术方案和达到的技术效果更加清楚,下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本发明提供一种检查指针异常的方法。所述检查方法主要由检查系统来执行。所述检查系统包括安装在电子设备中的软件和硬件。所述电子设备包括但不限于:计算机设备、移动设备、服务器设备等。所述电子设备中包括物理内存和虚拟内存。优选地,所述电子设备中还可包含用于管理物理 内存、虚拟内存的内存管理单元(MMU)。

在步骤S1中,所述检查系统在检测到分配物理内存的操作时,建立与所分配的物理内存相映射的虚拟内存,并返回所建立的虚拟内存。

具体地,所述检查系统可利用内存管理单元、或自行获取应用软件申请物理内存的指令。当应用软件发送所述指令以占用物理内存暂存数据时,所述检查系统在空闲的虚拟内存中选取对应于所分配的物理内存大小的虚拟内存,并建立与所分配的物理内存相映射的虚拟内存,将所建立的虚拟内存的地址信息(如地址信息列表、或地址信息段等)返回给相应的应用软件。

优选地,为了便于对虚拟内存的管理,减少虚拟内存碎片。所述检查系统建立与所分配的物理内存相映射的虚拟内存的方式为:预先将空闲的虚拟内存进行分组,根据所分配的物理内存的地址段来选取至少一组虚拟内存,并建立所选取的至少一组虚拟内存与所分配的物理内存之间的映射关系。

具体地,所述检查系统预先从空闲的虚拟内存中划出一部分作为用于映射的专用虚拟内存,并将其按照预设的大小进行分组,当有应用软件申请分配物理内存时,根据所分配的物理内存的大小选取至少一组虚拟内存,建立与所分配的物理内存之间的映射关系。

在此,若所述检查系统所选取的虚拟内存组大于所分配的物理内存时,可将所选取的虚拟内存组中多余的虚拟内存继续空闲处置;也可以将多余的虚拟内存优选分配给下一申请分配物理内存的应用软件。

优选地,所述检查系统可以按照空闲的虚拟内存的地址信息的顺序对空闲的虚拟内存进行分组。一种更快捷的方式是,所述检查系统将每组的虚拟内存地址信息设置索引。例如,所述检查系统从空闲虚拟内存中选取地址信息相邻的部分,并将其按照预设规则进行分组,再将各组的空闲虚拟内存地址信息作 链表管理。其中,所述预设规则包括但不限于:按照预设的地址段的长度、将所选取的地址信息平均分配、根据历史应用软件所申请的物理内存的大小而设置分组等。

在此,所述检查系统可以按照分组的顺序来选取对应所分配的物理内存的地址段的至少一组虚拟内存。优选地,所述检查系统按照使用频次由低到高的优先级次序,选取对应所分配的物理内存的地址段的至少一组虚拟内存。

具体地,在不划分专用的虚拟内存的情况下,所述检查系统优选选择近期未被使用的空闲虚拟内存组,以防止占用了其他直接调用虚拟内存的应用软件的正常运行。

在建立了上述映射关系之后,所述应用软件将向所分配的虚拟内存发送读写指令,此时,所述检查系统执行步骤S2。

在步骤S2中,所述检查系统通过所建立的映射关系,将读/写所述虚拟内存的操作转为相应的读/写所述物理内存的操作。

具体地,所述检查系统根据占用所分配的虚拟内存的应用软件的读写操作指令,通过所述映射关系执行将数据写入所述物理内存、或从所述物理内存中读取数据的操作。

当应用软件不再需要占用物理内存时,将输出释放内存的指令。基于该释放内存的指令,所述检查系统执行步骤S3。如图2所示。

在步骤S3中,所述检查系统在检测到所述物理内存被释放时,断开所述虚拟内存与所述物理内存之间的映射。

具体地,所述检查系统在接收到所述释放内存的指令时,不但清空所分配的物理内存,还删除其与虚拟内存的映射关系,使得所占用的虚拟内存恢复至空闲虚拟内存。

例如,所述检查系统在接收到所述释放内存的指令时,断开所占用的虚拟内存组与所述物理内存之间的映射,以得到一块地址段完整的空闲虚拟内存。如此能够减少虚拟内存碎片产生。

优选地,所述检查系统将所述虚拟内存的地址信息添加到空闲虚拟内存的地址信息列表的末尾。

具体地,所述检查系统对所管理的空闲的虚拟内存进行列表式的索引管理,当产生新的空闲虚拟内存时,将其地址信息放在该列表的末尾,以便降低其被占用的频率。由此可以有效提高异常指针的发现几率。

例如,所述检查系统预先将空闲的虚拟内存组进行链表式的索引管理。当产生新的空闲虚拟内存组时,所述检查系统将所述新的空闲虚拟内存组所对应的地址信息添加到该链表的末尾。当所述检查系统依据新的读写操作指令占用空闲虚拟内存组时,可从该链表的前端选取至少一个空闲的虚拟内存组。

在上述步骤S2、甚至步骤S3的执行过程中,所述检查系统还执行步骤S4。

在步骤S4中,所述检查系统检测是否接收到包含指向未与所述物理内存建立映射关系的虚拟内存的指针的读写操作指令,若是,则发出异常信息,反之,则通过所建立的映射关系,将读/写所述虚拟内存的操作转为相应的读/写所述物理内存的操作。

具体地,所述检查系统一方面通过所述映射关系帮助应用软件执行读/写内存数据的操作。另一方面还管理其他空闲的虚拟内存。当接收到包含了指向未与所述物理内存建立映射关系的虚拟内存的指针的读写操作指令时,所述检查系统将暂停所有应用软件的读/写内存数据的操作,并发出包含所述读写操作指令的异常信息。如此,技术人员能够及时发现指针异常的异常报告,并及时进行处理。反之,则执行步骤S2。

例如,所述检查系统接收到包含读取指向虚拟内存a1的指针的读写操作指令,检测已建立所述映射关系中是否包含虚拟内存a1,若是,则按照所述映射关系读取与所述虚拟内存a1相对应的物理内存b1中的数据。反之,则发出异常信息。

或者,所述检查系统还检查在执行步骤S3以后,仍有指针指向已空闲的虚拟内存时,所述检查系统发出异常信息。

如图3所示,本发明提供一种检查指针异常的系统。所述检查系统1包括安装在电子设备中的软件和硬件。所述电子设备包括但不限于:计算机设备、移动设备、服务器设备等。所述电子设备中包括物理内存和虚拟内存。优选地,所述电子设备中还可包含用于管理物理内存、虚拟内存的内存管理单元(MMU)。

所述检查系统1中包括:内存分配模块11、读写操作模块12、检查模块14。

所述内存分配模块11用于在检测到分配物理内存的操作时,建立与所分配的物理内存相映射的虚拟内存,并返回所建立的虚拟内存。

具体地,所述内存分配模块11可利用内存管理单元、或自行获取应用软件申请物理内存的指令。当应用软件发送所述指令以占用物理内存暂存数据时,所述内存分配模块11在空闲的虚拟内存中选取对应于所分配的物理内存大小的虚拟内存,并建立与所分配的物理内存相映射的虚拟内存,将所建立的虚拟内存的地址信息(如地址信息列表、或地址信息段等)返回给相应的应用软件。

优选地,为了便于对虚拟内存的管理,减少虚拟内存碎片。所述内存分配模块11建立与所分配的物理内存相映射的虚拟内存的方式为:预先将空闲的虚拟内存进行分组,根据所分配的物理内存的地址段来选取至少一组虚拟内存,并建立所选取的至少一组虚拟内存与所分配的物理内存之间的映射关系。

具体地,所述内存分配模块11预先从空闲的虚拟内存中划出一部分作为用于映射的专用虚拟内存,并将其按照预设的大小进行分组,当有应用软件申请分配物理内存时,根据所分配的物理内存的大小选取至少一组虚拟内存,建立与所分配的物理内存之间的映射关系。

在此,若所述内存分配模块11所选取的虚拟内存组大于所分配的物理内存时,可将所选取的虚拟内存组中多余的虚拟内存继续空闲处置;也可以将多余的虚拟内存优选分配给下一申请分配物理内存的应用软件。

优选地,所述内存分配模块11可以按照空闲的虚拟内存的地址信息的顺序对空闲的虚拟内存进行分组。一种更快捷的方式是,所述内存分配模块11将每组的虚拟内存地址信息设置索引。例如,所述内存分配模块11从空闲虚拟内存中选取地址信息相邻的部分,并将其按照预设规则进行分组,再将各组的空闲虚拟内存地址信息作链表管理。其中,所述预设规则包括但不限于:按照预设的地址段的长度、将所选取的地址信息平均分配、根据历史应用软件所申请的物理内存的大小而设置分组等。

在此,所述内存分配模块11可以按照分组的顺序来选取对应所分配的物理内存的地址段的至少一组虚拟内存。优选地,所述内存分配模块11按照使用频次由低到高的优先级次序,选取对应所分配的物理内存的地址段的至少一组虚拟内存。

具体地,在不划分专用的虚拟内存的情况下,所述内存分配模块11优选选择近期未被使用的空闲虚拟内存组,以防止占用了其他直接调用虚拟内存的应用软件的正常运行。

在建立了上述映射关系之后,所述应用软件将向所分配的虚拟内存发送读写指令,此时,所述检查系统1执行读写操作模块12。

所述读写操作模块12用于通过所建立的映射关系,将读/写所述虚拟内存的操作转为相应的读/写所述物理内存的操作。

具体地,所述读写操作模块12根据占用所分配的虚拟内存的应用软件的读写操作指令,通过所述映射关系执行将数据写入所述物理内存、或从所述物理内存中读取数据的操作。

优选地,所述检查系统还包括:内存释放模块13。当应用软件不再需要占用物理内存时,将输出释放内存的指令。基于该释放内存的指令,所述检查系统1执行所述内存释放模块13。如图4所示。

所述内存释放模块13用于在检测到所述物理内存被释放时,断开所述虚拟内存与所述物理内存之间的映射。

具体地,所述内存释放模块13在接收到所述释放内存的指令时,不但清空所分配的物理内存,还删除其与虚拟内存的映射关系,使得所占用的虚拟内存恢复至空闲虚拟内存。

例如,所述内存释放模块13在接收到所述释放内存的指令时,断开所占用的虚拟内存组与所述物理内存之间的映射,以得到一块地址段完整的空闲虚拟内存。如此能够减少虚拟内存碎片产生。

优选地,所述内存释放模块13将所述虚拟内存的地址信息添加到空闲虚拟内存的地址信息列表的末尾。

具体地,所述内存释放模块13对所管理的空闲的虚拟内存进行列表式的索引管理,当产生新的空闲虚拟内存时,将其地址信息放在该列表的末尾,以便降低其被占用的频率。由此可以有效提高异常指针的发现几率。

例如,所述内存释放模块13预先将空闲的虚拟内存组进行链表式的索引管理。当产生新的空闲虚拟内存组时,所述内存释放模块13将所述新的空闲虚拟 内存组所对应的地址信息添加到该链表的末尾。当所述内存释放模块13依据新的读写操作指令占用空闲虚拟内存组时,可从该链表的前端选取至少一个空闲的虚拟内存组。

在上述读写操作模块12、甚至内存释放模块13的执行过程中,所述检查系统1还执行检查模块14。

所述检查模块14用于检测是否接收到包含指向未与所述物理内存建立映射关系的虚拟内存的指针的读写操作指令,若是,则发出异常信息,反之,则执行所述读写操作模块12。

具体地,所述检查模块14一方面通过所述映射关系帮助应用软件执行读/写内存数据的操作。另一方面还管理其他空闲的虚拟内存。当接收到包含了指向未与所述物理内存建立映射关系的虚拟内存的指针的读写操作指令时,所述检查模块14将暂停所有应用软件的读/写内存数据的操作,并发出包含所述读写操作指令的异常信息。如此,技术人员能够及时发现指针异常的异常报告,并及时进行处理。反之,则执行所述读写操作模块12。

例如,所述检查模块14接收到包含读取指向虚拟内存a1的指针的读写操作指令,检测已建立所述映射关系中是否包含虚拟内存a1,若是,则按照所述映射关系读取与所述虚拟内存a1相对应的物理内存b1中的数据。反之,则发出异常信息。

或者,所述检查模块14还在所述内存释放模块13释放物理内存以后,检查到仍有指针指向已空闲的虚拟内存时,发出异常信息。

综上所述,本发明的检查指针异常的方法及系统,通过将直接分配给应用软件的物理内存转为对应分配虚拟内存并映射到所分配的物理内存的方式,来隔离应用软件与物理内存的直接交互,当有异常的指针(野指针)指向未建立 映射关系的虚拟内存时,本方案能够直接确定并发出异常信息,由此实现了野指针潜伏在物理内存,导致后续应用软件调用该指针时造成的各种执行错误;将空闲的虚拟内存进行分组,并以分组形式建立映射关系,能够有效减少虚拟内存碎片的产生,提高虚拟内存的使用率;按照使用频次由低到高的优先级次序来选取对应所分配的物理内存的地址段的至少一组虚拟内存,能有效防止某些虚拟内存频繁被占用,所导致的异常指针未被释放的情况不易被发现的情况;将被释放的虚拟内存的地址信息添加到空闲虚拟内存的地址信息列表的末尾,对应使用频次的优先级次序,便于所述检查系统在调用时索引空闲的虚拟内存。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。

上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1