一种基于栈的异常检测方法和装置的制造方法
【技术领域】
[0001] 本发明涉及计算机技术领域,特别是涉及一种基于栈的异常检测方法方法和一种 基于栈的异常检测装置。
【背景技术】
[0002] 栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端 进行插入和删除运算。
[0003] 人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为 栈底。向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成 为新的栈顶元素;从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其下面 的相邻元素成为新的栈顶元素。
[0004] 栈中存储着函数的局部变量等信息,在编译完成后,局部变量的位置是固定的,但 是在调用其他业务对象时需要将参数压入栈(push),这会破坏顺序,所以在调用完毕后需 要将压入栈的数据再弹出(pop)以恢复栈空间的顺序,否则因为读取变量是读取固定位 置,导致读取的值不正确,此时就认为变量被破坏了。
[0005] 若当前业务对象需要调用其他用户制作的业务对象,大多数情况下业务对象与业 务对象之间是通过栈空间来交换数据的,将参数压入栈顶,然后调用函数,对方在内部从栈 顶拿出参数。
[0006] 由于读取的是固定位置,因此如果栈空间出现问题,可能操作某局部变量的时候 操作到意外的值,如果该局部变量是个函数指针,甚至会导致执行意外的代码。
[0007] 如果栈空间出现问题,当时并不会崩溃,而是当其他业务对象操作被破坏的局部 变量时可能导致崩溃,难以定位出错的位置。比如向一个指针变量指向的地址写入数据,但 是该变量被破坏,导致尝试向未知区域写入数据,此时可能因为写入不可写的地址而崩溃。
【发明内容】
[0008] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上 述问题的一种基于栈的异常检测方法和相应的一种基于栈的异常检测装置。
[0009] 依据本发明的一个方面,提供了一种基于栈的异常检测方法,包括:
[0010] 生成标识信息;
[0011] 在第一业务对象将一个或多个参数压入栈之前,将所述标识信息压入栈;
[0012] 当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶 元素;
[0013] 检测所述栈顶元素与所述标识信息是否相同;以及
[0014] 当所述栈顶元素与所述标识信息不同时,判断所述栈出现异常。
[0015] 可选地,所述方法还包括:
[0016] 当所述栈顶元素与所述标识信息相同时,判断所述栈运行正常。
[0017] 可选地,所述方法还包括:
[0018] 生成所述栈出现异常的提示信息;
[0019]或者,
[0020] 使用调试接口输出异常信息。
[0021] 可选地,所述生成标识信息的步骤包括:
[0022] 在第一时间针对标识对象生成第一信息;
[0023] 将所述第一信息写入特征变量中;
[0024] 在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间 不同;
[0025] 将所述第二信息写入全局变量中;以及
[0026] 根据所述特征变量和所述全局变量生成所述标识信息。
[0027] 可选地,所述根据所述特征变量和所述全局变量生成所述标识信息的步骤进一步 包括:
[0028] 将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
[0029] 将所述结果写入全局变量中,以获得标识信息。
[0030] 可选地,所述第二业务对象调用在栈中一个或多个参数的操作进一步包括:
[0031] 读取在栈中的所述一个或多个参数;以及
[0032] 进行堆栈平衡处理。
[0033] 可选地,所述提取当前位于栈顶的栈顶元素的步骤进一步包括:
[0034] 对当前位于栈顶的栈顶元素进行出栈操作;以及
[0035] 将出栈之后的栈顶元素写入局部变量。
[0036] 可选地,所述标识信息存储在全局变量中,以及所述检测所述栈顶元素与所述标 识信息是否相同的步骤进一步包括:
[0037] 判断所述局部变量与所述全局变量是否相同;以及
[0038] 若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所 述标识信息不同。
[0039] 根据本发明的另一方面,提供了一种基于栈的异常检测装置,包括:
[0040] 第一生成模块,适于生成标识信息;
[0041] 压入模块,适于在第一业务对象将一个或多个参数压入栈之前,将所述标识信息 压入栈;
[0042] 提取模块,适于当第二业务对象调用在栈中的一个或多个参数完成时,提取当前 位于栈顶的栈顶元素;
[0043] 检测模块,适于检测所述栈顶元素与所述标识信息是否相同;以及
[0044] 异常判断模块,适于在所述栈顶元素与所述标识信息不同时,判断所述栈出现异 堂 巾。
[0045] 可选地,所述装置还包括:
[0046] 正常判断模块,适于在所述栈顶元素与所述标识信息相同时,判断所述栈运行正 堂 巾。
[0047]可选地,所述装置还包括:
[0048] 第二生成模块,适于生成所述栈出现异常的提示信息;
[0049]或者,
[0050] 输出模块,适于使用调试接口输出异常信息。
[0051] 可选地,所述第一生成模块还适于:
[0052] 在第一时间针对标识对象生成第一信息;
[0053] 将所述第一信息写入特征变量中;
[0054] 在第二时间针对所述标识对象生成第二信息,其中所述第一时间与所述第二时间 不同;
[0055] 将所述第二信息写入全局变量中;以及
[0056] 根据所述特征变量和所述全局变量生成所述标识信息。
[0057] 可选地,所述第一生成模块还适于:
[0058] 将所述全局变量与所述特征变量进行按位异或运算,以获得异或结果;以及
[0059] 将所述结果写入全局变量中,以获得标识信息。
[0060] 可选地,在所述第二业务对象调用在栈中一个或多个参数的过程中,所述第二业 务对象适于:
[0061] 读取在栈中的所述一个或多个参数;以及
[0062] 进行堆栈平衡处理。
[0063] 可选地,所述提取模块还适于:
[0064] 对当前位于栈顶的栈顶元素进行出栈操作;以及
[0065] 将出栈之后的栈顶元素写入局部变量。
[0066] 可选地,所述标识信息存储在全局变量中,以及所述检测模块还适于:
[0067] 判断所述局部变量与所述全局变量是否相同;以及
[0068] 若是,则判断所述栈顶元素与所述标识信息相同,否则,则判断所述栈顶元素与所 述标识信息不同。
[0069] 本发明实施例在第一业务对象将一个或多个参数压入栈之前,将标识信息压入 栈,当第二业务对象调用在栈中的一个或多个参数完成时,提取当前位于栈顶的栈顶元素, 检测所述栈顶元素与所述标识信息是否相同,若相异时,则判断栈出现异常,基于栈传递参 数的原理,实现调用第二业务对象实时的异常检测,提高了检测栈异常的速度和准确率,同 时提高了异常定位的精确度。并且,可以直观的在栈中看到崩溃时的参数以让后续开发人 员进行崩溃分析,找到栈崩溃原因,提高开发效率。
[0070] 本发明实施例在不同时间对同一标识对象生成第一信息、第二信息,并按位进行 异或操作,生成标识信息,大大提高了标识信息的复杂度,大大减少标识信息与在先其他数 据重合的几率,进而减少了后续异常检测误判的几率,进一步提高了异常检测的判断准确 率。
[0071] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段, 而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够 更明显易懂,以下特举本发明的【具体实施方式】。
【附图说明】
[0072] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通 技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明 的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0073] 图1为根据本发明一个实施例的一种基于栈的异常检测方法实施例的步骤流程 示意图;以及
[0074] 图2为根据本发明一个实施例的一种基于栈的异常检测装置实施例的方块示意 图。
【具体实施方式】
[0075] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开 的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例 所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围 完整的传达给本领域的技术人员。
[0076]参照图1