本发明涉及内存检测,特别涉及一种内存报错检测方法及装置。
背景技术:
1、目前的应用程序存在内存泄漏等内存错误问题时,往往是需要开发人员手动检查代码来防止错误,并且错误排查的时机一般是在程序因内存泄漏而崩溃时再去排查。
2、通过人工检查代码的方式,不一定能完全排查完内存错误,在一些较大的项目代码中难免会造成疏漏,且比较费时费力。
技术实现思路
1、本发明提供一种内存报错检测方法及装置,能够提高内存报错的检测效率和精度。
2、鉴于此,本发明一方面提供一种内存报错检测方法,所述方法包括:
3、接收内存报错信息,并识别所述内存报错信息表征的报错类型;
4、若所述报错类型表征内存非法使用,检测所述内存报错信息对应的内存分配结果和所述内存分配结果对应的操作函数;
5、获取所述操作函数的实时操作对象和所述实时操作对象的属性值,并基于所述属性值,确定所述实时操作对象的理论分配结果;
6、将所述理论分配结果与所述内存分配结果进行对比,并基于对比结果判断所述实时操作对象的属性值是否被错误引用。
7、在一个实施方式中,所述方法还包括:
8、若所述报错类型表征内存被非法访问,截取针对内存的访问操作,并判断所述访问操作是否合法;
9、基于判断结果,过滤不合法的访问操作,并放行合法的访问操作。
10、在一个实施方式中,判断所述访问操作是否合法包括:
11、利用影子存储器验证所述访问操作指向的内存的合法性,以基于所述影子存储器输出的验证结果,判断所述访问操作是否合法。
12、在一个实施方式中,所述方法还包括:
13、若所述报错类型表征栈溢出,在函数对栈内数据的调用过程中,在调用的数据内写入随机数;
14、接收函数的返回结果,并判断所述返回结果中的随机数与写入的随机数是否一致,若不一致,判定所述函数调用存在栈溢出的情况。
15、在一个实施方式中,所述方法还包括:
16、在栈的顶部设置保护页,并在函数对栈内数据发起调用后,检测所述函数的返回结果中包含的保护页的数据;
17、判断所述返回结果中包含的保护页的数据是否与设置的保护页的数据保持一致,若不一致,判定当前发生了栈溢出的情况。
18、本发明另一方面提供一种内存报错检测装置,所述装置包括:
19、报错信息处理单元,用于接收内存报错信息,并识别所述内存报错信息表征的报错类型;
20、检测单元,用于若所述报错类型表征内存非法使用,检测所述内存报错信息对应的内存分配结果和所述内存分配结果对应的操作函数;
21、理论结果确定单元,用于获取所述操作函数的实时操作对象和所述实时操作对象的属性值,并基于所述属性值,确定所述实时操作对象的理论分配结果;
22、判断单元,用于将所述理论分配结果与所述内存分配结果进行对比,并基于对比结果判断所述实时操作对象的属性值是否被错误引用。
23、在一个实施方式中,所述检测单元还用于,若所述报错类型表征内存被非法访问,截取针对内存的访问操作,并判断所述访问操作是否合法;基于判断结果,过滤不合法的访问操作,并放行合法的访问操作。
24、在一个实施方式中,所述检测单元还用于,若所述报错类型表征栈溢出,在函数对栈内数据的调用过程中,在调用的数据内写入随机数;接收函数的返回结果,并判断所述返回结果中的随机数与写入的随机数是否一致,若不一致,判定所述函数调用存在栈溢出的情况。
25、本发明提供的技术方案,针对不同类型的报错信息,可以自动地按照预先设置的策略进行检测。具体地,报错类型可以包括内存的非法访问、非法使用、栈溢出等,通过不同的策略对这些报错信息进行排查,可以有效地判断报错信息是否为误报,同时还可以定位到具体的报错原因,极大地提高了内存报错的检测效率和精度。
26、本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
27、下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
1.一种内存报错检测方法,其特征在于,所述方法包括:
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
3.根据权利要求2所述的方法,其特征在于,判断所述访问操作是否合法包括:
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
6.一种内存报错检测装置,其特征在于,所述装置包括:
7.根据权利要求6所述的装置,其特征在于,所述检测单元还用于,若所述报错类型表征内存被非法访问,截取针对内存的访问操作,并判断所述访问操作是否合法;基于判断结果,过滤不合法的访问操作,并放行合法的访问操作。
8.根据权利要求6所述的装置,其特征在于,所述检测单元还用于,若所述报错类型表征栈溢出,在函数对栈内数据的调用过程中,在调用的数据内写入随机数;接收函数的返回结果,并判断所述返回结果中的随机数与写入的随机数是否一致,若不一致,判定所述函数调用存在栈溢出的情况。