技术领域
[0001] 本发明涉及软件调试技术领域,尤其涉及一种软件调试系统。
相关背景技术
[0002] 现有基于软件仿真平台、硬件仿真平台及虚拟原型平台等进行嵌入式软件开发与调试,往往因为仿真平台或调试方案的不同而使用不同的调试器平台,用户需要对不同的调试器投入成本,且采用不同的调试器平台很难保证调试的一致性。
[0003] 此外,现有的软件调试手段大多采用单向的、侵入式的和在线的方式来调试。单向调试方式只能随着时间向后推移的方式调试,不能回溯。侵入式方式指的是调试器会改变处理器行为以达到调试目的,即会改变程序本身的执行行为,会中断程序的运行,且这种情况下,再一次调试时可能无法出现之前出现的错误。在线模式指的是在程序运行过程中调试,无法在离线的状态下调试。因此现有的软件调试手段如果需要回溯到当前时刻之前的运行点,需要重新启动程序来实现,且通常需要重启多次才能定位到问题点,调试效率很低。
[0004] 现有技术中存在一些软件调试器能够提供回溯功能,但都面向的都是普通的应用软件,且存在性能低下的问题。此外,现有的回溯调试对应的软件与芯片嵌入式软件开发无关,尤其无法使用在芯片流片前的验证环节中。由此可知,如何提供一种能够高效、高性能的且能适用于芯片流片前的验证环节多种调试场景的通用软件调试技术成为亟待解决的技术问题。
具体实施方式
[0019] 为更进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明提出的一种软件调试系统的具体实施方式及其功效,详细说明如后。
[0020] 本发明实施例提供了一种软件调试系统,如图1所示,包括前端界面、通用调试器、软件仿真器、硬件仿真器、虚拟原型平台;其中,所述通用调试器包括软件仿真调试接口、硬件仿真调试接口、虚拟原型调试接口、回溯调试接口和数据库,所述软件仿真器与所述软件仿真调试接口相连接,所述硬件仿真器与所述硬件仿真调试接口相连接,所述虚拟原型平台与所述虚拟原型调试接口相连接,所述软件仿真器、硬件仿真器、虚拟原型平台、回溯调试模块与所述数据库相连接。
[0021] 所述前端界面获取待调试的软件程序和调试指令,并发送给所述通用调试器。作为示例,前端界面可以设置窗口和按钮等,供用户输入指令,例如可以设置在线正向调试对应的向后执行按钮、设置断点按钮,还可以包括回溯调试对应的回溯按钮、向前回溯按钮、向后执行按钮等,其中,向前回溯按钮、向后执行按钮均可以设置对应的步长,可以是单步,也可以是多步。这便使得用户通过一个统一的界面,可以实现适用于芯片流片前的验证环节多种调试场景,还可以实现不同模式的下的调试。
[0022] 所述通用调试器用于解析所述调试指令,基于所述调试指令切换调试接口,执行对应的调试操作,具体可包括:
[0023] 若所述待调试的软件程序为硬件描述语言(如Verilog)编写的程序,,且运行目标运行速度小于预设运行速度阈值时,则调用所述软件仿真调试接口控制所述软件仿真器运行所述待调试的软件程序,同时支持采集CPU行为信息并存储至所述数据库中。
[0024] 若所述待调试的软件程序运行在硬件描述语言编写的芯片设计上,且运行目标运行速度大于等于预设运行速度阈值时,则调用所述硬件仿真调试接口控制所述硬件仿真器运行所述待调试的软件程序,同时支持采集CPU行为信息并存储至所述数据库中。需要说明的是,运行速度阈值根据具体的调试需求来设定。
[0025] 若所述待调试的软件程序运行在C语言、C++语言或SystemC语言编写的芯片原型上,则调用所述虚拟原型调试接口控制所述虚拟原型平台运行所述待调试的软件程序,同时支持采集CPU行为信息并存储至所述数据库中。
[0026] 需要说明的是,本发明所述系统中,软件仿真器和硬件仿真器均可用于仿真硬件描述语言编写的芯片设计,二者的仿真速度有差异,硬件仿真器仿真速度较快,软件仿真器会有最好的debug能力,但是仿真大型芯片时速度会比较慢,因此,可以根据具体目标运行速度来选择软件仿真器和硬件仿真器。需要说明的是,软件仿真器也是可以模拟C语言程序的、C++语言或SystemC语言描述的芯片设计。
[0027] 作为一种实施例,所述待调试程序为芯片流片前的验证环节所需的软件程序。在芯片开发过程中,在硬件仿真器模拟芯片设计阶段未完成之前,可以采用C语言来描述芯片设计。此阶段的待调程序可以选择虚拟原型平台来运行。当有部分芯片模块被开发出来,部分未开发出来时,可以将已开发的芯片模块采用真实的用芯片开发语言来描述,在硬件仿真器模拟芯片设计,其他未开发出来的部分芯片模块仍然用C语言来描述,在虚拟原型平台模拟。由此可知,此开发阶段的待调试程序一部分需要在硬件仿真器上运行,一部分需要在虚拟原型平台上运行。此时,使用本发明所述系统调用不同的调试接口,即可满足不同的调试需求。当芯片所有模块开发完成,则直接使用Verilog编写芯片设计,可以通过硬件仿真器模拟或软件仿真器来模拟芯片设计,硬件描述语言是更能仿真出接近于真实芯片的功能,根据运行速度的需求选择硬件仿真器或软件仿真器来运行待调试程序。
[0028] 由此可知,本发明所述系统适用于芯片流片前的验证环节多种调试场景,作为一种实施例,若所述待调试的软件程序所运行的芯片设计,既包括硬件描述语言描述的芯片设计部分又包括C语言、C++语言或SystemC语言描述的芯片设计部分,则运行至硬件描述语言描述的芯片设计部分时,所述通用调试器将所述待调试的软件程序分配至对应的硬件仿真器或软件仿真器运行;当运行至C语言、C++语言或SystemC语言描述的芯片设计部分时,所述通用调试器将所述待调试的软件程序分配至对应的虚拟原型平台运行。所有切换过程均在通用调试器后台切换完成,整个过程用户无感知,提高了调试效率和性能。但可以理解的是,本发明所述系统也可实现对普通应用程序的调试。
[0029] 所述通用调试器若接收到在线正向调试指令,则调用所述软件仿真调试接口、硬件仿真调试接口、虚拟原型调试接口对待调试的软件程序的过程执行在线正向调试操作。所述通用调试器若接收到回溯调试指令,则调用所述回溯调试接口访问所述数据库,基于数据库查找操作进行回溯调试。
[0030] 作为一种实施例,所述通用调试器调用所述软件仿真调试接口、硬件仿真调试接口、虚拟原型调试接口对待调试的软件程序的过程执行在线正向调试操作,具体包括:
[0031] 所述调用所述软件仿真调试接口、硬件仿真调试接口、虚拟原型调试接口采用侵入式的方式设置待调试的软件程序的分支执行行为,使得所述待调试的软件程序按照设置的分支行为运行。
[0032] 需要说明的是,在一些调试场景中,程序原本朝着一个分支运行,但是基于调试需求,需要改变CPU的行为,尝试另外一个分支,采用在线正向运行并调试待调试的软件程序的方式,可以在不作重新编译,不重新建立debug的情况下,改变CPU行为,探索新的运行分支,调试过程灵活,能够适应软件开发过程中的多种调试需求,且整个运行过程会被数据库记录下来,供后续回溯调试。
[0033] 需要说明的是,在线正向调试即采用时间向后推进的方式正向调试程序,该过程中是可以根据调试需求,采用侵入式的方式改变CPU行为。
[0034] 作为一种实施例,所述通用调试器调用所述软件仿真调试接口、硬件仿真调试接口、虚拟原型调试接口对待调试的软件程序的过程执行在线正向调试操作,具体包括:采用单步向后执行或者设置断点的方式在线正向调试所述待调试的软件程序。
[0035] 其中,单步向后执行的方式调试,即每执行一步检查该步执行结果是否与预期一致,从而当前执行点是否为目标问题点。设置断点的方式具体可以根据调试需求设置一个或多个断点进行在线调试。
[0036] 作为一种实施例,所述CPU行为信息包括程序计数信息(Programcount)、预设的关键寄存器的变更信息、内存访问信息和CPU事件信息。待调试的软件程序每执行一步均会产生对应的Program count。运行待调试的软件程序的过程中会设置多个寄存器,只需将与调试任务相关的寄存器设置为预设的关键寄存器即可,将关键寄存器每一次变更信息都记录下来。内存访问信息包括堆内存的读信息和写信息。CPU事件信息包括复位事件和重启事件等。
[0037] 作为一种实施例,每一调试接口具体可设置预设的信息采集组件来获取CPU行为信息,信息采集组件可以为现有的用于捕捉CPU行为的trace capture组件,trace capture组件会捕捉多个CPU行为信息,每一CPU行为信息均有对应的时间戳。需要说明的是,trace capture组件直接采集的CPU行为信息中会存在许多冗余信息,占据空间大。因此,可以通过解析trace capture组件提取的CPU行为信息,从中提取程序计数值,以及对应的关键寄存器状态、内存访问状态和CPU事件信息,将程序计数值作为键值,构建数据库,所述数据库包括运行待调试的软件程序的所有记录,所述记录包括程序计数值字段、关键寄存器状态字段、内存访问状态字段和CPU事件信息字段。
[0038] 作为一种实施例,预设的信息采集组件也可以为预先设置的只用于采集关键寄存器状态、内存访问状态和CPU事件信息的采集组件,直接采集关键寄存器状态、内存访问状态和CPU事件信息来构建所述数据库。此外,还可以通过数据压缩等技术手段压缩数据,减小数据库的大小,这样即便运行较长的程序,也可以保证数据库的尺寸不会过大。通过构建数据库,将CPU每一步执行的关键行为信息进行记录,将回溯调试过程中控制CPU行为转换为数据库的查找行为,速度相较于控制CPU的行为得到CPU信息的速度会有很大提升,从而提高回溯调试效率。
[0039] 需要说明的是,调试用户仅知道待调试的软件程序目标跳转函数,但是并不知道对应的目标数据库键值,在数据库构建的过程中,同时会建立数据库键值和跳转函数之间的映射关系。作为一种实施例,在构建所述数据库的过程中,还包括:建立数据库键值和跳转函数之间的映射关系。作为一种实施例,若所述通用调试器仅接收到回溯调试指令,则所述通用调试器调用所述回溯调试接口访问所述数据库,基于数据库查找操作进行回溯调试,具体包括:获取用户输入的目标跳转函数,基于所述数据库键值和跳转函数之间的映射关系将所述目标跳转函数转译为目标数据库键值,基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的CPU行为信息进行回溯调试。
[0040] 作为一种实施例,若所述通用调试器既接收到回溯调试指令又接收到在线正向调试指令,则所述通用调试器调用所述回溯调试接口访问所述数据库,基于数据库查找操作进行回溯调试,具体包括:当接收到回溯调试请求时,将所述待调试的软件程序暂停至当前调试点,获取用户输入的目标跳转函数,将所述目标跳转函数转译为目标数据库键值;基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的CPU行为信息进行回溯调试,回溯调试完成后,从所述当前调试点开始继续正向运行并调试待调试的软件程序。
[0041] 其中,通过基于数据库的回溯调试,可以在在线调试任务中,自由回溯到当前仿真时间点之前的任意时刻进行调试,通过回溯调试接口,基于所述数据库执行回溯调试过程,在通用调试器偷来根据调试需求自由切换在线调试模式和回溯调试模式,在向前或回溯调试模式下,并且在不同模式下用户前端控制保持高度统一,用户接口和调试体验保持高度统一。此外,本实施方式能够实现在单次运行待调试的软件程序过程中同时实现正向调试和回溯调试的功能,且能提供用户在回溯调试完成后能够继续运行待调试的软件程序,极大节约了软件调试迭代时间,提高了软件调试的效率和性能。
[0042] 作为一种实施例,基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的CPU行为信息进行回溯调试,具体可包括:基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息;若所述目标数据库键值对应的关键寄存器状态、内存访问状态或CPU事件信息与所述目标数据库键值对应的预设关键寄存器状态、预设内存访问状态或预设CPU事件信息不一致,则确定所述目标数据库键值对应的程序运行点为目标问题点。
[0043] 需要说明的是,预设关键寄存器状态、预设内存访问状态或预设CPU事件信息,为待调试的软件程序正常运行的预期值。当均一致时,说明程序在该运行点以及该运行点之前均没有问题,若存在一个值不一致,则说明该运行点为目标问题点。
[0044] 但通常情况下,一次很难直接定位到目标问题点,因此需要反复回溯调试多次,作为一种实施例,若所述目标数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,与所述目标数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息均一致,则还包括:重新获取用户重新输入的目标跳转函数,将重新输入的目标跳转函数转译为目标数据库键值,基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的CPU行为信息进行回溯调试。
[0045] 需要说明的是,当确认上一目标跳转函数对应的程序执行点不是目标问题执行点之后,则目标问题执行点位于该程序执行点之后,则用户重新输入该程序执行点之后对应的目标跳转函数即可。可以多次指定回溯点,回溯至指定回溯点上,检测回溯点是否为目标问题点。
[0046] 作为一种实施例,当指定一个回溯点,且该会回溯点不是目标问题点时,可以以该回溯点为起点,采用单步或多步向后调试的方式来定位问题点,若所述目标数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,与所述目标数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息均一致,则执行:控制所述数据库键值从所述目标数据库键值开始按照预设的键值步长向后跳转,获取每一跳转的数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,并与每一数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息进行对比,若一致,则判断当前数据库键值对应程序运行点为目标问题点。
[0047] 其中,多数预设的键值步长可以为单步也可以为多步,即在数据库中逐条遍历记录调试,或者间隔读取记录调试。
[0048] 在一些情况下,待调试的软件程序运行过程中可能不止一个目标问题点,或者有需要向前回溯的需求,此种情况下,可以确定一个回溯点,然后往前回溯去确定目标问题点,作为一种实施例,基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的CPU行为信息进行回溯调试,还可包括:控制所述数据库键值从所述目标数据库键值开始按照预设的键值步长向前跳转,获取每一跳转的数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,并与每一数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息进行对比,若一致,则判断当前数据库键值对应程序运行点为目标问题点。
[0049] 其中,多数预设的键值步长可以为单步也可以为多步,即在数据库中逐条遍历记录调试,或者间隔读取记录调试。本实施方式能够实现在单次运行待调试的软件程序过程中同时实现正向调试和回溯调试的功能,且能提供用户在回溯调试完成后能够继续运行待调试的软件程序。本发明实施例极大节约了软件调试迭代时间,提高了软件调试的效率和性能。
[0050] 本发明实施例通过提供不同的调试接口以及一个统一的调试器前端,降低调试器用户对于不同调试器的学习成本,提高调试一致性,适用于芯片流片前的验证环节多种调试场景,提高了调试效率和性能,提升了用户调试体验。
[0051] 以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。