首页> 中国专利> 一种问题追踪的方法、系统、电子设备及存储介质

一种问题追踪的方法、系统、电子设备及存储介质

摘要

本申请公开了一种问题追踪的方法、系统、电子设备及存储介质。所述方法包括:遍历软件中所有函数以及所有类;记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,记作调用树,并记录树状结构中每个节点的输入参数以及输出参数;将树状结构中每个节点的输入参数传递给所述的所有函数以及所有类,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪。所述系统包括:遍历模块、调用树模块以及运行模块。本申请加快了初步定位问题的步骤,并使得单个函数之内问题的追踪复现变得简单易行,解决了相关技术中当处理流程很长时很难进行问题追踪的难题。

著录项

  • 公开/公告号CN112506780A

    专利类型发明专利

  • 公开/公告日2021-03-16

    原文格式PDF

  • 申请/专利号CN202011435462.8

  • 发明设计人 刘辉;

    申请日2020-12-10

  • 分类号G06F11/36(20060101);

  • 代理机构11541 北京知果之信知识产权代理有限公司;

  • 代理人卜荣丽

  • 地址 100089 北京市海淀区海淀大街8号A座11层B区

  • 入库时间 2023-06-19 10:16:30

说明书

技术领域

本申请涉及检测技术领域,具体而言,涉及一种问题追踪的方法、系统、电子设备及存储介质。

背景技术

目前,python语言比较流行的编程语言。在处理深层嵌套数据结构的场景python也有应用,然而其排错和调试不可避免,却也更加不易。比如处理上百万份病历的场景:每一份病历包含的信息繁多,都是相对复杂的,常常用多层嵌套的结构表示,而病历的处理结果、中间过程,也都是复杂的结构。假如发现最终的结果异常,处理流程很长,很难定位问题的根源在哪一步骤。

在python标准库中有trace工具以及第三方开源的pysnooper工具,用于问题追踪,然而,Trace工具的缺点在于,虽然记录了程序的跳转、但是没有记录变量的值以及数据,这对于debug来说是不够用的,因为调试和排查问题时最关键的是查看数据和变量的值,检查某个中间变量是否不符合预期,或者某个数据是否已经发生错误,Trace工具不能提供帮助。第三方工具pysnooper和标准的trace工具不同,着重点在于记录单个函数内部的变量、数据的变化细节,而不是调用情况。其典型的使用方法为:用装饰器装饰某个目标函数,把它指定为要追踪的函数。运行软件之后,会打印出该函数之中各变量的详细变化,对于调试单个函数非常有用,然而其局限在于只关注单独的一个或者几个函数,而不是打印所有的行跳转。

针对相关技术中当处理流程很长时很难进行问题追踪的问题,目前尚未提出有效的解决方案。

发明内容

本申请的主要目的在于提供一种问题追踪的方法、系统、电子设备及存储介质,以解决相关技术中当处理流程很长时很难进行问题追踪的问题。

为了实现上述目的,第一方面,本申请提供了一种问题追踪的方法,步骤如下:

遍历软件中所有函数以及所有类;

记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,记作调用树,并记录树状结构中每个节点的输入参数以及输出参数;

重新将树状结构中每个节点的输入参数传递给所述的所有函数以及所有类,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪。

所述记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,并记录树状结构中每个节点的输入参数以及输出参数,步骤如下:

记录当前函数或当前类,作为树状结构的父节点,并记录所述当前函数或当前类的函数名或类名;

当调用所述当前函数或当前类的子函数或子类时,新建所述树状结构的子函数或子类,所述子函数或子类记作子节点;

记录所述子函数或子类的函数名或类名,并将所述子函数或子类作为树状结构的当前节点;

记录当前节点的输入参数以及输出参数。

所述重新将树状结构中每个节点的输入参数传递给所述的所有函数以及所有类,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪,步骤如下:

重新将当前节点输入参数传递给当前节点,即传递给当前子函数或子类;

重新运行当前子函数或子类,记录返回值或异常;

将当前节点设置为新的父节点,并继续遍历所述新的父节点的子函数或子类;

直到完成所有函数以及所有类,即完成对树状结构中每个节点的问题追踪。

所述记录当前节点的输入参数以及输出参数采用pysnooper工具记录输入参数以及输出参数。

