首页> 中国专利> 一种操作系统内核调试方法和虚拟调试服务模块

一种操作系统内核调试方法和虚拟调试服务模块

摘要

一种操作系统内核的调试方法和虚拟调试服务模块,该方法包括:虚拟调试服务模块接收主控操作系统中的调试模块发送的插入至少一个断点的断点插入请求,断点插入请求中包括插入断点的位置信息;虚拟调试服务模块根据断点插入请求中的插入断点的位置信息,在被调试操作系统中的相应位置处插入断点,并将插入断点的位置记录在调试断点信息表中;虚拟调试服务模块捕获被调试操作系统执行过程中触发的断点异常,并将捕获到的断点异常的特征与调试断点信息表中记录的断点的位置进行比较,如果匹配,则暂停被调试操作系统的运行。

著录项

  • 公开/公告号CN102301344A

    专利类型发明专利

  • 公开/公告日2011-12-28

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN201180001650.2

  • 发明设计人 张超;李俊;

    申请日2011-07-06

  • 分类号G06F11/36(20060101);

  • 代理机构深圳市深佳知识产权代理事务所(普通合伙);

  • 代理人彭愿洁;李文红

  • 地址 518129 中国广东省深圳市龙岗区坂田华为总部办公楼

  • 入库时间 2023-12-18 04:08:41

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-08-18

    未缴年费专利权终止 IPC(主分类):G06F11/36 授权公告日:20131204 终止日期:20160706 申请日:20110706

    专利权的终止

  • 2013-12-04

    授权

    授权

  • 2012-02-15

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20110706

    实质审查的生效

  • 2011-12-28

    公开

    公开

说明书

技术领域

本发明涉及操作系统领域,尤其涉及一种基于虚拟化的操作系统内核调 试方法和虚拟调试服务模块。

背景技术

一直以来,内核调试都是操作系统内核开发的一个技术瓶颈。现有的 Linux系统内核调试手段包括KDB、kprobe、pintk、KGDB等,这些内核调 试手段中大多需要给Linux系统内核植入特定的补丁(Patch)才能进行调试, 而且而且这种调试方式相当于在操作系统调试自身,因此只能支持很简单的 调试功能,例如查看内核数据结构、打印现场信息等,无法实现单步调试和 设置端点等高级调试功能。虽然GDB调试手段可以提供一些高级的调试的功 能,但是必须由两台主机才能完成调试。

发明内容

本发明实施例提供一种操作系统内核调试方法和虚拟调试服务模块,以 解决调试手段单一、调试所需的主机数量多的问题。

本发明实施例一方面提供一种操作系统内核的调试方法,虚拟机上运行 主控操作系统和被调试操作系统,该方法包括:

虚拟调试服务模块接收主控操作系统中的调试模块发送的插入至少一个 断点的断点插入请求,所述断点插入请求中包括插入断点的位置信息;

虚拟调试服务模块根据断点插入请求中的插入断点的位置信息,在被调 试操作系统中的相应位置处插入断点,并将插入断点的位置记录在调试断点 信息表中;

虚拟调试服务模块捕获被调试操作系统执行过程中触发的断点异常,并 将捕获到的断点异常的特征与调试断点信息表中记录的断点的位置进行比 较,如果匹配,则暂停被调试操作系统的运行。

本发明另一方面还提供一种虚拟调试服务模块,其构建在虚拟机中,所 述虚拟机上运行主控操作系统和被调试操作系统,该虚拟调试服务模块包括:

断点插入请求接收单元,用于接收主控操作系统中的调试模块发送的插 入至少一个断点的断点插入请求,所述断点插入请求中包括插入断点的位置 信息;

断点插入单元,用于根据断点插入请求中的插入断点的位置信息,在被 调试操作系统中的相应位置处插入断点,并将插入断点的位置记录在调试断 点信息表中;

断点异常捕获单元,用于捕获被调试操作系统执行过程中触发的断点异 常;

特征比较单元,用于将所述捕获到的断点异常的特征与调试断点信息表 中记录的断点的位置进行比较,如果匹配成功,则触发暂停单元进行工作;

暂停单元,用于触发被调试操作系统暂停运行。

本发明实施例中在虚拟机中实现一个虚拟调试模块,借助该虚拟调试模 块可以实现对被调试操作系统的断点调试,可选地还可以实现单步执行调试, 调试的手段更多。而且本发明实施例在进行调试的过程中只需要一台主机即 可完成。

附图说明

图1是本发明实施例提供的操作系统内核的调试方法的流程示意图;

图2是本发明实施例一中的操作系统内核的调试方法所基于的系统层次 架构图;

图3是本发明实施例一提供的操作系统内核的调试方法的流程示意图;

图4是本发明实施例二提供的操作系统内核的调试方法的流程示意图;

