一种软件调试方法、系统、电子设备及存储介质与流程

文档序号:34899872发布日期:2023-07-26 09:03阅读:66来源:国知局
一种软件调试方法、系统、电子设备及存储介质与流程

本发明属于软件调试领域,更具体地,涉及一种软件调试方法、系统、电子设备及存储介质。


背景技术:

1、软件行为的不可知与不可控是软件调试困难的主要原因。软件的执行流程和行为变化决定于其上下文环境信息,上下文环境是指当前任务(通常为函数或方法)作用域范围内可见的数据资源集合,包括全局变量、局部变量、参数变量、值等,上下文环境既是任务运行的驱动力也是任务运行的结果表征;任务通过调用链次序执行时,关联的上下文环境之间存在着数据依赖和传递,驱动着软件系统的内部状态持续发生变化,直至趋近目标状态。

2、软件的运行可看作是对软件状态的一系列转换,软件状态由程序点作用域内可见的变量及变量在该点的值组成,当软件系统接收到外部的消息数据后,经过一系列的状态变化输出最终结果,当结果不符合预期时,需要收集软件系统中间状态的变化情况以进行根因分析。软件系统作为一个庞大的状态机,不可能穷尽其全部的内部状态,通常只需筛选出与消息数据相关的中间状态数据。现阶段获取中间状态数据常用的技术手段主要包括日志打印、动态跟踪等。

3、日志打印人工筛选执行路径,在关注的数据资源访问前后添加打印语句输出至屏幕或文件。动态跟踪依托操作系统内核的中断机制,采用gdb等调试工具,利用断点、单步执行等特性令程序暂停执行之后,观察寄存器、堆栈中的数据资源。

4、实践证明,这几种技术都各有其局限性。日志打印需要修改代码、编译链接、上传替换、系统重启等一系列流程,过程繁琐且需要改动源代码,不利于版本控制。动态跟踪只能获取当前或近邻的上下文环境,难以勾勒程序在整个业务流中的状态切换和时空变化情况,且由于中断了当前线程而干扰了多线程程序的正常执行顺序。

5、为了应对日益增大的软件规模、日趋复杂的分布式架构、24x7不间断运行的应用场景,需要研究更为便捷高效、纵览全局的软件调试方法,用以收集和评估软件系统在指定条件下的内部状态变化情况。


技术实现思路

1、针对现有技术的缺陷,本发明的目的在于提供一种软件调试方法、系统、电子设备及存储介质,旨在解决现有软件调试方法过程繁琐、信息收集不够全面且需要改动源代码或中断程序执行,不利于版本控制和对线程程序有影响的问题。

2、为实现上述目的,第一方面,本发明提供了一种软件调试方法,包括以下步骤:

3、采用llvm编译器框架的clang前端编译器,将软件的源代码编译生成ir格式的中间表示代码;

4、对中间表示代码中所有函数的上下文环境进行分析,梳理出函数内部、函数之间变量的相互依赖关系,生成变量血缘关系图;所述变量血缘关系图为有向的属性图,节点有三种类型:变量、值及表达式,边有六种类型:读变量、写变量、值定义、值使用、函数调用输入及函数调用输出;

5、针对软件的业务流程,以其输入数据为起点,输出数据为终点,基于图可达性算法在变量血缘关系图中分析得到所述业务流程内部状态的传播路径,并将传播路径中的每一条边作为一条记录项,记录项的集合构成所述业务流程的全链路状态追溯表;

6、对所述全链路状态追溯表中的每一条记录项,自动生成采集记录项数据的ir代码块,在软件源代码编译链接的优化阶段,将所述ir代码块插桩到软件ir代码中的指定位置,以便在软件运行所述业务流程时,利用插桩ir代码块记录所述业务流程的中间状态数据,对所述软件进行调试,精确定位故障根源。

7、在一个可选的示例中,所述函数的上下文环境指当前运行函数的作用域范围内可见的数据资源,包括:全局变量、局部变量、参数变量及值。

8、在一个可选的示例中,所述将传播路径中的每一条边作为一条记录项,具体为:每一条记录项的内容为边以及边关联的两个节点的属性集合。

9、在一个可选的示例中,不同类型的边采用不同的记录项描述方式,其中:读变量边和写变量边均采用七元组的方式进行描述;值定义边和值使用边均采用六元组的方式进行描述;函数调用输入边采用十元组的方式进行描述;函数调用输出边采用九元组的方式进行描述;

