首页> 中国专利> 生产阶段嵌入式系统的调试系统及其调试方法

生产阶段嵌入式系统的调试系统及其调试方法

摘要

提供了一种生产阶段嵌入式系统的调试系统及其调试方法。在编译和链接时,除了生成发布用的生产系统二进制文件,同时也由调试代码生成了调试用的二进制动态代码文件。生成发布版二进制文件时,代码中的调试代码不会包含其中。不会生产任何空指令、调用指令或桩代码。生成调试用的二进制文件时,相应调试点地址信息也被生成包含在内。在运行时,动态指令加载工具会列出所有调试点列表。用户根据需要,选择或变更所需要的调试点。最后,动态指令加载工具通过动态修改运行中的发布版软件,加载并运行用户指定的调试点相应的调试代码。

著录项

  • 公开/公告号CN102279789A

    专利类型发明专利

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

    原文格式PDF

  • 申请/专利号CN201010205209.3

  • 发明设计人 田峰;朱昊亮;沈志刚;

    申请日2010-06-13

  • 分类号G06F11/36(20060101);

  • 代理机构11286 北京铭硕知识产权代理有限公司;

  • 代理人韩明星;罗延红

  • 地址 210008 江苏省南京市中山路268号汇杰广场8楼

  • 入库时间 2023-12-18 04:00:10

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-02-05

    授权

    授权

  • 2012-02-01

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

    实质审查的生效

  • 2011-12-14

    公开

    公开

说明书

技术领域

本发明涉及嵌入式系统的调试技术,更具体地,涉及生产阶段嵌入式系 统的调试系统及其调试方法。

背景技术

在嵌入式系统的开发阶段中,通常使用调试和除错(DEBUG)系统,可以 输出与嵌入式系统运行相关的调试信息,包括执行上下文、变量、寄存器、 内存堆栈等。调试信息可以在系统控制台上输出或保存在调试日志中供后期 分析。而对于嵌入式系统的生产阶段,由于考虑到调试系统的性能和内存额 外开销,通常在产品发布版中移除了调试功能。

在现有技术中,有时为了保留调试功能,在产品规格允许的嵌入式系统 中,即使是发布版,也会将监控和调试代码包含在内。这样可以为用户的使 用带来更大的灵活性,从而提高嵌入式系统的稳定性。另外,在目前的嵌入 式系统中,动态代码技术可以在运行时修改执行中的代码。因为函数地址比 其它符号地址容易获取,所以通常使用动态代码技术进行性能分析和覆盖分 析。

然而,在现有技术中,如果在产品的发布版本中保留调试代码,则即使 不使用调试功能时,也无法避免会有内存和性能的额外开销。

通过动态代码来加入调试功能,需要用到相关调试代码点和调试符号的 地址信息。除函数入口和导出符号外,地址信息比较难获取。另外,动态代 码技术还必须使用动态代码框架定义的动态检测处理例程语言来定义动态代 码,这对于用户来说不易使用。

对于嵌入式系统开发人员来说,需要一种与产品开发阶段中调试方法类 似的生产阶段调试方法。同样,生产阶段的调试方法应该使用与嵌入式产品 相同的开发语言,而不是新的调试语言。

在这种生产阶段调试方法关闭时,必须保证没有任何内存和性能的开销。 同时,在应用生产阶段的调试方法时,必须将对嵌入式系统的影响减少到最 少的限度。

发明内容

本发明提供了一种生产阶段嵌入式系统的调试系统及其方法,该系统和 方法对于提高嵌入式系统的稳定性,提高嵌入式产品的质量具有很大的意义。 同时,本发明也有利于设备的维护以及软件的升级,降低售后维护成本。

具体地,在采用了本发明的嵌入式系统的开发过程中,开发人员在源代 码中直接写入相应的调试代码。在编译和链接时,除了生成发布用的生产系 统二进制文件,同时也由调试代码生成了调试用的二进制动态代码文件。生 成发布版二进制文件时,代码中的调试代码不会包含其中。不会生产任何空 指令、调用指令或桩代码。生成调试用的二进制文件时,相应调试点地址信 息也被生成包含在内。在运行时,动态指令加载工具会列出所有调试点列表。 用户根据需要,选择或变更所需要的调试点。最后,动态指令加载工具通过 动态修改运行中的发布版软件,加载并运行用户指定的调试点相应的调试代 码。