图5是本发明实施例提供的虚拟调试服务模块的结构示意图。

具体实施方式

本发明实施例在运行在硬件实体和操作系统之间的虚拟机中实现了一个 虚拟调试服务(vir_gdbServer)模块,虚拟机通过虚拟化可以实现硬件共享, 在一套硬件上同时运行多个操作系统,在本发明实施例中主控操作系统和被 调试操作系统,主控操作系统与客户进行交互,是负责调试的操作系统。虚 拟调试服务模块可以与主控操作系统中的调试模块(例如gdb)进行通信,用 于实现调试模块的控制命令,主控操作系统中的调试模块利用通用调试协议 (例如:gdb串行协议、或加密协议提供安全性)通过虚拟调试服务模块进行 交互。

基于上述架构,本发明的一个实施例提供一种操作系统内核的调试方法, 如图1所示,该方法包括:

步骤S101:虚拟调试服务模块接收主控操作系统中的调试模块发送的断 点插入请求,该断点插入请求中包括请求插入断点的位置信息。

当用户想要在被调试操作系统中插入断点时,可以通过主控操作系统向 调试模块发送断点插入请求,该断点插入请求中包含了用户想要插入的各个 断点的位置信息。

步骤S102:虚拟调试服务模块根据断点插入请求中的插入断点的位置信 息,在被调试操作系统中的相应位置处插入断点,并将插入断点的位置记录 在调试断点信息表中。

而后可以运行被调试操作系统,当被调试操作系统在运行过程中会触发 断点异常,该断点异常可能是因为执行到步骤S102中插入的用于调试的断点 产生的,也可能是执行到操作系统本身定义的其他中断产生的。

步骤S103:虚拟调试服务模块捕获被调试操作系统执行过程中触发的断 点异常。

步骤S104:虚拟调试服务模块将捕获到的断点异常的特征与调试断点信 息表中记录的断点位置进行比较,如果匹配则暂停被调试操作系统的运行。

之所以要将捕获到的断点异常与调试断点信息表中的断点位置进行比 较,是因为正如前文所述,捕获到的断点异常可能是因为执行到步骤S102中 插入的用于调试的断点产生的,也可能是执行到操作系统本身定义的其他中 断产生的,而本发明实施例只需要对因执行到用于调试的断点而发生的异常 进行后续处理,对于其他原因产生的断点异常不做处理;所以,在捕获到断 点异常后,还需将其特征与调试断点信息表中的断点位置进行比较,如果匹 配,说明该断点异常是被调试操作系统执行到之前插入的断点后产生的。

上述断点异常的特征包括发生异常的地址。此外,为了增强比较的严谨 性,断点异常的特征中还可以包括异常向量。对于断点异常是因为执行到步 骤S102中插入的用于调试的断点产生的情况,该异常向量应该是相同的一个 特定值,所以本发明中还可以同时验证该异常向量是否等于执行到用户调试 的断点时被调试操作系统应该产生的中断向量。

此外,还可以包括步骤S105:在暂停被调试操作系统的运行以后,虚拟 调试服务模块接收主控操作系统中的调试模块发送的查阅被调试操作系统的 状态信息的查阅请求;

步骤S106:虚拟调试服务模块根据步骤S105中的查阅请求,将被调试操 作系统中的状态信息反馈至主控操作系统中的调试模块。

上述状态信息可以包括被调试操作系统的寄存器中的信息、堆栈中的信 息和全局变量其中的一个或者任意组合。

由此可见,上述方法在虚拟机中实现了一个虚拟调试服务模块,可以轻 松实现被调试操作系统的断点调试。

以下以两个具体的实施例详细说明上述方法的具体实现。

实施例一

图2示出了本实施例所基于的层次架构图。如图2所示,GOS1为主控操 作系统,GOS2为被调试操作系统。GOS1和GOS2共同运行在同一个虚拟机 上。在虚拟机中构建了一个虚拟调试服务模块(vir_gdbserver)。在GOS1中 具有调试模块(gdb),gdb与vir_gdbserver进行通信,在实际中,为了使得上 层的调试功能不依赖于底层的虚拟机的实现方式,在虚拟机中还构建一个虚 拟设备(Virtual device),主控操作系统GOS1中的调试模块gdb通过该虚拟 设备与虚拟机中的虚拟调试服务模块vir_gdbserver进行通信。

如图3所示,本实施例中提供的操作系统内核的调试方法包括如下步骤:

步骤S301:GOS1中的gdb通过虚拟设备虚拟机中的虚拟调试服务模块 vir_gdbserver模块发送断点插入请求,请求向被调试操作系统GOS2中插入用 于调试的断点。