所述输入参数以及输出参数被记录在调用树上。

所述重新运行当前子函数或子类时,若软件中有数据被更改,则在重新运行之前,需要开启deepcopy机制。

所述树状结构中每个节点采用pickle序列化,保存在磁盘上。

第二方面,本申请还提供了一种问题追踪的系统,采用所述的问题追踪的方法实现,包括:遍历模块、调用树模块以及运行模块;

所述遍历模块、调用书模块以及运行模块依次顺序相连接;

所述遍历模块,用于遍历软件中所有函数以及所有类;

所述调用树模块,用于记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,称为调用树,并记录树状结构中每个节点的输入参数以及输出参数;

所述运行模块,用于重新将树状结构中每个节点的输入参数传递给所述的所有函数以及所有,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪。

一种电子设备,所述电子设备包括存储器以及处理器,所述存储器用于存储计算机程序,所述处理器运行所述计算机程序以使计算机设备执行所述的问题追踪的方法。

一种可读存储介质,所述可读存储介质中存储有计算机程序指令,所述计算机程序指令被一处理器读取并运行时,执行所述的问题追踪的方法。

有益技术效果:

本申请提出了一种问题追踪的方法、系统、电子设备及存储介质,加快了初步定位问题的步骤,并使得单个函数之内问题的追踪复现变得简单易行,解决了相关技术中当处理流程很长时很难进行问题追踪的难题。

附图说明

构成本申请的一部分的附图用来提供对本申请的进一步理解,使得本申请的其它特征、目的和优点变得更明显。本申请的示意性实施例附图及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例提供的一种问题追踪的方法流程图;

图2是根据本申请实施例提供的形成树状结构流程图;

图3是根据本申请实施例提供的重新运行跟踪其运行过程流程图;

图4是根据本申请实施例提供的一种问题追踪的系统原理框图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

在本申请中,术语“上”、“下”、“左”、“右”、“前”、“后”、“顶”、“底”、“内”、“外”、“中”、“竖直”、“水平”、“横向”、“纵向”等指示的方位或位置关系为基于附图所示的方位或位置关系。这些术语主要是为了更好地描述本申请及其实施例,并非用于限定所指示的装置、元件或组成部分必须具有特定方位,或以特定方位进行构造和操作。

并且,上述部分术语除了可以用于表示方位或位置关系以外,还可能用于表示其他含义,例如术语“上”在某些情况下也可能用于表示某种依附关系或连接关系。对于本领域普通技术人员而言,可以根据具体情况理解这些术语在本申请中的具体含义。

另外,术语“多个”的含义应为两个以及两个以上。

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

第一方面,本申请提供了一种问题追踪的方法,如图1所示,步骤如下:

步骤S1:遍历软件中所有函数以及所有类;

步骤S2:记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,记作调用树,并记录树状结构中每个节点的输入参数以及输出参数;

步骤S3:将树状结构中每个节点的输入参数传递给所述的所有函数以及所有类,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪。

记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,并记录树状结构中每个节点的输入参数以及输出参数,如图2所示,步骤如下:

步骤S21:记录当前函数或当前类,作为树状结构的父节点,并记录所述当前函数或当前类的函数名或类名;

步骤S22:当调用所述当前函数或当前类的子函数或子类时,新建所述树状结构的子函数或子类,所述子函数或子类记作子节点;

步骤S23:记录所述子函数或子类的函数名或类名,并将所述子函数或子类作为树状结构的当前节点;

步骤S24:记录当前节点的输入参数以及输出参数。

所述重新将树状结构中每个节点的输入参数传递给所述的所有函数以及所有类,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪,如图3所示,步骤如下:

步骤S31:重新将当前节点输入参数传递给当前节点,即传递给当前子函数或子类;

步骤S32:重新运行当前子函数或子类,记录返回值或异常;

步骤S33:将当前节点设置为新的父节点,并继续遍历所述新的父节点的子函数或子类;

步骤S34:直到完成所有函数以及所有类,即完成对树状结构中每个节点的问题追踪。

所述记录当前节点的输入参数以及输出参数采用pysnooper工具进行输入参数以及输出参数的记录。

所述输入参数以及输出参数被记录在调用树上。