根据本发明的一方面,提供了一种用于生产阶段嵌入式系统的调试系统, 包括开发主机和目标机,所述开发机包括:编译器,读取源代码,并生成非 调试软件部分的代码和调试软件部分的代码,其中,源代码包括产品源代码 和调试代码,调试代码以宏的形式与产品源代码区分;链接器,分别利用非 调试软件部分的代码和调试软件部分的代码链接生成发布用二进制应用文件 和调试用二进制代码,记录与调试点相应的指令地址信息,并根据调试点相 应的指令地址信息和调试用二进制代码生成调试用二进制代码文件。其中, 当调试嵌入式系统时,所述目标机的动态代码加载工具解析调试用二进制文 件中包含的调试点的二进制调试代码以及调试点在发布用二进制应用程序中 的可执行地址,列出调试点列表供用户选择调试点,所述目标机的动态代码 驱动内核根据用户选择的调试点动态修改运行中的发布用二进制应用程序以 加载调试代码。

根据本发明的一方面,所述的调试系统的链接器将调试用二进制代码和 非调试用二进制代码分别生成为独立的目标文件。

根据本发明的一方面,所述调试用二进制代码文件包含的调试点地址与 源代码中调试点下一条非调试源代码生成的可执行代码地址相同。

根据本发明的一方面,可根据用户的选择全部或部分地打开调试点,并 变更加载的调试代码。

根据本发明的另一方面,还提供了一种用于生产阶段嵌入式系统的调试 方法,包括:开发主机端的编译器读取源代码,生成非调试软件部分的代码 和调试软件部分的代码,其中,源代码包括产品源代码和调试代码,调试代 码以宏的形式与产品源代码区分;开发主机端的链接器分别利用非调试软件 部分的代码和调试软件部分的代码链接生成发布用二进制应用文件和调试用 二进制代码,记录与调试点相应的指令地址信息,并根据调试点相应的指令 地址信息和调试用二进制代码生成调试用二进制文件;当调试嵌入式系统时, 所述目标机的动态代码加载工具解析调试用二进制文件中包含的调试点的二 进制调试代码以及调试点在发布用二进制应用程序中的可执行地址,列出调 试点列表供用户选择调试点,所述目标机的动态代码驱动内核根据用户选择 的调试点动态修改运行中的发布用二进制应用程序以加载调试代码。

附图说明

通过下面结合附图对实施例的详细描述,本发明的上述和/或其他方面将 会变得清楚和更容易理解,其中:

图1是示出应用根据本发明实施例的监控和调试方法的嵌入式系统;

图2是根据本发明实施例的嵌入式系统的主机端的编译链接方法的流程 图;

图3是根据本发明实施例的嵌入式系统的目标机端的调试方法的流程 图。

具体实施方式

下面将参照附图对本发明进行详细的说明。应理解,在这里示出了本发 明的示例性实施例以帮助对本发明的理解,然而这些实施例仅是用于示例性 目的,而不在于将本发明限定于在此描述的实施例。另外,为了清楚和简明, 以下的描述中省略了对于本领域的技术人员已知的元件和功能的描述。

图1是示出应用了根据本发明实施例的监控和调试方法的嵌入式系统的 结构示意图。如图1所示,该系统包括开发主机和运行目标机。

在开发主机中,包括嵌入式产品开发源代码、编译器和链接器。其中, 编译器中包括一调试代码编译模块,而链接器包括调试代码链接模块。为了 支持在生产阶段的调试,调试代码直接内嵌在产品源代码中。调试代码通过 调试宏与产品源代码区分。调试点可由调试代码插入产品源代码的位置自动 定义,也可以由开发者命名。在应用了根据本发明实施例的监控和调试的嵌 入式系统中,在对包括调试代码的源代码进行编译和链接时,编译器和链接 器将生成生产阶段发布所使用的二进制应用文件,同时还会生成调试二进制 代码。在编译发布用二进制应用时,源代码中加入的调试宏被忽略跳过,因 此,编译生成的二进制应用文件将不会包含任何调试用的代码,从而在发布 用二进制应用文件正常运行时,不会产生任何内存和性能上的额外开销。同 时,在由调试宏生成的调试用二进制文件中,包含了所有调试点在发布用二 进制应用中的执行地址信息,以及各调试点对应的调试代码。生成调试二进 制代码的过程将在以下参照附图2进行更详细的描述。

