一种软件调试方法、系统、电子设备及存储介质技术方案

技术编号:38274473 阅读:11 留言:0更新日期:2023-07-27 10:27
本发明专利技术提供一种软件调试方法、系统、电子设备及存储介质,该方法对软件系统源代码进行前端编译生成中间表示代码,基于中间表示代码对各个函数的上下文环境信息进行静态分析,得到系统范围内的变量血缘关系图;当需要对业务流程从输入到输出的中间状态进行跟踪时,基于变量血缘关系图分析得出输入的消息数据在软件系统中的传播路径、值的变化情况、与其它数据之间的相互依赖和影响关系等信息,生成记录该消息数据传播轨迹的全链路状态追溯表;对于全链路状态追溯表中的记录项,通过插桩自动生成收集该记录项数据的中间代码并在编译链接期插桩入目标文件,软件系统运行时插桩代码被调用执行从而抛出记录项数据用于展现业务流程的全链路运行状态。程的全链路运行状态。程的全链路运行状态。

【技术实现步骤摘要】
一种软件调试方法、系统、电子设备及存储介质


[0001]本专利技术属于软件调试领域,更具体地,涉及一种软件调试方法、系统、电子设备及存储介质。

技术介绍

[0002]软件行为的不可知与不可控是软件调试困难的主要原因。软件的执行流程和行为变化决定于其上下文环境信息,上下文环境是指当前任务(通常为函数或方法)作用域范围内可见的数据资源集合,包括全局变量、局部变量、参数变量、值等,上下文环境既是任务运行的驱动力也是任务运行的结果表征;任务通过调用链次序执行时,关联的上下文环境之间存在着数据依赖和传递,驱动着软件系统的内部状态持续发生变化,直至趋近目标状态。
[0003]软件的运行可看作是对软件状态的一系列转换,软件状态由程序点作用域内可见的变量及变量在该点的值组成,当软件系统接收到外部的消息数据后,经过一系列的状态变化输出最终结果,当结果不符合预期时,需要收集软件系统中间状态的变化情况以进行根因分析。软件系统作为一个庞大的状态机,不可能穷尽其全部的内部状态,通常只需筛选出与消息数据相关的中间状态数据。现阶段获取中间状态数据常用的技术手段主要包括日志打印、动态跟踪等。
[0004]日志打印人工筛选执行路径,在关注的数据资源访问前后添加打印语句输出至屏幕或文件。动态跟踪依托操作系统内核的中断机制,采用GDB等调试工具,利用断点、单步执行等特性令程序暂停执行之后,观察寄存器、堆栈中的数据资源。
[0005]实践证明,这几种技术都各有其局限性。日志打印需要修改代码、编译链接、上传替换、系统重启等一系列流程,过程繁琐且需要改动源代码,不利于版本控制。动态跟踪只能获取当前或近邻的上下文环境,难以勾勒程序在整个业务流中的状态切换和时空变化情况,且由于中断了当前线程而干扰了多线程程序的正常执行顺序。
[0006]为了应对日益增大的软件规模、日趋复杂的分布式架构、24X7不间断运行的应用场景,需要研究更为便捷高效、纵览全局的软件调试方法,用以收集和评估软件系统在指定条件下的内部状态变化情况。

技术实现思路