步骤S302:vir_gdbserver模块接收到该断点插入请求后,根据其中包含 的插入断点的位置信息,向GOS2中的相应位置处插入断点,并将插入断点 的位置记录在调试断点信息表中。

插入断点的具体实现方式可以是向要插入断点的位置处写入断点指令 INT 3,即0xCC。

在实际中,该调试断点信息表可以以链表的形式进行存储。

步骤S303:运行GOS2,运行过程中,GOS2会触发断点异常。

步骤S304:vir_gdbserver模块捕获GOS2运行过程中触发的断点异常, 并将该断点异常的特征与调试断点信息表中的断点位置进行比较,如果匹配 成功,说明该断点异常是GOS2执行到之前插入的用于调试的断点后触发的, 则暂停GOS2的运行。如果不能匹配,则不做任何处理,由vir_gdbserver模 块继续捕获后续的断点异常。

在暂停GOS2的运行以后,vir_gdbserver模块可以根据GOS1发送的查阅 请求,将GOS2中的状态信息反馈至GOS1中的gdb,这里的状态信息可以是 GOS2中的各个寄存器内的信息、堆栈信息和全局变量中的任意一个或者任意 组合。

需要说明的是,应用本实施例中的方法也可以实现单步执行调试的目的, 只需要通过GOS1向vir_gdbserver模块发送请求在GOS2执行的每一步后都 插入断点的请求即可,这时,在GOS2运行过程中,每执行完一步就触发一 次断点异常,然后暂停GOS2的运行,供用户进行单步执行的断点调试。

此外,在一个优选的实施例中,虚拟调试服务模块(vir_gdbserver模块) 还接收主控操作系统请求构造调试环境的请求,虚拟调试服务模块根据该请 求,构造被调试操作系统的运行环境。利用该手段,用户可以模拟被调试操 作系统在各种极端运行环境下的调试过程。例如,当用户知道出现故障的条 件,但是不知道为什么该条件会出现,也就是说该条件的出现完全是随机的 不可控的,此时可以将满足该条件的环境通过人为构造,达到故障输入的目 的,为进一步克服该故障提供调试的基础。这里构造调试环境可以是在被调 试操作系统运行之前进行,也可以是在被调试操作系统运行到断点时被暂停 运行的时候进行。

另外,上述GOS1中的gdb与vir_gdbserver模块之间的通信过程优选采 用密钥来完成,以增强系统的安全性。

由此可见,本实施例中在虚拟机中实现了一个虚拟调试服务模块,可以 轻松实现被调试操作系统的断点调试,还可以通过断点调试的方式实现单步 执行调试。

实施例二

本实施例仍然基于图2中的层次架构图。本实施例中提供的操作系统内 核的调试方法用来完成单步执行调试的目的。图4示出了本实施例提供的操 作系统内核的调试方法的示意图,如图4所示,该方法包括如下步骤:

步骤S401:当需要进行单步执行调试时,判断硬件是否支持单步执行。

如果步骤S401的判断结果为是时,则执行步骤S402,否则执行步骤S40X。

步骤S402:GOS1中的gdb向虚拟机中的vir_gdbserver模块发送控制命 令,要求将被调试操作系统GOS2置于单步执行模式。

步骤S403:当GOS2运行时,vir_gdbserver模块将运行该GOS2的CPU (中央处理器)中的标志寄存器EFLAGS中的用于控制单步执行调试模式开 关的标志位设置为表示“开启”的状态,以使GOS2在运行每一步后都产生 单步异常。

这里的用于控制单步执行调试模式开关的标志位可以为标志寄存器 EFLAGS中的TF标志位,TF标志位的值设为“1”时表示开启CPU的单步 执行调试模式,TF标志位的值设为“0”时表示关闭CPU的单步执行调试模 式。

步骤S404:GOS2在运行时,每执行完一条指令,就会产生一个单步异 常。

步骤S405:vir_gdbserver模块捕获到GOS2运行过程中产生的单步异常, 当确认GOS2运行的当前步(或者说当前运行的一条指令)执行完毕后,暂 停GOS2的运行。

在步骤S405中暂停GOS2的运行以后,vir_gdbserver模块可以根据GOS1 发送的查阅请求,将GOS2中的状态信息反馈至GOS1中的gdb,这里的状态 信息可以是GOS2中的各个寄存器内的信息、堆栈信息和全局变量中的任意 一个或者任意组合。

如果步骤S401的判断结果为否时,表明硬件不支持单步执行调试,则直 接执行步骤S406。

步骤S406:GOS1中的调试模块gdb向vir_gdbserver模块发送在GOS2 执行每一步均插入断点的断点插入请求,并执行后续步骤。

步骤S407:vir_gdbserver模块接收到该断点插入请求后,根据其中包含 的插入断点的位置信息,向GOS2中的每一步后面均插入断点,并将插入断 点的位置记录在调试断点信息表中。