在根据本发明实施例的嵌入式系统的运行目标机在逻辑上分为应用层和 驱动层。其中,调试二进制代码和发布用应用以及动态代码加载工具都在应 用层。驱动层中包括动态代码加载驱动模块,用于驱动动态代码加载工具。 当发布用二进制应用在目标机上独立运行时,不会执行调试宏中的任何二进 制代码。当需要调试时,用户在动态代码加载工具提示的调试点列表中选择 打开部分或全部调试点。相应的调试代码会由动态代码加载驱动加载到运行 中的发布用二进制应用中。当执行到相应的调试点时,相应调试代码会被执 行,以收集需要的调试信息。

下面将参照附图2描述在开发主机端的编译和链接处理过程。首先,在 步骤210,当开发主机上的编译器被启动时,编译器读入源代码。该源代码 中内嵌了调试代码,调试代码以宏的形式被定义。

然后,在步骤220,编译器分别生成非调试软件部分的代码和调试软件 部分的代码。具体地,根据本发明的一实施例,编译器驱动前端程序启动源 代码预处理器和汇编生成器生成汇编代码时,编译器的调试代码编译模块在 调试代码前、后分别增加代码输出段调整指令SECTION。例如,指定调试代 码SECTION为“.dbgtext”从而与常用的代码“.text”SECTION区别。另外, 在生成代码的过程中,调试代码编译模块在调试代码前后自动增加调试标签 label指令。例如,label指令可以是“probe handler 1:”和“probe point 1:”, 分别用于记录调试点和调试函数在汇编代码中的位置。然后,编译驱动前端 程序再启动汇编生成器,读入前面生成的汇编代码,通过识别并处理输出段 指令,分别在“.text”和“.dbgtext”段中生成非调试部分代码和调试部分代 码。

随后,在步骤230,开发主机启动链接器,链接生成发布用二进制应用 文件和包含调试指令的调试用二进制代码,并记录与调试用二进制代码相关 的地址信息。根据本发明的一实施例,为了生成两种不同的二进制代码,链 接器先略去”.dbgtext”段,链接非调试部分代码,从而生成发布用二进制应用 文件。同时,链接器的调试代码链接模块通过链接完成时的调试标签 “probe_point_1”的值确定相应调试点的指令地址,即探针插桩地址。然后, 调试代码链接模块再链接“.dbgtext”段,链接生成调试用二进制代码。同时, 通过调试标签“probe_handler_1”的值,调试代码链接模块记录下每一段调 试代码在“.dbgtext”中的指令地址,即探针函数地址。

最后,在步骤240,开发主机生成调试用二进制文件,所述调试用二进 制文件包括所有调试点的地址信息。链接器读入前面的步骤230生成的所有 探针插桩地址和探针函数地址,加上调试二进制代码,一并生成到调试用二 进制文件中。这里,生成的非调试二进制代码与去掉调试部分源代码后编译、 链接生成的二进制代码相同。生成的调试用二进制文件中包含调试点信息。 调试二进制代码文件中包含的调试点地址与由源代码中调试点下一条非调试 源代码生成的可执行代码地址相同。

除了以上的SECTION方式,还可以以其他方式来实现开发主机的编译 和链接。例如,编译器可以将调试代码和非调试代码分别生成在独立的目标 文件中。链接器进行链接时,用非调试目标文件链接生成发布用二进制文件, 并记录下探针插桩地址。然后,链接器链接调试用目标文件时,记录下探针 函数地址,并和前面的探针插桩地址信息合并,完成所有调试点的信息列表 生成,一并写入到调试用二进制文件中。

图3是根据本发明实施例的在目标机上进行调试的流程图。在运行目标 机上,包括发布用二进制应用文件、调试用代码、动态代码加载工具和动态 代码加载驱动模块。其中,动态代码加载工具和动态代码加载驱动模块一起 完成用户态应用的动态代码修改和调试代码加载功能。

首先,在步骤310,目标机读取发布用二进制应用文件以启动发布用应 用程序,并启动动态代码加载驱动模块和动态代码加载工具模块。动态代码 驱动模块可以根据嵌入式系统内核中提供的动态代码加载API来实现。如果 系统没有提供现成的动态代码加载内核API,则先修改运行中的应用代码, 将探针插桩地址处指令改为break指令,并将原指令复制至新代码页中,这 样,应用的执行路径因此被动态改变而跳转到新加载的探针函数地址。在执 行完探针函数后,执行路径跳转并执行复制的原代码。最后,应用从探针插 桩地址下一条指令恢复执行。