[0007]针对现有技术的缺陷,本专利技术的目的在于提供一种软件调试方法、系统、电子设备及存储介质,旨在解决现有软件调试方法过程繁琐、信息收集不够全面且需要改动源代码或中断程序执行,不利于版本控制和对线程程序有影响的问题。
[0008]为实现上述目的,第一方面,本专利技术提供了一种软件调试方法,包括以下步骤:
[0009]采用LLVM编译器框架的clang前端编译器,将软件的源代码编译生成IR格式的中间表示代码;
[0010]对中间表示代码中所有函数的上下文环境进行分析,梳理出函数内部、函数之间变量的相互依赖关系,生成变量血缘关系图;所述变量血缘关系图为有向的属性图,节点有
三种类型:变量、值及表达式,边有六种类型:读变量、写变量、值定义、值使用、函数调用输入及函数调用输出;
[0011]针对软件的业务流程,以其输入数据为起点,输出数据为终点,基于图可达性算法在变量血缘关系图中分析得到所述业务流程内部状态的传播路径,并将传播路径中的每一条边作为一条记录项,记录项的集合构成所述业务流程的全链路状态追溯表;
[0012]对所述全链路状态追溯表中的每一条记录项,自动生成采集记录项数据的IR代码块,在软件源代码编译链接的优化阶段,将所述IR代码块插桩到软件IR代码中的指定位置,以便在软件运行所述业务流程时,利用插桩IR代码块记录所述业务流程的中间状态数据,对所述软件进行调试,精确定位故障根源。
[0013]在一个可选的示例中,所述函数的上下文环境指当前运行函数的作用域范围内可见的数据资源,包括:全局变量、局部变量、参数变量及值。
[0014]在一个可选的示例中,所述将传播路径中的每一条边作为一条记录项,具体为:每一条记录项的内容为边以及边关联的两个节点的属性集合。
[0015]在一个可选的示例中,不同类型的边采用不同的记录项描述方式,其中:读变量边和写变量边均采用七元组的方式进行描述;值定义边和值使用边均采用六元组的方式进行描述;函数调用输入边采用十元组的方式进行描述;函数调用输出边采用九元组的方式进行描述;
[0016]所述七元组包括:文件名称,函数名称,变量名称,值名称,类型,IR代码及源代码;
[0017]所述六元组包括:文件名称,函数名称,表达式IR代码,表达式源代码,值名称及类型;
[0018]所述十元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用IR代码,函数调用源代码,形参值名称,实参值名称,类型及参数序号;
[0019]所述九元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用IR代码,函数调用源代码,被调函数返回值名称,主调函数返回值名称及类型。
[0020]第二方面,本专利技术提供了一种软件调试系统,包括:
[0021]中间表示代码生成单元,用于采用LLVM编译器框架的clang前端编译器,将软件的源代码编译生成IR格式的中间表示代码;
[0022]变量血缘关系图生成单元,用于对中间表示代码中所有函数的上下文环境进行分析,梳理出函数内部、函数之间变量的相互依赖关系,生成变量血缘关系图;所述变量血缘关系图为有向的属性图,节点有三种类型:变量、值及表达式,边有六种类型:读变量、写变量、值定义、值使用、函数调用输入及函数调用输出;
[0023]全链路状态追溯表构建单元,用于针对软件的业务流程,以其输入数据为起点,输出数据为终点,基于图可达性算法在变量血缘关系图中分析得到所述业务流程内部状态的传播路径,并将传播路径中的每一条边作为一条记录项,记录项的集合构成所述业务流程的全链路状态追溯表;
[0024]代码插桩单元,用于对所述全链路状态追溯表中的每一条记录项,自动生成采集记录项数据的IR代码块,在软件源代码编译链接的优化阶段,将所述IR代码块插桩到软件IR代码中的指定位置,以便在软件运行所述业务流程时,利用插桩IR代码块记录所述业务流程的中间状态数据,对所述软件进行调试,精确定位故障根源。
[0025]在一个可选的示例中,所述变量血缘关系图生成单元分析的函数上下文环境指当前运行函数的作用域范围内可见的数据资源,包括:全局变量、局部变量、参数变量及值。
[0026]在一个可选的示例中,所述全链路状态追溯表构建单元将传播路径中的每一条边作为一条记录项,具体为:每一条记录项的内容为边以及边关联的两个节点的属性集合。
[0027]在一个可选的示例中,所述变量血缘关系图中不同类型的边采用不同的记录项描述方式,其中:读变量边和写变量边均采用七元组的方式进行描述;值定义边和值使用边均采用六元组的方式进行描述;函数调用输入边采用十元组的方式进行描述;函数调用输出边采用九元组的方式进行描述;
[0028]所述七元组包括:文件名称,函数名称,变量名称,值名称,类型,IR代码及源代码;
[0029]所述六元组包括:文件名称,函数名称,表本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种软件调试方法,其特征在于,包括以下步骤:采用LLVM编译器框架的clang前端编译器,将软件的源代码编译生成IR格式的中间表示代码;对中间表示代码中所有函数的上下文环境进行分析,梳理出函数内部、函数之间变量的相互依赖关系,生成变量血缘关系图;所述变量血缘关系图为有向的属性图,节点有三种类型:变量、值及表达式,边有六种类型:读变量、写变量、值定义、值使用、函数调用输入及函数调用输出;针对软件的业务流程,以其输入数据为起点,输出数据为终点,基于图可达性算法在变量血缘关系图中分析得到所述业务流程内部状态的传播路径,并将传播路径中的每一条边作为一条记录项,记录项的集合构成所述业务流程的全链路状态追溯表;对所述全链路状态追溯表中的每一条记录项,自动生成采集记录项数据的IR代码块,在软件源代码编译链接的优化阶段,将所述IR代码块插桩到软件IR代码中的指定位置,以便在软件运行所述业务流程时,利用插桩IR代码块记录所述业务流程的中间状态数据,对所述软件进行调试,精确定位故障根源。2.根据权利要求1所述的方法,其特征在于,所述函数的上下文环境指当前运行函数的作用域范围内可见的数据资源,包括:全局变量、局部变量、参数变量及值。3.根据权利要求1所述的方法,其特征在于,所述将传播路径中的每一条边作为一条记录项,具体为:每一条记录项的内容为边以及边关联的两个节点的属性集合。4.根据权利要求1或3所述的方法,其特征在于,不同类型的边采用不同的记录项描述方式,其中:读变量边和写变量边均采用七元组的方式进行描述;值定义边和值使用边均采用六元组的方式进行描述;函数调用输入边采用十元组的方式进行描述;函数调用输出边采用九元组的方式进行描述;所述七元组包括:文件名称,函数名称,变量名称,值名称,类型,IR代码及源代码;所述六元组包括:文件名称,函数名称,表达式IR代码,表达式源代码,值名称及类型;所述十元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用IR代码,函数调用源代码,形参值名称,实参值名称,类型及参数序号;所述九元组包括:源文件名称,源函数名称,目的文件名称,目的函数名称,函数调用IR代码,函数调用源代码,被调函数返回值名称,主调函数返回值名称及类型。5.一种软件调试系统,其特征在于,包括:中间表示代码生成单元,用于采用LLVM编译器框架的clang前端编译器,将软件的源代码编译生成IR格式的中间表示代码;变量血缘关系图生成单元,用于对中间表示代码中所有函数的上下文环境进行分析,梳理出函数内部、函数之间变量的相互依赖关系,...

【专利技术属性】
技术研发人员:秦亮钱辉张文昌
申请(专利权)人:中国船舶集团有限公司第七〇九研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1