插入断点的具体实现方式可以是向要插入断点的位置处写入断点指令 INT 3,即0xCC。

在实际中,上述调试断点信息表可以以链表的形式进行存储。

步骤S408:运行GOS2,运行过程中,每执行完一步就触发一次断点异 常。

步骤S409:vir_gdbserver模块捕获GOS2运行过程中触发的断点异常, 并将该断点异常的特征与调试断点信息表中的断点位置进行比较,如果匹配, 说明该断点异常是GOS2执行到之前插入的用于调试的断点后触发的,则暂 停GOS2的运行。

在步骤S409中暂停GOS2的运行以后,vir_gdbserver模块可以根据GOS1 发送的查阅请求,将GOS2中的状态信息反馈至GOS1中的gdb,这里的状态 信息可以是GOS2中的各个寄存器内的信息、堆栈信息和全局变量中的任意 一个或者任意组合。

此外,在一个优选的实施例中,虚拟调试服务模块(vir_gdbserver模块) 还接收主控操作系统请求构造调试环境的请求,虚拟调试服务模块根据该请 求,构造被调试操作系统的运行环境。利用该手段,用户可以模拟被调试操 作系统在各种极端运行环境下的调试过程。例如,当用户知道出现故障的条 件,但是不知道为什么该条件会出现,也就是说该条件的出现完全是随机的 不可控的,此时可以将满足该条件的环境通过人为构造,达到故障输入的目 的,为进一步克服该故障提供调试的基础。这里构造调试环境可以是在被调 试操作系统运行之前进行,也可以是在被调试操作系统运行到断点时被暂停 运行的时候进行。

另外,上述GOS1中的gdb与vir_gdbserver模块之间的通信过程优选采 用密钥来完成,以增强系统的安全性。

由此可见,本实施例中在虚拟机中实现了一个虚拟调试服务模块,可以 轻松实现被调试操作系统的断点调试以及单步执行调试。

本发明另一实施例还相应提供一种虚拟调试服务模块,该虚拟调试服务 模块构建在虚拟机中,该虚拟机上运行主控操作系统和被调试操作系统,如 图5所示,该虚拟调试服务模块50包括断点插入请求接收单元501、断点插 入单元502、断点异常捕获单元503、特征比较单元504和暂停单元505。

其中,断点插入请求接收单元501用于接收主控操作系统中的调试模块 发送的插入至少一个断点的断点插入请求,上述断点插入请求中包括插入断 点的位置信息。断点插入单元502用于根据断点插入请求中的插入断点的位 置信息,在被调试操作系统中的相应位置处插入断点,并将插入断点的位置 记录在调试断点信息表中。断点异常捕获单元503用于捕获被调试操作系统 执行过程中触发的断点异常。特征比较单元504用于将上述捕获到的断点异 常的特征与调试断点信息表中记录的断点的位置进行比较,如果匹配成功, 则触发暂停单元505进行工作。暂停单元505用于触发被调试操作系统暂停 运行。

为了进行单步执行调试,优选地,虚拟调试服务模块还可以包括:

单步执行支持判断单元506,用于在需要进行单步执行调试时,预先判断 硬件是否支持单步执行;

逐步断点插入单元507,用于在单步执行支持判断单元506判断结果为否 时,通知主控操作系统中的调试模块向虚拟调试服务模块发送在被调试操作 系统执行的每一步均插入断点的断点插入请求。

此外,上述虚拟调试服务模块还可以包括:

标志位设置单元508,用于在单步执行支持判断单元判断结果为是时,在 被调试操作系统运行时,将运行该被调试操作系统的中央处理器的标志寄存 器中用于控制单步执行调试模式开关的标志位设置为表示“开启”的状态, 以使被调试操作系统在运行每一步后都产生单步异常。

单步异常捕获单元509,用于捕获被调试操作系统在运行每一步后所产生 的单步异常,当虚拟调试服务模块确认被调试操作系统运行的当前步执行完 毕后,触发上述暂停单元505进行工作。

此外,为了方便用户在暂停运行被调试操作系统的运行状态信息,优选 地还包括查阅单元506,用于用于在暂停被调试操作系统的运行以后,接收主 控操作系统中的调试模块发送的查阅被调试操作系统的状态信息的查阅请 求,并根据该查阅请求,将被调试操作系统的状态信息反馈至主控操作系统 中的调试模块,这里被调试操作系统的状态信息可以包括被调试操作系统的 寄存器中的信息、堆栈中的信息和全局变量中的任何一个或者任意组合。

以上公开的仅为本发明的几个具体实施例,但本发明并非局限于此,任 何本领域的技术人员能思之的变化,都应落在本发明的保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号