然后,在步骤320,动态代码加载工具读入调试用二进制代码文件,并 列出调试点的地址信息列表。动态代码加载工具先解析调试用二进制代码中 的所有探针信息,以列表方式在嵌入式系统控制台上打印出来,并提示用户 选择。例如,打印的调试点列表信息可以包括:调试点ID、与调试代码对应 的源文件及行号、探针地址等。同时,可以提供多种调试点过滤器,方便用 户选择调试点,例如按模块名、按目录名或按函数名来选择调试点。

接下来,在步骤330,用户选择是否修改调试点。如果用户选择修改调 试点,则动态代码加载工具在步骤340更新调试点配置。如果用户确认修改 调试点完成,则在步骤350,动态代码加载工具将调试配置结果传递给动态 代码加载驱动模块,动态代码加载驱动模块动态修改二进制应用,以加载调 试部分代码。例如,动态代码加载工具通过动态代码加载驱动模块提供的编 程API将探针插桩地址和探针函数二进制代码传入给动态代码加载驱动模 块。然后,动态代码加载驱动模块对探针插桩地址处应用代码进行插桩和使 能,来完成动态调试代码的加载。

在步骤360,目标机通过调试代码收集所需的调试信息。加载后的调试 代码在执行探针函数过程中收集需要记录的调试跟踪信息,并将调试跟踪信 息保存到内核中的跟踪数据缓冲区中。数据的格式可以是从收集到的调试信 息编码成的打印字符,也可以编码成二进制格式,如事件时间、类型、名称、 参数。这些数据可以以自动覆盖的方式,在调试结束时将跟踪数据缓冲区中 最新数据保存到调试信息记录文件中;也可以在调试过程中,以持续记录的 方式,将所有数据保存到调试信息记录文件中。

可选地,在步骤370确定用户是否需要调整调试点,如果需要调整调试 点,则重复步骤330-360。用户可选择全部或部分选择打开调试点。根据用户 的选择结果,可变更实际加载的调试代码。如果确定不需要继续调试,则结 束调试。在调试完成后,如果需要,可以用动态代码加载工具注销所有调试 探针代码,并恢复应用原来的执行代码。

如上所述,根据本发明相对于现有的静态和动态调试方案,本发明提供 了一种发布或生产阶段的嵌入式系统调试方案。和现有静态调试方案(包括 插桩和非插桩的形式)的对比,本发明更适合于生产阶段的调试。首先,传 统的静态调试方案将调试代码直接生成在应用文件中。无论是否进行调试, 都增加了加载应用所需的内存。与之相比,本发明可将调试代码和非调试代 码生成在不同文件中。在不调试时,只加载发布的应用,没有任何额外的内 存开销。另外,因为传统的静态调试方案将调试代码和正常代码混合输出在 同一代码段中,因此,无论是否进行调试,都增加运行时额外性能负担。与 之相比,本发明在不调试时没有任何额外的性能开销。

和现有动态调试方案的对比,本发明更易于使用。动态调试方案要求使 用特定的编程语言来进行编写,增加开发人员学习难度。动态调试方案用单 独的编译环境生成插桩代码,在调试代码中难于解析原应用中复杂数据结构。 与之相比,本发明直接在应用源代码插入调试语句,无须学习额外语言。另 外,本发明使用和应用源代码一致的编译环境,在调试语句可直接引用原应 用中复杂数据结构。另外,动态调试方案要求开发人员提供动态插桩点。除 去函数入口外,通常要求开发人员手工分析应用源代码行对应加载指令地址, 来确定动态插桩点,不方便使用。本发明直接用嵌入在源文件中调试源代码 位置确定动态插桩点,并将调试点信息记录在调试用二进制文件中。开发人 员通过动态代码加载工具提示选择调试点即可完成代码插桩,容易使用。

虽然已经参照本发明的若干示例性实施例示出和描述了本发明,但是本 领域的技术人员将理解,在不脱离权利要求及其等同物限定的本发明的精神 和范围的情况下,可以在形式和细节上做出各种改变。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号