首页 / 一种软件调试方法

一种软件调试方法实质审查 发明

技术领域

[0001] 本发明涉及软件调试技术领域,尤其涉及一种软件调试方法。

相关背景技术

[0002] 现有的软件调试手段大多采用单向的、侵入式的和在线的方式来调试。单向调试方式只能随着时间向后推移的方式调试,不能回溯。侵入式方式指的是调试器会改变处理器行为以达到调试目的,即会改变程序本身的执行行为,会中断程序的运行,且这种情况下,再一次调试时可能无法复现之前出现的错误。在线模式指的是在程序运行过程中调试,无法在离线的状态下调试。因此现有的软件调试手段如果需要回溯到当前时刻之前的运行点,需要重新启动程序来实现,且通常需要重启多次才能定位到问题点,调试效率很低。
[0003] 现有技术中存在一些软件调试器能够提供回溯功能,但都面向普通应用软件,且存在性能低下的问题,此外,现有的回溯调试对应的软件与芯片嵌入式软件开发无关,尤其无法使用在芯片流片前的验证环节中。由此可知,如何提供一种能够高效、高性能的且能适用于芯片流片前的验证环节的软件调试方法成为亟待解决的技术问题。

具体实施方式

[0016] 为更进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明提出的一种软件调试方法的具体实施方式及其功效,详细说明如后。
[0017] 本发明实施例提供了一种软件调试方法,如图1所示,包括:
[0018] 步骤S1、在线正向运行并调试待调试的软件程序,采用预设的信息实时采集组件采集CPU行为信息,基于所述CPU行为信息实时构建数据库;
[0019] 其中,在线正向运行并调试待调试的软件程序,即采用时间向后推进的方式正向调试程序,该过程中是可以根据调试需求,采用侵入式的方式改变CPU行为。
[0020] 步骤S2、当接收到回溯调试请求时,将所述待调试的软件程序暂停至当前调试点,获取用户输入的目标跳转函数,将所述目标跳转函数转译为目标数据库键值;
[0021] 其中,通过基于数据库的回溯调试,可以在在线调试任务中,自由回溯到当前仿真时间点之前的任意时刻进行调试,具体可以设置一个在线调试引擎执行在线正向运行并调试待调试的软件程序的过程,设置一个离线调试引擎,基于所述数据库执行回溯调试过程,在后台根据调试需求自由切换在线调试引擎和离线调试引擎,在向前或回溯调试模式下,并且在不同模式下用户前端控制保持高度统一,用户接口和调试体验保持高度统一。
[0022] 步骤S3、基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的CPU行为信息进行回溯调试,回溯调试完成后,执行步骤S4;
[0023] 步骤S4、从所述当前调试点开始继续正向运行并调试待调试的软件程序。
[0024] 作为示例,步骤S1中,所述待调试的软件程序可以为普通应用程序,也可以为用于嵌入式开发及调试的芯片流片前的验证环节中的软件程序。若待调试的软件程序为芯片流片前的验证环节中的软件程序,则具体可基于预设的仿真平台模拟芯片运行所述待调试的软件程序。当然,也可以采用真实芯片运行所述待调试的软件程序。
[0025] 本发明实施例能够实现在单次运行待调试的软件程序过程中同时实现正向调试和回溯调试的功能,且能提供用户在回溯调试完成后能够继续运行待调试的软件程序。本发明极大节约了软件调试迭代时间,提高了软件调试的效率和性能。
[0026] 作为一种实施例,所述步骤S1中,所述在线正向运行并调试待调试的软件程序,包括:
[0027] 步骤S11、采用侵入式的方式设置待调试的软件程序的分支执行行为,使得所述待调试的软件程序按照设置的分支行为运行。
[0028] 需要说明的是,在一些调试场景中,程序原本朝着一个分支运行,但是基于调试需求,需要改变CPU的行为,尝试另外一个分支,采用步骤S1中的在线正向运行并调试待调试的软件程序的方式,可以在不作重新编译,不重新建立debug的情况下,改变CPU行为,探索新的运行分支,调试过程灵活,能够适应软件开发过程中的多种调试需求,且整个运行过程会被数据库记录下来,供后续回溯调试。
[0029] 作为一种实施例,所述步骤S1中,所述在线正向运行并调试待调试的软件程序,包括:
[0030] 步骤S12、采用单步向后执行的方式在线调试所述待调试的软件程序。
[0031] 其中,单步向后执行的方式调试,即每执行一步检查该步执行结果是否与预期一致,从而当前执行点是否为目标问题点。
[0032] 作为一种实施例,所述步骤S1中,所述在线正向运行并调试待调试的软件程序,包括:
[0033] 步骤S12、采用设置断点的方式在线调试所述待调试的软件程序。
[0034] 可以理解的是,可以根据调试需求设置一个或多个断点进行在线调试。
[0035] 作为一种实施例,所述CPU行为信息包括程序计数信息(Programcount)、预设的关键寄存器的变更信息、内存访问信息和CPU事件信息。待调试的软件程序每执行一步均会产生对应的Program count。运行待调试的软件程序的过程中会设置多个寄存器,只需将与调试任务相关的寄存器设置为预设的关键寄存器即可,将关键寄存器每一次变更信息都记录下来。内存访问信息包括堆内存的读信息和写信息。CPU事件信息包括复位事件和重启事件等。
[0036] 作为一种实施例,步骤S1中,预设的信息采集组件可以为现有的用于捕捉CPU行为的trace capture组件,trace capture组件会捕捉多个CPU行为信息,每一CPU行为信息均有对应的时间戳。需要说明的是,trace capture组件直接采集的CPU行为信息中会存在许多冗余信息,占据空间大。因此,可以通过解析trace capture组件提取的CPU行为信息,从中提取程序计数值,以及对应的关键寄存器状态、内存访问状态和CPU事件信息,将程序计数值作为键值,构建数据库,所述数据库包括运行待调试的软件程序的所有记录,所述记录包括程序计数值字段、关键寄存器状态字段、内存访问状态字段和CPU事件信息字段。
[0037] 作为一种实施例,步骤S1中,预设的信息采集组件也可以为预先设置的只用于采集关键寄存器状态、内存访问状态和CPU事件信息的采集组件,直接采集关键寄存器状态、内存访问状态和CPU事件信息来构建所述数据库。
[0038] 此外可以通过数据压缩等技术手段压缩数据,减小数据库的大小,这样即便运行较长的程序,也可以保证数据库的尺寸不会过大。
[0039] 通过构建数据库,将CPU每一步执行的关键行为信息进行记录,将回溯调试过程中控制CPU行为转换为数据库的查找行为,速度相较于控制CPU的行为得到CPU信息的速度会有很大提升,从而提高回溯调试效率。
[0040] 需要说明的是,调试用户仅知道待调试的软件程序目标跳转函数,但是并不知道对应的目标数据库键值,在数据库构建的过程中,同时会建立数据库键值和跳转函数之间的映射关系。作为一种实施例,所述步骤S1中,在构建所述数据库的过程中,还包括:
[0041] 步骤S10、建立数据库键值和跳转函数之间的映射关系。
[0042] 所述步骤S2中,将所述目标跳转函数转译为目标数据库键值,包括:
[0043] 步骤S21、基于所述数据库键值和跳转函数之间的映射关系将所述目标跳转函数转译为目标数据库键值。具体可通过离线调试引擎实现。
[0044] 作为一种实施例,所述步骤S3包括:
[0045] 步骤S31、基于所述目标数据库键值检索所述数据库,获取所述目标数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息;
[0046] 步骤S32、若所述目标数据库键值对应的关键寄存器状态、内存访问状态或CPU事件信息与所述目标数据库键值对应的预设关键寄存器状态、预设内存访问状态或预设CPU事件信息不一致,则确定所述目标数据库键值对应的程序运行点为目标问题点。
[0047] 需要说明的是,预设关键寄存器状态、预设内存访问状态或预设CPU事件信息,为待调试的软件程序正常运行的预期值。当均一致时,说明程序在该运行点以及该运行点之前均没有问题,若存在一个值不一致,则说明该运行点为目标问题点。
[0048] 但通常情况下,一次很难直接定位到目标问题点,因此需要反复调试多次,作为一种实施例,所述步骤S32中,若所述目标数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,与所述目标数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息均一致,则执行:
[0049] 步骤S32、返回步骤S2中,重新获取用户重新输入的目标跳转函数,将重新输入的目标跳转函数转译为目标数据库键值,执行步骤S3。
[0050] 需要说明的是,当确认上一目标跳转函数对应的程序执行点不是目标问题执行点之后,则目标问题执行点位于该程序执行点之后,则用户重新输入该程序执行点之后对应的目标跳转函数即可。通过步骤S32可以多次指定回溯点,回溯至指定回溯点上,检测回溯点是否为目标问题点。
[0051] 作为一种实施例,当指定一个回溯点,且该会回溯点不是目标问题点时,可以以该回溯点为起点,采用单步或多步向后调试的方式来定位问题点,所述步骤S31中,若所述目标数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,与所述目标数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息均一致,则执行:
[0052] 步骤S33、控制所述数据库键值从所述目标数据库键值开始按照预设的键值步长向后跳转,获取每一跳转的数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,并与每一数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息进行对比,若一致,则判断当前数据库键值对应程序运行点为目标问题点。
[0053] 其中,多数预设的键值步长可以为单步也可以为多步,即在数据库中逐条遍历记录调试,或者间隔读取记录调试。
[0054] 在一些情况下,待调试的软件程序运行过程中可能不止一个目标问题点,或者有需要向前回溯的需求,此种情况下,可以确定一个回溯点,然后往前回溯去确定目标问题点,作为一种实施例,所述步骤S3还可包括:
[0055] 步骤S34、控制所述数据库键值从所述目标数据库键值开始按照预设的键值步长向前跳转,获取每一跳转的数据库键值对应的关键寄存器状态、内存访问状态和CPU事件信息,并与每一数据库键值对应的预设关键寄存器状态、预设内存访问状态和预设CPU事件信息进行对比,若一致,则判断当前数据库键值对应程序运行点为目标问题点。
[0056] 其中,多数预设的键值步长可以为单步也可以为多步,即在数据库中逐条遍历记录调试,或者间隔读取记录调试。
[0057] 本发明实施例能够实现在单次运行待调试的软件程序过程中同时实现正向调试和回溯调试的功能,且能提供用户在回溯调试完成后能够继续运行待调试的软件程序。本发明实施例极大节约了软件调试迭代时间,提高了软件调试的效率和性能。
[0058] 需要说明的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各步骤描述成顺序的处理,但是其中的许多步骤可以被并行地、并发地或者同时实施。此外,各步骤的顺序可以被重新安排。当其操作完成时处理可以被终止,但是还可以具有未包括在附图中的附加步骤。处理可以对应于方法、函数、规程、子例程、子程序等等。
[0059] 本发明实施例还提供一种电子设备,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被设置为用于执行本发明实施例所述的方法。
[0060] 本发明实施例还提供一种计算机可读存储介质,所述计算机指令用于执行本发明实施例所述的方法。
[0061] 以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

当前第1页 第1页 第2页 第3页