所述重新运行当前子函数或子类时,若软件中有数据被更改,则在重新运行之前,需要开启deepcopy机制。

对修改状态的函数及其考量:

本申请提供一个机制,参数、返回值记录在调用树上时,将其deepcopy一份。这样做的目的,是应对带有状态的函数。Python当中的dict、list等数据结构,默认都是mutable(可改变的),也就是说,在记录在调用树之后,到程序运行完毕检查调用树之前,那些数据被软件的其它部分所更改,探查的时候已经不是运行时的原貌了。将数据深度复制一份可以避免这个问题,软件就算修改,一般情况下不会修改到复制过的部分。

但这个功能也有缺陷,会使依赖内存地址的逻辑失效。对象复制一份之后,代表同一个内容的数据在内存中会有两份。若软件逻辑依赖其对象在内存中的地址,在探查时,对象的地址发生了变化。典型的依赖地址的操作,有python中的is操作符,id函数。所以是否打开这个选项,需要调试人员结合软件的具体情况来确定。也就是,如果数据有可能被更改,可以考虑打开deepcopy机制,但要考虑到地址变化带来的影响。

所述树状结构中每个节点采用pickle序列化,保存在磁盘上。

内存占用及其考量:

将参数及其返回值全都记录在调用树上,带来的其中一个问题是,内存的占用会极大地增加。本身应该被垃圾回收掉的对象,现在在调用树上仍然有引用,不会被垃圾回收,不会释放内存。deepcopy模式下内存的压力更大,复制的对象本身占用更多的内存。

所以pytrace提供序列化对象的机制,允许将调用树的节点用pickle序列化,保存在磁盘上。探查调用树时从磁盘上恢复。这样内存不再会受影响。

这样做也有局限,需要调试人员关心。Pickle本身序列化是有条件的,不能被序列化的部分则不能用此机制。需要结合具体情况决定是否打开此机制。

然而大部分情况是,一般的调试是对单独一份数据的调试,虽然嵌套层数多,内容繁复,但是开发机的内存是绰绰有余的。将调用树及其中间数据全部保存下来,和开一个大软件相差无几。

本申请实施例,说明如下:

1.有关调用树的说明:

用一棵树来记录程序运行的情况,称之为调用树。

可以让程序运行中的调用细节一览无余(除局部变量外)。

函数的每一次调用(方法也算函数)都对应一个树节点。

某节点s的父节点p,代表p的函数在执行期间调用到了s的函数。

某节点的子节点间存在顺序,代表执行顺序。如,p有三个子节点依次为s0,s1,s2,表示p的函数执行期间先后调用了s0的函数,s1的函数,s2的函数

节点上有调用的具体信息,输入(即参数),输出(即返回值或异常)。

2.生成调用树的过程:

程序启动时,尚未调用任何业务逻辑函数时,初始化一个特殊根节点,它不对应任何函数,也没有输入输出。并把根当作“当前节点”。

调用某函数之前,新建节点、记录输入、追加在“当前节点”之后、把该节点作为新的“当前节点”

调用某函数之后,记录输出(返回值或异常)、把“当前节点”的父节点作为新的“当前节点”

用这种方式即可生成整个调用树。

第二方面,本申请还提供了一种问题追踪的系统,采用所述的问题追踪的方法实现,如图4所示,包括:遍历模块、调用树模块以及运行模块;

所述遍历模块、调用书模块以及运行模块依次顺序相连接;

所述遍历模块,用于遍历软件中所有函数以及所有类;

所述调用树模块,用于记录所述的所有函数以及所有类间的调用关系,形成一个树状结构,称为调用树,并记录树状结构中每个节点的输入参数以及输出参数;

所述运行模块,用于重新将树状结构中每个节点的输入参数传递给所述的所有函数以及所有,重新运行一次,跟踪其运行过程,完成对树状结构中每个节点的问题追踪。

一种电子设备,所述电子设备包括存储器以及处理器,所述存储器用于存储计算机程序,所述处理器运行所述计算机程序以使计算机设备执行所述的问题追踪的方法。

一种可读存储介质,所述可读存储介质中存储有计算机程序指令,所述计算机程序指令被一处理器读取并运行时,执行所述的问题追踪的方法。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号