10、所述七元组包括:文件名称,函数名称,变量名称,值名称,类型,ir代码及源代码;

11、所述六元组包括:文件名称,函数名称,表达式ir代码,表达式源代码,值名称及类型;

12、所述十元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用ir代码,函数调用源代码,形参值名称,实参值名称,类型及参数序号;

13、所述九元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用ir代码,函数调用源代码,被调函数返回值名称,主调函数返回值名称及类型。

14、第二方面,本发明提供了一种软件调试系统,包括:

15、中间表示代码生成单元,用于采用llvm编译器框架的clang前端编译器,将软件的源代码编译生成ir格式的中间表示代码;

16、变量血缘关系图生成单元,用于对中间表示代码中所有函数的上下文环境进行分析,梳理出函数内部、函数之间变量的相互依赖关系,生成变量血缘关系图;所述变量血缘关系图为有向的属性图,节点有三种类型:变量、值及表达式,边有六种类型:读变量、写变量、值定义、值使用、函数调用输入及函数调用输出;

17、全链路状态追溯表构建单元,用于针对软件的业务流程,以其输入数据为起点,输出数据为终点,基于图可达性算法在变量血缘关系图中分析得到所述业务流程内部状态的传播路径,并将传播路径中的每一条边作为一条记录项,记录项的集合构成所述业务流程的全链路状态追溯表;

18、代码插桩单元,用于对所述全链路状态追溯表中的每一条记录项,自动生成采集记录项数据的ir代码块,在软件源代码编译链接的优化阶段,将所述ir代码块插桩到软件ir代码中的指定位置,以便在软件运行所述业务流程时,利用插桩ir代码块记录所述业务流程的中间状态数据,对所述软件进行调试,精确定位故障根源。

19、在一个可选的示例中,所述变量血缘关系图生成单元分析的函数上下文环境指当前运行函数的作用域范围内可见的数据资源,包括:全局变量、局部变量、参数变量及值。

20、在一个可选的示例中,所述全链路状态追溯表构建单元将传播路径中的每一条边作为一条记录项,具体为:每一条记录项的内容为边以及边关联的两个节点的属性集合。

21、在一个可选的示例中,所述变量血缘关系图中不同类型的边采用不同的记录项描述方式,其中:读变量边和写变量边均采用七元组的方式进行描述;值定义边和值使用边均采用六元组的方式进行描述;函数调用输入边采用十元组的方式进行描述;函数调用输出边采用九元组的方式进行描述;

22、所述七元组包括:文件名称,函数名称,变量名称,值名称,类型,ir代码及源代码;

23、所述六元组包括:文件名称,函数名称,表达式ir代码,表达式源代码,值名称及类型;

24、所述十元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用ir代码,函数调用源代码,形参值名称,实参值名称,类型及参数序号;

25、所述九元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用ir代码,函数调用源代码,被调函数返回值名称,主调函数返回值名称及类型。

26、第三方面,本发明提供了一种电子设备,包括:存储器和处理器;

27、所述存储器,用于存储计算机程序;

28、所述处理器,用于当执行所述计算机程序时,实现如上述第一方面提供的方法。

29、第四方面,本发明提供了一种计算机可读存储介质,所述存储介质上存储有计算机程序,当所述计算机程序被处理器执行时,实现如上述第一方面提供的方法。

30、总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:

31、本发明提供一种软件调试方法、系统、电子设备及存储介质,通过对软件代码进行静态分析生成变量血缘关系图,揭示了变量之间的相互依赖和影响关系,全面展现了软件内部的数据流,提升了开发运维人员对软件系统的理解性和洞察力;

32、本发明提供一种软件调试方法、系统、电子设备及存储介质,针对待调试的业务流程,基于变量血缘关系图,自动梳理出输入数据经过哪些关键路径和转换最终生成输出数据,这些路径上施加影响和受到影响的变量数据、值数据有哪些,并将梳理出的信息汇聚为全链路状态追溯表,提升了调试信息采集的有效性、准确性、全面性,降低了人工代码走查的繁重工作量和不完备性;

33、本发明提供一种软件调试方法、系统、电子设备及存储介质,通过对形式化的全链路状态追溯表进行解析并自动生成调试数据采集代码,避免了人工编写调试代码的繁琐和重复;

34、本发明提供一种软件调试方法、系统、电子设备及存储介质,在源代码编译链接的优化阶段将调试数据采集代码插桩入目标文件,对源代码无侵入,避免了对代码视图的改动。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1