发明内容
本发明实施例提供了一种嵌入式***的调试方法、调试转换装置和***,用于增加在线调试工具的使用范围,缩短离线调试工具的开发时间,降低开发成本。
本发明实施例一方面提供了一种嵌入式***的调试方法,包括:
获取定制的在线调试命令到离线调试命令的转换规则;
在接收到在线调试命令的源码后,按照所述转换规则,将所述在线调试命令的源码转换成支持离线调试的代码;
将所述支持离线调试的代码发送给目标板。
结合一方面的实现方式,在第一种可选的实现方式中,所述将所述在线调试命令的源码转换成支持离线调试的代码,将所述支持离线调试的代码发送给目标板包括:
将所述在线调试命令的源码转换成离线调试命令的源码;将得到的离线命令源码和当前的调试器客户端,进行二次编译生成支持离线调试的调试器客户端,将所述支持离线调试的调试器客户端发送给目标板;或者,
将所述在线调试命令的源码转换成离线调试命令的代码并链接为动态库,将所述动态库发送给目标板。
结合第一种可选的实现方式,在第二种可选的实现方式中,所述将所述在线调试命令的源码转换成离线调试命令的源码包括:
使用编译器将所述在线调试命令的源码转换成离线命令的源码;或者,通过客户端工具将所述在线调试命令的源码转换成离线命令的源码。
结合第二种可选的实现方式,在第三种可选的实现方式中,所述使用编译器将所述在线调试命令的源码转换成离线命令的源码包括:
读入所述在线调试命令的源码,根据所述转换规则进行字符串的规则匹配,若匹配成功,则调用转换处理接口生成编译器能识别的词法或者语法单元,然后输出离线调试命令的源码。
结合一方面、第一种、第二种或第三种可选的实现方式,在第四种可选的实现方式中,所述转换规则包括:
符号表信息转换规则、寄存器及调用栈规则、调试输出接口转换规则、内存分布规则中的至少一项;
所述符号表信息转换规则为:在线调试命令业务相关符号或者全局符号的地址映射信息转换到在线调试器能识别的符号信息的规则;
所述寄存器及调用栈规则为:通用寄存器个数,函数返回地址,栈指针或者个人计算机PC指针的寄存器配置,以及函数调用栈信息;
所述调试输出接口转换规则为:在线调试的命令接口转换到离线调试命令接口的规则;
所述内存分布规则为:确定私有内存或者共享内存的大小及分布的规则。
本发明实施例二方面提供了一种嵌入式***的调试转换装置,包括:
规则获取单元,用于获取定制的在线调试命令到离线调试命令的转换规则;
源码接收单元,用于接收在线调试命令的源码;
转换单元,用于在所述源码接收单元接收到在线调试命令的源码后,按照所述规则获取单元获取到的转换规则,将所述在线调试命令的源码转换成支持离线调试的代码;
发送单元,用于将所述转换单元得到的支持离线调试的代码发送给目标板。
结合二方面的实现方式,在第一种可选的实现方式中,所述转换单元,具体用于将所述在线调试命令的源码转换成离线调试命令的源码;将得到的离线命令源码和当前的调试器客户端进行二次编译生成支持离线调试的调试器客户端;或者,将所述在线调试命令的源码转换成离线调试命令的代码并链接为动态库;
所述发送单元,具体用于将所述转换单元得到的支持离线调试的调试器客户端发送给目标板;或者将所述转换单元得到的动态库发送给目标板。
结合二方面的实现方式,在第二种可选的实现方式中,所述转换单元,具体用于使用编译器将所述在线调试命令的源码转换成离线命令的源码;或者,通过客户端工具将所述在线调试命令的源码转换成离线命令的源码。
结合第二种的实现方式,在第三种可选的实现方式中,所述转换单元包括:
读取单元,用于读入所述源码接收单元接收的在线调试命令的源码;
匹配单元,用于根据所述规则获取单元获取的转换规则进行字符串的规则匹配;
源码生成单元,用于若所述匹配单元匹配成功,则调用转换处理接口生成编译器能识别的词法或者语法单元,然后输出离线调试命令的源码。
结合一方面、第一种、第二种或第三种可选的实现方式,在第四种可选的实现方式中,所述规则获取单元,获取的转换规则包括:符号表信息转换规则、寄存器及调用栈规则、调试输出接口转换规则、内存分布规则中的至少一项;
所述符号表信息转换规则为:在线调试命令业务相关符号或者全局符号的地址映射信息转换到在线调试器能识别的符号信息的规则;
所述寄存器及调用栈规则为:通用寄存器个数,函数返回地址,栈指针或者个人计算机PC指针的寄存器配置,以及函数调用栈信息;
所述调试输出接口转换规则为:在线调试的命令接口转换到离线调试命令接口的规则;
所述内存分布规则为:确定私有内存或者共享内存的大小及分布的规则。
本发明实施例三方面提供了一种嵌入式***的调试***,包括,调试器、目标板,还包括:本发明实施例提供的任意一项的调试转换装置;
所述调试转换装置从所述调试器的客户端接收在线调试命令的源码,并将支持离线调试的代码输出给所述目标板的服务端。
从以上技术方案可以看出,本发明实施例具有以下优点:通过将在线调试命令进行从在线调试命令的源码到离线调试的代码的转换,实现在线调试命令的离线调试,可以解决嵌入式***软件的在线调试和离线调试的重复开发问题,避免对不同的平台实现离线调试,或对相同的平台实现不同版本的离线调试时都需要修改调试器客户端的问题,因此,可以增加在线调试工具的使用范围,缩短离线调试工具的开发时间,降低了开发成本。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明实施例提供了一种嵌入式***的调试方法,如图1所示,包括:
101:获取定制的在线调试命令到离线调试命令的转换规则;
上述在线调试命令到离线调试命令的转换规则,可以是任意可以建立在线调试命令到离线调试命令对应关系的规则,转换规则可以根据实际需要增加或者减少,具体的形式本发明实施例给出了如下举例:可选地,上述转换规则包括:符号表信息转换规则、寄存器及调用栈规则、调试输出接口转换规则、内存分布规则中的至少一项;上述符号表信息转换规则为:在线调试命令业务相关符号或者全局符号的地址映射信息转换到在线调试器能识别的符号信息的规则;上述寄存器及调用栈规则为:通用寄存器个数,函数返回地址,栈指针或者个人计算机PC指针的寄存器配置,以及函数调用栈信息;上述调试输出接口转换规则为:在线调试的命令接口转换到离线调试命令接口的规则;上述内存分布规则为:确定私有内存或者共享内存的大小及分布的规则。需要说明的是,代码转换的规则可以有很多种类,以上举例不应理解为对本发明实施例的限定。
102:在接收到在线调试命令的源码后,按照上述转换规则,将上述在线调试命令的源码转换成支持离线调试的代码;
可选地,本发明实施例给出了两种可选的支持离线调试的代码的方案,如下:上述将上述在线调试命令的源码转换成支持离线调试的代码包括:将上述在线调试命令的源码转换成离线调试命令的源码;将得到的离线命令源码和当前的调试器客户端,进行二次编译生成支持离线调试的调试器客户端;或者,将上述在线调试命令的源码转换成离线调试命令的代码并链接为动态库。
可选地,本发明实施例还给出了两种在线调试命令到离线调试命令的源码到源码的转换实现方案,具体地:上述将上述在线调试命令的源码转换成离线调试命令的源码包括:使用编译器将上述在线调试命令的源码转换成离线命令的源码;或者,通过客户端工具将上述在线调试命令的源码转换成离线命令的源码。
可选地,本发明实施例还给出了使用编译器实现源码到源码的转换的具体实现方式,如下:上述使用编译器将上述在线调试命令的源码转换成离线命令的源码包括:读入上述在线调试命令的源码,根据上述转换规则进行字符串的规则匹配,若匹配成功,则调用转换处理接口生成编译器能识别的词法或者语法单元,然后输出离线调试命令的源码。
103:将上述支持离线调试的代码发送给目标板。
以上方案,通过将在线调试命令进行从在线调试命令的源码到离线调试的代码的转换,实现在线调试命令的离线调试,可以解决嵌入式***软件的在线调试和离线调试的重复开发问题,避免对不同的平台实现离线调试,或对相同的平台实现不同版本的离线调试时都需要修改调试器客户端的问题,因此,可以增加在线调试工具的使用范围,缩短离线调试工具的开发时间,降低了开发成本。
可选地,对应于前面实施例的两种可选的支持离线调试的代码的方案,上述将上述支持离线调试的代码发送给目标板包括:将上述支持离线调试的调试器客户端发送给目标板;或者,将上述动态库发送给目标板。
以下实施例分别就结构组成、调试组网、源码转换以及实例的角度对以上实施例的方案进行更详细的举例说明。
一、结构组成
请参阅图2所示为:通过源到源转换,生成离线命令的模块结构示意图,其中箭头方向为数据流向。
本例中为嵌入式***开发的在线和离线调试器都可以使用C作为编程语言。在线调试命令源码(主要是.c和.h文件)作为离线命令转换器的输入源。
离线命令转换器主要有三个部分:符号解析模块、转储文件解析模块及源到源转换模块。
符号解析模块从输入源中获取全局符号的定义及地址映射表,以及与业务相关的符号描述信息,进行符号解析与处理后,输出到源到源转换模块。
源到源转换模块的另一个输入来自转储文件解析模块,转储文件解析模块主要完成对离线文件寄存器及调用栈规则的分析与处理,这部分通常与嵌入式***的ISA(Industrial Standard Architecture,工业标准结构总线)强相关。
当源到源转换模块获取到需要的信息后就可以通过内部定义好的规则完成最后的离线调试命令源码(主要是.c和.h文件)的输出。此时的离线调试器已经具有了在线调试器模块拥有的业务相关符号表信息及地址信息,使用离线调试器的打印接口就可以获取产品业务相关信息。
二、调试组网
如图3所示的典型的调试器组网示意图,
在线调试场景下,位于PC(personal computer,个人计算机)端的调试器客户端和位于目标板(Board)上的调试服务端通过ETH(Ethernet,网口)或者串口等通道进行通信。其中在PC侧还包含有IDE(Integrated DevelopmentEnvironment,集成开发环境),在Board侧还包含有应用程序、***以及内存/寄存器。
离线调试场景下,调试器客户端通过文件I/O从个人电脑的转储文件(Core File on PC)中获取所需要的寄存器/内存信息,操作***信息或产品业务信息。
三、源码转换
请参阅图4为:在线命令转换成离线命令的流程示意图。
401:制定在线调试命令平滑到离线调试命令的转换规则;
在线调试命令到离线命令的转换有一套完整的规则。规则的定制主要可以包含以下几部分:符号表信息转换规则,主要制定将在线调试命令业务相关符号或者全局符号的地址映射信息转换到在线调试器能识别的符号信息的规则。寄存器及调用栈规则,包括通用寄存器个数,函数返回地址,栈指针及PC指针等寄存器配置,以及函数调用栈信息等。调试输出接口转换规则,制定将在线调试的命令接口转换到离线调试命令接口。内存分布规则,确定私有内存或者共享内存的大小及分布等。可以根据实际业务的需求,添加或者删减某些规则。
402:使用源码转换编译器将在线调试命令的源码转换成离线调试命令的源码;
本步骤的转换的基本原理可以为:读入在线调试命令的源码,根据上述制定的转换规则进行字符串的规则匹配。如果匹配成功,则调用转换处理接口生成编译器能识别的词法或者语法单元,再由编译器输出最后的离线调试命令的源码。
403:通过将402中生成的离线调试命令的源码连同架构及转换无关的离线调试的源码,编译在一起即可生成新的离线调试器客户端。
以上方案步骤402和403均可以采用其他方式进行替换,具体如下:
上述流程示意图4中的402是采用了源码转换编译器将在线调试命令的源码转换成离线调试命令的源码。替代方案可以不依赖于编译器,单独实现一个将在线调试命令的源码转换成离线调试命令的源码的转换客户端工具。也就是说转换工具可以脱离编译器,客户端工具具备解析流程图规则,生成最终源码的功能。
流程示意图4中的402另一种替代方案是通过编译器,将转换出来的离线命令的代码(主要是.c和.h文件)链接成一个动态库(.dll或.so格式)。那么403中的二次编译就可以省略,离线的调试器客户端只需要动态加载402中生成的动态库就能完成相应的调试功能。
四、实例
以下是一种实施场景:
请参阅图5所示为一个源到源转换过程实例,该实例以查询当前***的CPU(Central Processing Unit,中央处理器)负载率为例,图5采用C语言编写,可参考C语言编写的相关规范,其中左侧一列为在线调试命令的源码,右侧箭头指向的是与之对应的离线调试命令的源码,该实例将在线调试命令的源码转换成离线调试命令的源码的过程。主要分为三个步骤:
1、识别出该命令实现中的全局变量。这是一个业务相关的全局变量,首先是要具有识别这个业务符号的转换规则。规则很简单,识别引号内的字符串(即图5中,上面的大框中的最上一个虚线框内的粗体字内容)。
离线命令转换器不断读入输入文件(即图5左侧侧代码),当识别到DSP_LkAddr关键字时(这是一个业务查询符号地址的调用接口,在规则制定的时候,会把这个接口调用配置在规则内,用于字符串的匹配),离线命令转换器匹配到这个关键字后面的用双引号括起来的字符串,在这个例子中就是gstruCpuLoad。附带的隐含转换规则是将原有结构体成员调用转换为已识别字符串的成员调用,如struCpuLoad.uwCurLoad---->gstruCpuLoad.uwCurLoad,这个转换结果将作为下面函数调用转换接口的输入。如图5所示的箭头所示的转换对应关系。
2、获取全局变量值的函数调用,替换成离线调试客户端中的函数调用。
如图5中,将在线查询业务变量地址的调用接口DSP_CommRead转换成相应的离线调用接口getSymAddrSize,同时把上面struCpuLoad.uwCurLoad---->gstruCpuLoad.uwCurLoad转换结果作为接口参数传入。
3、命令返回结果输出的函数调用替换成离线调试客户端的函数调用。
全局符号及获取全局量的接口转换完成后,就可以实现最后一步平台打印输出接口的转换,这个转换了实现了最后调试结果输出切换的功能。比如本例中的在线调试接口LBB_DSP_Printf转换到离线打印接口printf。
采用以上方案,由于嵌入式***软件的在线调试和离线调试应用于不同的场景,且都是必不可少的调试方式。本发明实施例实现在线调试命令的离线调试,可以解决嵌入式***软件的在线调试和离线调试的重复开发问题,通过将在线调试命令进行从在线调试命令的源码到离线调试的代码的转换,转换成可以在PC机上使用的离线调试命令,以及将命令中涉及到的产品业务信息使用符号解析功能转换成地址和长度,离线命令通过查询相应的内存地址区间即可以获取***相关信息。实现在线调试命令的离线调试可以避免对不同的平台实现离线调试,或对相同的平台实现不同版本的离线调试时都需要修改调试器客户端的问题,因此,本发明方法可以增加在线调试工具的使用范围,缩短离线调试工具的开发时间,降低了开发成本。
本发明实施例还提供了一种嵌入式***的调试转换装置,如图6所示,包括:
规则获取单元601,用于获取定制的在线调试命令到离线调试命令的转换规则;
源码接收单元602,用于接收在线调试命令的源码;
转换单元603,用于在上述源码接收单元602接收到在线调试命令的源码后,按照上述规则获取单元601获取到的转换规则,将上述在线调试命令的源码转换成支持离线调试的代码;
发送单元604,用于将上述转换单元603得到的支持离线调试的代码发送给目标板。
以上方案,通过将在线调试命令进行从在线调试命令的源码到离线调试的代码的转换,实现在线调试命令的离线调试,可以解决嵌入式***软件的在线调试和离线调试的重复开发问题,避免对不同的平台实现离线调试,或对相同的平台实现不同版本的离线调试时都需要修改调试器客户端的问题,因此,可以增加在线调试工具的使用范围,缩短离线调试工具的开发时间,降低了开发成本。
可选地,上述转换单元603,具体用于将上述在线调试命令的源码转换成离线调试命令的源码;将得到的离线命令源码和当前的调试器客户端进行二次编译生成支持离线调试的调试器客户端;或者,将上述在线调试命令的源码转换成离线调试命令的代码并链接为动态库;
上述发送单元604,具体用于将上述转换单元603得到的支持离线调试的调试器客户端发送给目标板;或者将上述转换单元603得到的动态库发送给目标板。
可选地,上述转换单元603,具体用于使用编译器将上述在线调试命令的源码转换成离线命令的源码;或者,通过客户端工具将上述在线调试命令的源码转换成离线命令的源码。
可选地,如图7所示,上述转换单元603包括:
读取单元701,用于读入上述源码接收单元602接收的在线调试命令的源码;
匹配单元702,用于根据上述规则获取单元601获取的转换规则进行字符串的规则匹配;
源码生成单元704,用于若上述匹配单元702匹配成功,则调用转换处理接口生成编译器能识别的词法或者语法单元,然后输出离线调试命令的源码。
可选地,上述规则获取单元601,获取的转换规则包括:符号表信息转换规则、寄存器及调用栈规则、调试输出接口转换规则、内存分布规则中的至少一项;
上述符号表信息转换规则为:在线调试命令业务相关符号或者全局符号的地址映射信息转换到在线调试器能识别的符号信息的规则;
上述寄存器及调用栈规则为:通用寄存器个数,函数返回地址,栈指针或者个人计算机PC指针的寄存器配置,以及函数调用栈信息;
上述调试输出接口转换规则为:在线调试的命令接口转换到离线调试命令接口的规则;
上述内存分布规则为:确定私有内存或者共享内存的大小及分布的规则。
本发明实施例还提供了一种嵌入式***的调试***,如图8所示,包括,调试器801、目标板803,还包括:本发明实施例提供的任意一种调试转换装置802;上述调试转换装置802从上述调试器801的客户端接收在线调试命令的源码,并将支持离线调试的代码输出给上述目标板803的服务端。
值得注意的是,上述调试转换装置实施例中,所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
另外,本领域普通技术人员可以理解实现上述各方法实施例中的全部或部分步骤是可以通过程序来指令相关的硬件完成,相应的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明实施例揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。