CN115981711B - 一种代码处理方法及电子设备 - Google Patents
一种代码处理方法及电子设备 Download PDFInfo
- Publication number
- CN115981711B CN115981711B CN202310265361.8A CN202310265361A CN115981711B CN 115981711 B CN115981711 B CN 115981711B CN 202310265361 A CN202310265361 A CN 202310265361A CN 115981711 B CN115981711 B CN 115981711B
- Authority
- CN
- China
- Prior art keywords
- node
- code
- type
- source code
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请实施例提供一种代码处理方法及电子设备,涉及电子技术领域,代码处理方法包括:电子设备根据源代码文件对应的抽象语法树,构建源代码文件对应的初始有向图。之后,电子设备显示源代码文件对应的初始有向图。并且电子设备根据源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点。其中,运行日志用于记录源代码文件对应的执行状态信息。电子设备显示目标有向图;目标有向图上的第一类节点和第二类节点以不同方式区分显示,第二类节点用于定位异常代码,第二类节点为初始有向图的目标节点中除第一类节点以外的节点。无需人工凭借记忆对源代码文件进行异常代码定位,提高了定位异常代码的准确性和速度。
Description
技术领域
本申请实施例涉及电子技术领域,尤其涉及一种代码处理方法及电子设备。
背景技术
随着计算机技术的飞速发展,诸如笔记本电脑以及台式电脑等电子设备日益普及,各种依赖于电子设备运行的操作系统也应运而生。随着用户越来越依赖电子设备,对操作系统提供功能的要求也越来越高。伴随着操作系统功能的提高与加强,操作系统的数据如代码的复杂程度也随之增加。这样,在代码开发的过程中会出现编写的代码发生异常的情况。如果代码出现异常状态,需要查找和修复异常代码。
通常,在查找发生异常代码的过程中,需要获取操作系统在运行中的运行日志,并需要人工对运行日志进行分析,以在运行日志中定位发生异常的代码。然而,利用人工对运行日志进行分析的过程中,需要记忆大量的代码信息,且需要基于记忆的代码信息进行关键字过滤,从而定位发生异常的代码。进而,导致定位异常数据的效率低以及精准度低。
发明内容
本申请实施例提供一种代码处理方法及电子设备,用于解决在定位异常数据的过程中,需要人工记忆大量的代码信息以及定位异常数据的效率低的问题。
为达到上述目的,本申请的实施例采用如下技术方案:
第一方面,提供了一种代码处理方法,应用于电子设备,方法包括:
电子设备根据源代码文件对应的抽象语法树,构建源代码文件对应的初始有向图。其中,初始有向图包括至少一个目标节点,目标节点根据抽象语法树中语法类型为预设类型的节点确定;有向图用于表征源代码文件中执行步骤对应的执行流程。
之后,电子设备显示源代码文件对应的初始有向图。并且电子设备根据源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点。其中,运行日志用于记录源代码文件对应的执行状态信息。
最后,电子设备显示目标有向图;目标有向图上的第一类节点和第二类节点以不同方式区分显示,第二类节点用于定位异常代码,第二类节点为初始有向图的目标节点中除第一类节点以外的节点。
可见,本申请实施例中提供的电子设备可以根据源代码文件对应的抽象语法树,构建并显示源代码文件对应的初始有向图。其中,初始有向图中包括基于抽象语法树中节点筛选的至少一个目标节点。有向图用于表征源代码文件中执行步骤对应的执行流程。以使得用户可以直接通过电子设备感知到源代码文件中执行步骤对应的执行流程。
并且,电子设备可以基于源代码文件对应的运行日志,确定第一类节点。第一类节点用于表征源代码文件对应的已执行代码。之后,电子设备可以显示目标有向图,目标有向图上的第一类节点和第二类节点以不同方式区分显示。
由于第一类节点用于表征已执行代码,因此可以通过第二类节点来定位异常代码。在用户的角度,通过目标有向图中对第一类节点和第二类节点的区分,可以感知哪些节点是已执行代码,哪些节点用来定位异常代码。同时,用户也可以通过初始有向图和目标有向图明确源代码文件对应的执行流程以及执行步骤,还可以查看某个执行流程下的一个或多个子流程。无需人工凭借记忆阅读并定位源代码文件中的异常代码,提高定位异常代码的效率以及精准度。进而提高用户的使用体验感。
在第一方面的一种可实现方式中,电子设备在根据源代码文件对应的抽象语法树,构建源代码文件对应的初始有向图的过程,包括:电子设备检测到针对源代码文件的打开操作后,获取源代码文件,生成抽象语法树。
之后,电子设备根据抽象语法树,建立源代码文件对应的代码索引表;其中,代码索引表用于表征源代码文件中每行代码的代码信息,每行代码的代码信息与抽象语法树中的节点对应。
电子设备根据代码索引表,遍历源代码文件,确定至少一个目标节点。并且,基于至少一个目标节点,得到源代码文件对应的初始有向图。
其中,电子设备在根据代码索引表,遍历源代码文件,确定至少一个目标节点的过程中,包括:
电子设备根据代码索引表,查找源代码文件对应的第一类代码,第一类代码包括源代码文件中语法类型为方法申明类型的至少一个代码行;
之后,电子设备根据代码索引表,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句;预设类型包括日志打印类型和分支判断类型;
电子设备根据至少一个子语句,确定至少一个目标节点。
可见,本申请实施例中提供的电子设备可以根据源代码文件对应的语法信息,建立源代码文件对应的代码索引表。接着,电子设备根据代码索引表,查找源代码文件对应的第一类代码。之后,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句;预设类型包括日志打印类型和分支判断类型;最后,电子设备根据至少一个子语句,确定至少一个目标节点。并且基于至少一个目标节点,得到源代码文件对应的初始有向图。
也就是说,本申请可以基于源代码文件对应的语法信息,确定代码索引表即源代码文件中每行代码的代码信息。根据代码索引表,遍历语法类型为方法申明类型的第一类代码中的全部子语句,得到语法类型为日志打印类型和分支判断类型对应的子语句。最后,根据子语句,确定至少一个目标节点,以得到源代码文件对应的初始有向图。
在源代码文件用于表征的业务流程中,当子语句的语法类型为日志打印时,该子语句可以表征业务流程中某个执行步骤的执行状态。当子语句的语法类型为分支判断时,该子语句可以表征业务流程中某个具体流程的条件判断步骤以及满足给的条件的步骤。这样,通过根据子语句,确定至少一个目标节点,以及根据目标节点得到初始有向图。能够将具体的代码信息进行可视化的表征。能清晰地查看某个具体流程的步骤以及具体流程中包括的分支步骤,无需人工进行遍历,提高了定位过程的定位效率和定位精度,提高用户的使用体验。
在第一方面的一种可实现方式中,代码索引表包括源代码文件中每行代码对应的语法类型和代码行信息;电子设备在根据代码索引表,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句的过程中,包括:
电子设备根据代码索引表,获取第一类代码中的第一代码,第一代码为第一类代码的首个代码行。
之后,电子设备基于代码索引表中每行代码对应的语法类型,依次遍历第一代码对应的至少一个一级语句,得到语法类型为预设类型的至少一个子语句;一级语句为第一代码对应的下一级子语句。
电子设备在根据至少一个子语句,确定至少一个目标节点的过程中,包括:
电子设备若确定一级语句的语法类型是日志打印类型,则基于一级语句对应的代码行信息,建立一级语句对应的第一主体节点;
电子设备若确定一级语句的语法类型是分支判断类型,则基于一级语句对应的代码行信息,建立一级语句对应的第二主体节点和第二主体节点对应的至少一个正分支节点;正分支节点用于表征满足一级语句给定的条件对应的执行步骤。之后,最后,电子设备根据第一主体节点,和/或,第二主体节点和正分支节点,确定目标节点。
并且,电子设备建立一级语句对应的第一主体节点的过程中,还包括:
电子设备在建立一级语句对应的第一主体节点之后,将有向数据结构的当前尾节点的节点路径指向第一主体节点,以建立完成第一主体节点;其中,尾节点为有向数据结构中已建立完成的节点路径中未指向其他节点的节点,尾节点初始为开始节点。
电子设备在建立一级语句对应的第二主体节点和第二主体节点对应的正分支节点之后,将尾节点的节点路径指向第二主体节点,以及将第二主体节点的节点路径指向正分支节点。
可见,本申请实施例中提供的电子设备可以根据代码索引表,获取第一类代码中的第一代码,第一代码为语法类型为方法申明类型的第一类代码中首个代码行。并且,依次遍历第一代码对应的至少一个一级语句,得到语法类型为预设类型的至少一个子语句。当一级语句的语法类型是日志打印类型,则基于一级语句对应的代码行信息,建立第一主体节点。并在建立第一主体节点之后,对第一主体节点的节点路径进行指向。
当一级语句的语法类型是分支判断类型,则基于一级语句对应的代码行信息,建立第二主体节点和第二主体节点对应的至少一个正分支节点。最后,根据第一主体节点,和/或,第二主体节点和正分支节点,确定目标节点。并在建立第二主体节点和正分支节点之后,对第二主体节点和正分支节点的节点路径进行指向。
也就是说,在源代码文件用于表征的业务流程中,第一主体节点对应的子语句可以表征业务流程中某个执行步骤的执行状态。第二主体节点和正分支节点对应的子语句可以表征业务流程中某个具体流程的条件判断步骤以及满足给的条件的步骤。
这样,通过基于第一主体节点,和/或,第二主体节点和正分支节点,确定目标节点。并且将目标节点的节点路径进行完善。能够将具体的代码信息利用节点的方式进行可视化的表征。同时能清晰地查看某个具体流程的步骤以及具体流程中包括的分支步骤,无需人工对源代码文件中的执行步骤以及之间的逻辑关系进行阅读和分析,提高了定位过程的定位效率和定位精度,提高用户的使用体验。
在第一方面的一种可实现方式中,电子设备在建立一级语句对应的第二主体节点和第二主体节点对应的至少一个正分支节点的过程中,还包括:
电子设备遍历一级语句对应的二级语句;二级语句为一级语句对应的下一级子语句;若遍历完成二级语句,则将尾节点的节点路径回退至第二主体节点。
电子设备若未检测到一级语句对应的负分支节点,则建立一级语句对应的默认节点;其中,负分支节点用于表征未满足一级语句给定的条件对应的执行步骤;以及将尾节点的节点路径指向默认节点。
可见,本申请实施例可以当一级语句的语法类型为分支判断时,先遍历一级语句对应的二级语句,若遍历完成二级语句,则将尾节点的节点路径回退至第二主体节点。之后,若未检测到一级语句对应的负分支节点,则建立一级语句对应的默认节点,以及将尾节点的节点路径指向默认节点。
也就是说,为了便于将整个条件判断过程顺利进行,既需要有满足条件的分支步骤,也需要有未满足条件的分支步骤。由此,电子设备若未检测到归属于一级语句的负分支节点即负向子语句,则建立默认节点。其中,负分支节点用于表征未满足业务流程中给定的条件的分支执行步骤,并将尾节点指向该默认节点。进而,完善源代码文件中具体流程包括分支步骤之间的分支关系,同时还能够便于后续构建完整的初始有向图。以使得用户清晰地查看某个具体流程的中满足条件的分支步骤和未满足条件的分支步骤,提高用户的使用体验。
在第一方面的一种可实现方式中,代码索引表还包括源代码文件中每行代码对应的调用索引信息。
电子设备在基于代码索引表,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句的过程中,还包括:
电子设备若确定一级语句的语法类型是方法调用类型,则获取代码索引表中一级语句对应的调用索引信息。
之后,电子设备根据调用索引信息,遍历第一类代码中的第二代码,得到语法类型为预设类型的至少一个子语句;第二代码为位于第一代码之后的代码行。
可见,电子设备在遍历第一代码对应的一级语句的过程中,若确定一级语句的语法类型为方法调用类型,则继续根据自身的调用索引信息获取第二代码。第二代码的语法类型同样为方法申明类型。
也就是说,在一级语句的语法类型为方法调用类型的场景下,该一级语句用于表征在业务流程中调用的方法,即不能表征业务流程中的执行步骤。进而,一级语句的语法类型为方法调用类型时,继续获取除第一代码之外的其他第二代码,以完成针对第一类代码的遍历。通过根据方法调用类型的代码行查找对应的除第一代码之外的其他第二代码,基于上述循环过程可以完成第一类代码的遍历,能够避免对源代码文件中代码行的遗漏,提高整个定位过程的精准度以及效率。
在第一方面的一种可实现方式中,电子设备在基于至少一个目标节点,得到源代码文件对应的初始有向图的过程中,包括:
电子设备在遍历完成源代码文件中第一类代码对应的全部子语句之后,基于有向数据结构中目标节点和目标节点之间的节点路径,得到源代码文件对应的初始有向图。
可见,本申请实施例提供的电子设备在将源代码文件中语法类型为方法申明类型对应的全部子语句遍历完成之后,基于确定完成的所有目标节点以及目标节点之间的节点路径,得到源代码文件对应的初始有向图。初始有向图可以表征源代码文件中执行步骤以及对应的执行流程。用户可以通过初始有向图感知源代码文件中执行步骤以及执行步骤之间的逻辑关系,例如可以查看某一具体流程以及对应的子流程。无需自身凭借记忆阅读和分析源代码文件,简化了整个定位异常代码的操作步骤,进而提高用户的使用体验感。
在第一方面的一种可实现方式中,电子设备在根据源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点的过程中,包括:
电子设备将与运行日志具有相同代码行信息的目标节点,确定为第一匹配节点。
之后,电子设备将初始有向图中经由第一匹配节点的目标节点,确定为第二匹配节点。
最后,电子设备将第一匹配节点和第二匹配节点,确定为第一类节点。
可见,本申请实施例可以根据第一匹配节点和第二匹配节点,确定为第一类节点。其中,第一匹配节点和第二匹配节点均与源代码文件对应的运行日志相匹配。进而,通过确定的第一类节点,将第一匹配节点、第二匹配节点与初始有向图中的其他目标节点进行区分。便于用户基于第一类节点之外的第二类节点定位异常代码,简化了整个代码定位过程的操作步骤,提高用户的使用体验感。
在第一方面的一种可实现方式中,方法还包括:
电子设备响应于针对目标有向图中第二类节点的触发操作,跳转至显示第二类节点在源代码文件中对应位置的代码行。
可见,本申请实施例还可以响应于针对目标有向图中第二类节点的触发操作,直接跳转至显示第二类节点在源代码文件中对应位置的代码行。也就是说,用户察觉到异常代码对应的目标节点之后,可以对目标节点进行点击,触发跳转至源代码文件中该目标节点对应的代码行的具体位置。无需用户再次打开源代码文件查找异常代码对应的具体位置,简化了用户对整个定位过程的操作步骤,降低了定位异常代码的定位时间。进而提高用户的使用体验感。
在第一方面的一种可实现方式中,方法还包括:
电子设备在目标应用启动完成之后,提示第一信息;第一信息用于指示是否触发针对源代码文件中异常代码的定位过程;和/或,
电子设备在检测到定位源代码文件中异常代码的触发指令之后,提示第二信息;第二信息用于指示已开始遍历源代码文件。
可见,本申请实施例还可以在目标应用启动完成之后,提示第一信息;第一信息用于指示是否触发针对源代码文件中异常代码的定位过程;和/或,
在检测到定位源代码文件中异常代码的触发指令之后,提示第二信息;第二信息用于指示已开始遍历源代码文件。
这样,可以将整个定位过程可视化,让用户可以感知到是否触发定位过程,以及开始遍历源代码文件的时机。增加了电子设备与用户之间的交互,进而提高用户的使用体验感。
第二方面,提供了一种电子设备,电子设备包括存储器、一个或多个处理器;存储器与处理器耦合;其中,存储器中存储有计算机程序代码,计算机程序代码包括计算机指令,当计算机指令被处理器执行时,使得电子设备执行上述第一方面所述的代码处理方法。
第三方面,提供了一种计算机可读存储介质,计算机可读存储介质中存储有指令,当指令在计算机上运行时,使得计算机可以执行上述第一方面所述的代码处理方法。
附图说明
图1为本申请实施例提供的一种电子设备100的结构示意图;
图2为本申请实施例提供的一种电子设备100的软件结构示意图;
图3为本申请实施例提供的一种代码处理方法的流程示意图;
图4为本申请实施例提供的一种应用场景的界面示意图;
图5为本申请实施例提供的一种打开数据文件的界面示意图;
图6为本申请实施例提供的一种构建初始有向图的流程示意图;
图7为本申请实施例提供的一种初始有向图的界面示意图;
图8为本申请实施例提供的一种第一信息的界面示意图;
图9为本申请实施例提供的一种第二信息的界面示意图;
图10为本申请实施例提供的一种显示初始有向图的界面示意图;
图11为本申请实施例提供的一种第三信息的界面示意图;
图12为本申请实施例提供的一种打开打印日志的界面示意图;
图13为本申请实施例提供的一种显示目标有向图的界面示意图;
图14为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。其中,在本申请的描述中,除非另有说明,“/”表示前后关联的对象是一种“或”的关系,例如,A/B可以表示A或B;本申请中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况,其中A,B可以是单数或者复数。并且,在本申请的描述中,除非另有说明,“多个”是指两个或多于两个。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:a,b,c,a-b,a-c,b-c,或a-b-c,其中a,b,c可以是单个,也可以是多个。另外,为了便于清楚描述本申请实施例的技术方案,在本申请的实施例中,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。同时,在本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其他实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念,便于理解。
此外,本申请实施例描述的网络架构以及业务场景是为了更加清楚地说明本申请实施例的技术方案,并不构成对于本申请实施例提供的技术方案的限定,本领域普通技术人员可知,随着网络架构的演变和新业务场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
随着互联网以及计算机技术的飞速发展,诸如笔记本电脑以及台式电脑等电子设备日益普及,对电子设备中的操作系统的需要越来越高。例如,针对操作系统可以提供的功能提出越来越高的要求。通常,操作系统的运行是通过数据如代码来实现的。若操作系统提供的功能越高,操作系统对应的数据则越复杂。同时,在代码开发的过程中,编写的代码也会越复杂。由此就会出现将编写的代码进行运行后操作系统发生各种异常状态的情况。
为了处理操作系统在运行过程中可能出现的各种异常状态,需要查找和修复操作系统发生异常的确切位置。也就是说,需要查找和修复出现异常状态的代码。进而,通过定位到出现异常状态的代码(简称异常代码),并对其进行异常修复,以实现操作系统在运行过程中处于稳定运行状态。
目前的相关技术中,在查找发生异常代码的过程中,需要获取操作系统在运行中的运行日志,并需要人工对运行日志进行分析。这样,会需要熟悉代码或者编写对应代码的专业人员。通常,专业人员在查找异常代码的过程中,需要阅读整个源代码文件的代码。并且需要基于自身记忆大量的代码信息(如每类代码对应的方法名、描述信息以及包名信息等)进行关键字代码过滤,以缩小代码的阅读范围和减少代码的阅读量。之后,在过滤后的代码中分析并定位异常代码。进而,导致定位异常代码的效率低以及精准度低。
并且,通常操作系统的运行日志会采用不同颜色区分不同的日志类型。示例性的,一种运行日志内容如下:
1 Starting Gradle Daemon…
2 Gradle Daemon started in 1 s 346 ms
3
4 FAILURE:Build failed with an exception.
5
6 *What went wrong:
7 Could not download junit-jupiter-api-5.7.8.jar(org.junit.jupiter:junit-jupiter-api:5.7.8)
8 Could not get resource 'http:// org/junit/jupiter/junit-jupiter-api:5.7.8'
9 Could not GET 'http:// org/junit/jupiter/junit-jupiter-api:5.7.8'
10
11 *Try:
12 Run with –info or –debug option to get more log output. Run with –scan to get full insights.
13
14 *Exception is:
15 Com.intellij.openapi.externalSystiem.model.ExternalSystemException: Could not dowmload junit-jupiter-api-5.7.8.jar(org.junit.jupiter:junit-jupiter-api:5.7.8)
参见上述内容,第一行日志至第二行日志采用黑色字体,第三行日志至第十五行日志采用红色字体。其中,黑色用于标示正常日志,红色用于标示错误日志,以使得后续在错误日志中定位异常代码。
可见,运行日志只能表达出在粗粒度维度下的日志分析,无法表达出每个具体的业务流程以及业务流程对应的逻辑关系(如调用流程关系)。例如,无法表达出某个具体业务流程下的一个或多个子流程。同时,针对某个具体业务流程或某个具体业务流程下的子流程,人工在基于记忆的代码信息进行关键字过滤以及结合代码定位过程中,需要对大量运行日志中错误日志进行分析和定位,产生了大量的工作量,且不能实时定位发生异常的代码,灵活性较低。
基于上述内容,本申请实施例提供一种代码处理方法及电子设备,代码处理方法包括:电子设备根据源代码文件对应的抽象语法树,构建源代码文件对应的初始有向图。其中,初始有向图包括至少一个目标节点,目标节点根据抽象语法树中语法类型为预设类型的节点确定;有向图用于表征源代码文件中执行步骤对应的执行流程。
之后,电子设备显示源代码文件对应的初始有向图。并且电子设备根据源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点。其中,运行日志用于记录源代码文件对应的执行状态信息。
最后,电子设备显示目标有向图;目标有向图上的第一类节点和第二类节点以不同方式区分显示,第二类节点用于定位异常代码,第二类节点为初始有向图的目标节点中除第一类节点以外的节点。
可见,本申请实施例中提供的电子设备可以根据源代码文件对应的抽象语法树,构建并显示源代码文件对应的初始有向图。其中,初始有向图中包括基于抽象语法树中节点筛选的至少一个目标节点。并且,有向图用于表征源代码文件中执行步骤对应的执行流程。也就是说,以使得用户可以直接通过电子设备感知到源代码文件中执行步骤对应的执行流程。
并且,电子设备可以基于源代码文件对应的运行日志,确定第一类节点。第一类节点用于表征源代码文件对应的已执行代码。之后,电子设备可以显示目标有向图;并且,目标有向图上的第一类节点和第二类节点以不同方式区分显示。这样,通过目标有向图中显示的第一类节点和第二类节点,可以实现将正常代码与异常代码进行区分,并且还可以对异常代码进行定位。进而,无需人工凭借记忆对源代码文件进行阅读,以及对源代码文件中的异常代码进行分析和定位,提高了定位异常代码的准确性和速度。
并且,本申请实施例通过将初始有向图和目标有向图进行可视化,可以让用户查看某个业务流程下的一个或多个子流程,并且清晰地感知异常代码位于源代码文件的具体位置。提高用户的使用体验感,灵活性较强。同时,当本申请提供的代码处理方法应用在电子设备的操作系统中时,还可以提高操作系统运行的稳定性。
本申请实施例提供的电子设备可以包括笔记本电脑、台式电脑、手机、可折叠电子设备、平板电脑、桌面型计算机、膝上型计算机、手持计算机、超级移动个人计算机(Ultra-Mobile Personal Computer,UMPC)、上网本、蜂窝电话、个人数字助理(Personal DigitalAssistant,PDA)、增强现实(Augmented Reality,AR)设备、虚拟现实(Virtual Reality,VR)设备、人工智能(Artificial Intelligence,AI)设备、可穿戴式设备、车载设备或智慧城市设备中的至少一种。本申请实施例对该电子设备的具体类型不作特殊限制。
并且本申请实施例提供的电子设备安装的操作系统包括但不限于iOS®、Android®、Harmony®、Windows®、Linux®或者其他操作系统。本申请对电子设备的具体类型以及在有安装操作系统下操作系统的类型均不作限制。
示例性的,以电子设备为笔记本电脑为例,图1示出了电子设备100的结构示意图。
电子设备100可以包括处理器110,外部存储器接口120,内部存储器121,通用串行总(Universal Serial Bus,USB)接口130,充电管理模块140,电源管理模块141,电池142,天线1,天线2,移动通信模块150,无线通信模块160,音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,传感器模块180,按键190,马达191,指示器192,摄像头193,显示屏194,以及用户标识模块(Subscriber Identification Module,SIM)卡接口195等。其中传感器模块180可以包括压力传感器180A,陀螺仪传感器180B,气压传感器180C,磁传感器180D,加速度传感器180E,距离传感器180F,接近光传感器180G,指纹传感器180H,温度传感器180J,触摸传感器180K,环境光传感器180L和骨传导传感器180M等。
可以理解的是,本申请实施例示意的结构并不构成对电子设备100的具体限定。在本申请另一些实施例中,电子设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(Application processor,AP),调制解调处理器,图形处理器(Graphics ProcessingUnit,GPU),图像信号处理器(Image Signal Processor,ISP),控制器,视频编解码器,数字信号处理器(Digital Signal Processor,DSP),基带处理器,和/或神经网络处理器(Neural-network Processing Unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
处理器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器可以为高速缓冲存储器(CACHE)。该存储器可以保存处理器110用过或使用频率较高的指令或数据。如果处理器110需要使用该指令或数据,可从该存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了系统的效率。
在一些实施例中,存储器还存储有除计算机程序之外的其他数据,其他数据可包括操作系统或应用程序被运行后产生的数据,该数据包括系统数据(例如操作系统的配置参数)和用户数据,例如用户打开的应用程序所缓存的数据就是典型的用户数据。存储器一般包括内存和外存。内存可以为随机存储器(Random Access Memory,RAM)、只读存储器(Read Only Memory,ROM)以及CACHE等。外存可以包括固态硬盘(Solid State Disk或Solid State Drive,SSD)、通用闪存存储器(Universal Flash Storage,UFS)、混合硬盘(Hybrid Hard Drive,HHD)、磁盘、软盘、光盘、U盘以及多媒体卡等。
可以理解的是,本申请实施例示意的各模块间的连接关系,只是示意性说明,并不构成对电子设备100的结构限定。在本申请另一些实施例中,电子设备100也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。
充电管理模块140用于接收充电器的充电输入。电源管理模块141用于连接电池142,充电管理模块140与处理器110。电源管理模块141接收电池142和/或充电管理模块140的输入,为处理器110,内部存储器121,显示屏194,摄像头193,和无线通信模块160等供电。电子设备100的无线通信功能可以通过天线1,天线2,移动通信模块150,无线通信模块160,调制解调处理器以及基带处理器等实现。
在一些实施例中,电子设备100的天线1和移动通信模块150耦合,天线2和无线通信模块160耦合,使得电子设备100可以通过无线通信技术与网络和其他电子设备通信。该无线通信技术可以包括全球移动通讯系统(Global System For Mobile Communications,GSM),通用分组无线服务(General Packet Radio Service,GPRS),码分多址接入(CodeDivision Multiple Access,CDMA),宽带码分多址(Wideband Code Division MultipleAccess,WCDMA),时分码分多址(Time-Division Code Division Multiple Access,TD-SCDMA),长期演进(Long Term Evolution,LTE),BT,GNSS,WLAN,NFC ,FM,和/或IR技术等。该GNSS可以包括全球卫星定位系统(Global Positioning System ,GPS),全球导航卫星系统(Global Navigation Satellite System,GLONASS),北斗卫星导航系统(BeiDouNavigation Satellite System,BDS),准天顶卫星系统(Quasi-Zenith SatelliteSystem,QZSS)和/或星基增强系统(Satellite Based Augmentation Systems,SBAS)。
电子设备100可以通过GPU,显示屏194,以及应用处理器等实现显示功能。GPU为图像处理的微处理器,连接显示屏194和应用处理器。GPU用于执行数学和几何计算,用于图形渲染。处理器110可包括一个或多个GPU,其执行程序指令以生成或改变显示信息。
显示屏194用于显示文件,图像,视频等。显示屏194包括显示面板。在一些实施例中,电子设备100可以包括1个或多个显示屏194。用户可以通过显示屏194打开磁盘中存储的目标文件,电子设备100响应于用户对目标文件的打开动作,控制显示屏197显示对应的目标文件。
电子设备100可以通过摄像头193,ISP,视频编解码器,GPU,显示屏194以及应用处理器AP、神经网络处理器NPU等实现摄像功能。
在一些实施例中,处理器110中的CPU或GPU或NPU可以对摄像头193所采集的彩色图像数据和深度数据进行处理。
电子设备100可以通过音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,以及应用处理器等实现音频功能。例如音乐播放,录音等。
电子设备100的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。
本申请实施例以分层架构的Android系统为例,示例性说明电子设备100的软件结构。
图2是本发明实施例的电子设备100的软件结构框图。
分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android系统分为四层,从上至下分别为应用程序层,应用程序框架层,安卓运行时(Android Runtime)和系统库,以及内核层。
应用程序层可以包括一系列应用程序包。
如图2所示,应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频以及目标应用等应用程序。其中,目标应用用于打开并展示目标文件。
应用程序框架层为应用程序层的应用程序提供应用编程接口(ApplicationProgramming Interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图2所示,应用程序框架层可以包括语法解析模块、日志解析模块、日志标记模块、代码有向图模块以及日志可视化模块。
其中,语法解析模块用于解析源代码文件以及生成源代码文件对应的语法信息。日志解析模块用于解析源代码文件并生成源代码文件对应的运行日志。日志标记模块用于根据源代码文件对应的运行日志,确定初始有向图中用于表征已执行代码的第一类节点。代码有向图模块用于构建并生成源代码文件对应的初始有向图和目标有向图。日志可视化模块用于显示源代码文件对应的运行日志。
Android Runtime包括核心库和虚拟机。Android Runtime负责安卓系统的调度和管理。
核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。
应用程序层和应用程序框架层运行在虚拟机中。虚拟机将应用程序层和应用程序框架层的java文件执行为二进制文件。虚拟机用于执行对象生命周期的管理,堆栈管理,线程管理,安全和异常的管理,以及垃圾回收等功能。
系统库可以包括多个功能模块。例如:表面管理器(Surface Manager),媒体库(Media Libraries),三维图形处理库(例如:OpenGL ES),二维图形引擎(例如:SGL)等。
表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了2D和3D图层的融合。
媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:MPEG4,H.264,MP3,AAC,AMR,JPG,PNG等。
三维图形处理库用于实现三维图形绘图,图像渲染,合成,和图层处理等。
2D图形引擎是2D绘图的绘图引擎。
内核层是硬件和软件之间的层。内核层至少包含显示驱动,摄像头驱动,音频驱动,传感器驱动。
下面将对本申请实施例提供的代码处理方法进行具体说明。为便于后续描述,以电子设备为用户对应的笔记本电脑作为示例。图3为本申请实施例示出的一种代码处理方法的流程示意图,如图3所示,该方法可以包括如下步骤S301-步骤S307。
步骤S301、笔记本电脑检测到针对目标应用的打开操作,启动目标应用。
在本申请的一些实施例中,用户可以采用笔记本电脑中的目标应用定位数据文件中的异常数据。其中,目标应用可以包括定位异常代码功能的定位应用、包括定位异常代码功能的编程应用以及包括定位异常代码功能的软件开发应用等等。用户可以采用目标应用来实现对数据文件中异常数据的定位。当然,笔记本电脑还可以采用除目标应用之外的其他方式来实现对异常数据的定位,本申请对此不具体限定。
具体地,用户在需要查找数据文件中发生异常的数据的过程中,可以指示笔记本电脑启动相应的应用程序来进行查找。笔记本电脑启动目标应用的方式可以有多种。
通常,用户可以在笔记本电脑的主屏幕界面中选中目标应用对应的图标,以使笔记本电脑启动目标应用。其中,打开操作可以包括针对目标应用对应图标的点击操作,或者,针对目标文件的语音操作。
示例性的,图4为本申请实施例示出的应用场景的界面示意图。如图4中的(A)所示,用户可以点击笔记本电脑主屏幕界面上的目标应用图标,笔记本电脑响应于用户的该点击操作启动目标应用。如图4中的(B)所示,笔记本电脑响应于用户的点击操作,显示出目标应用的详情页面。此时,目标应用已启动。再示例性的,笔记本电脑也可以响应于用户的语音指令,启动目标应用。之后,用户可以使用目标应用对应的定位异常数据等功能。
继续参见图4中的(B),目标应用的详情页面包括功能栏、快捷栏以及位于快捷栏下方的第一显示区。其中,第一显示区用于显示最近打开过文件对应的文件信息。第一显示区包括第一控件。用户可以通过点击第一控件,以输入针对任意数据文件的文件详情页面显示指令,来触发进入对应的文件详情页面。
步骤S302、笔记本电脑响应于第一触发操作,获取源代码文件。
在实际场景中,笔记本电脑中会存储大量的数据文件。用户在想要针对某个数据文件进行异常数据定位的过程中,需要预先使用笔记本电脑中的目标应用打开该数据文件。以实现后续目标应用执行对该数据文件的定位操作。当然,用户也可以使用笔记本电脑打开远程数据文件。本申请实施例不对数据文件的具体位置进行限定。
在本申请的一些实施例中,第一触发操作可以用于指示笔记本电脑打开数据文件。例如,第一触发操作可以包括用户针对目标应用中数据文件的点击操作;第一触发操作可以包括用户针对目标应用中数据文件的语音操作。
示例性的,图5为本申请实施例示出的打开数据文件的界面示意图。如图5中的(A)所示,用户可以点击目标应用的详情页面中的第一控件,笔记本电脑响应于用户的针对第一控件的点击操作,显示打开文件对应的详情页。如图5中的(B)所示,打开文件对应的详情页包括磁盘中D盘对应的数据文件和第二控件。例如,数据文件包括文件“test.3”和文件“test.4”。用户可以点击数据文件对应的文件图标,触发打开该数据文件。例如,用户点击“test.3”对应的文件图标,并点击第二控件,则触发打开“test.3”文件。为便于后续描述,将数据文件为源代码文件为例。
在本申请的一些实施例中,打开文件对应的详情页中显示有目标应用对应的文件。对于目标应用对应的文件来说,是指能目标应用能够打开的文件。可以通过文件的文件类型来判定目标应用是否能够打开该文件。在定位源代码文件中的异常代码的场景下,目标应用可以根据文件的文件类型,查找磁盘中匹配的文件并显示在打开文件对应的详情页中。其中,目标应用对应的文件可以包括扩展名为.java、.py、.cpp以及.c等文件。目标应用可以将上述文件打开后,并执行后续定位异常数据的操作。为便于后续描述,将文件中的异常数据以源代码文件中的异常代码作为示例进行后续说明。
步骤S303、笔记本电脑对源代码文件进行解析,得到源代码文件的语法信息。
在本申请的一些实施例中,笔记本电脑可以利用语法解析器对源代码进行解析,生成抽象语法树(Abstract Syntax Tree,AST)。其中,抽象语法树中包含源代码文件的语法信息,语法解析器则可以为以下任意一种:@babel/parser解析器、uglify-js解析器、Esprima解析器、acorn解析器、espree解析器、TypeScript解析器、sucrase解析器、swc解析器、AST Explorer解析器或jscodeshift解析器。
在本申请的一些实施例中,抽象语法树是对代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示代码中的一种结构。也就是说,抽象语法树就是对代码语法信息的树状结构化表现形式。
示例性的,在用户输入学生的数学和语文成绩后,查看打印信息并确定奖状数量的场景下,用户可以输入学生的数学分数和语文分数,如果数学分数为100分,打印“数学尖兵奖”;如果语文分数为100分,则打印“语文尖兵奖”;如果数学分数大于90分,且语文分数大于90分,则打印“三好学生”。最后确定打印该学生打印的奖状数量。用户在输入学生的数学分数为90且语文分数为100时,发现最后确定打印该学生打印的奖状数量与真实情况不符。
其中,具体编写的源代码文件内容如下:
3 public class Main {
4 public static void main (String[] args) {
5 handleScore(mathsScore: 90, languageScore: 100);
6 }
7
8 public static void handleScore (int mathesScore, int languageScore){
9 System.out.println("数学分数:" + mathsScore + ",语文分数:" +languageScore);
10 award(mathsScore, languageScore);
11 }
12
13 public static void award (int mathesScore, int languageScore) {
14 int awardCount = 0;
15 if (mathsScore == 100) {
16 System.out.println("数学尖兵");
17 awardCount ++;
18 }
19 if (languageScore == 100) {
20 System.out.println("语文尖兵");
21 awardCount ++;
22 }
23 if (mathsScore>90&&languageScore>90) {
24 System.out.println("三好学生");
25 awardCount ++;
26 }
27 awardCount(awardCount);
28 }
29
30 public static void awardCount (int awardCount) {
31 System.out.println("该同学总共发了" + awardCount + "个奖状");
32 }
33 }
本申请的一些实施例中,笔记本电脑中的目标应用可以通过对上述源代码文件的内容进行解析,生成抽象语法树。抽象语法树是一个树形的JSON结构对象,其中就包含源代码文件对应的语法信息。
示例性的,基于上述场景,以上述源代码文件内容中第13行代码为例,通过对第13行代码得到抽象语法树一行内容为:class org.eclipse.jdt.core.dom.MethodDeclaration。可以表明第13行代码是一个针对函数或方法申明的语句。
继续以上述源代码文件内容中第15行代码为例,通过对第15行代码得到抽象语法树一行内容为:class org.eclipse.jdt.core.dom.ifStatement。可以表明第15行代码是一个针对分支判断步骤的语句。
其中,抽象语法树中可以包括多个节点,每个节点都表示源代码文件中的一种结构。例如,.MethodDeclaration为方法申明节点,代表了上述源代码内容中一种函数方法的结构,该节点包括了完整的方法的实现部分。再例如,.ifStatement为分支判断节点,代表了上述源代码内容中一个流程分支对应的结构,该节点包括了完整的分支的实现部分。
可见,本申请实施例通过对源代码文件进行解析,得到源代码文件的抽象语法树。抽象语法树包括源代码文件的语法信息。能够利用抽象语法树对源代码文件中信息进行抽象表示,既可以包含源代码文件自身的语义,又可以按照层级关系布置的各节点优化表示出源代码文件中信息的数据结构、优先级和层次。
进而实现了对源代码文件的语法信息的抽取和数据分布结构的展示,以实现准确且快速地获取源代码文件中具体流程执行的相关信息。
步骤S304、笔记本电脑遍历源代码文件的语法信息,构建并显示源代码文件对应的初始有向图。
在本申请的一些实施例中,目标应用在获取源代码文件之后,可以根据源代码文件对应的抽象语法树,构建源代码文件对应的初始有向图。
具体地,目标应用基于分析函数调用链,对源代码文件的抽象语法树的所有节点进行深度遍历,该方式能够在遍历过程中全面、准确且快速地遍历抽象语法树中的各节点,从而实现对得到的抽象语法树快速地完全遍历,具有遍历过程无遗落且快速、准确等优点。
并且,目标应用在遍历抽象语法树的所有节点的过程中,可以从所有节点中筛选出用于表征业务流程中执行步骤的至少一个目标节点。之后,基于至少一个目标节点构建初始有向图并显示。其中,初始有向图可以通过有向数据结构中节点的节点类型和树形结构关系表示代码语句的意义和顺序,并且可以通过初始有向图的相关信息来表达完整的代码段。
这样,本申请实施例可以从源代码文件对应的抽象语法树中,筛选出至少一个目标节点,并对每个目标节点赋予先后顺序。进而,就能提取出源代码文件中包括的执行步骤之间的分支关系。最后根据源代码文件中包括的全部调用链,生成源代码文件中全部分支的执行步骤,能够自动且准确地得到业务流程中的分支关系。无需技术人员进行源代码文件分析,也不需要手动查找某个执行步骤以及分支关系,有效提高了业务流程中分支关系的生成效率。
在本申请的一些实施中,目标应用生成源代码文件对应的抽象语法树之后,根据抽象语法树,建立源代码文件对应的代码索引表。之后,目标应用再根据代码索引表,遍历源代码文件,确定至少一个目标节点。并且,基于至少一个目标节点,得到源代码文件对应的初始有向图。
下面将对得到初始有向图的过程进行具体说明。图6为本申请实施例示出的构建初始有向图的流程示意图,如图6所示,该方法可以包括如下步骤S601-步骤S612。
步骤S601、根据源代码文件的抽象语法树,建立源代码文件对应的代码索引表。
在本申请的一些实施例中,代码索引表用于表示用于表征源代码文件中每行代码的代码信息,每行代码的代码信息与抽象语法树中的节点对应。
其中,代码信息可以包括代码对应的包名信息、类名信息、方法名信息、索引信息、语法类型信息以及描述信息等。当然,代码信息还可以包括方法对应的代码文件路径信息、接口类名信息、修饰符名信息以及代码行信息等。
示例性的,参见表1,继续以上述编写的源代码文件内容为例,代码索引表如下:
表1
参见表1,源代码文件对应的代码索引表包括代码对应的代码行信息、该行代码对应的语法类型、该语法类型对应的索引信息以及描述信息。其中,索引信息包括申明索引信息、调用索引信息和归属索引信息等。当然,描述信息还可以根据语法类型进行适应性添加。例如,当代码行对应的语法类型为分支判断类型时,描述信息还可以包括“条件判断”。本申请实施例不对源代码文件对应的代码信息、代码索引表以及代码行对应的语法类型进行具体限定。
其中,语法类型包括方法申明类型、日志打印类型、分支判断类型以及方法调用类型等。
在本申请的一些实施例中,在第4行、第8行、第13行以及第30行的代码对应的语法类型为方法申明类型。方法申明类型用于表征该行代码创建并定义了一个动态函数(方法)。在程序中其他代码行实施的过程中可以调用方法申明中对应的动态函数。
并且,实现方法申明类型对应的代码行可以包括至少一个子代码行。也就是说,每个方法申明类型对应的父语句可以包括至少一个子语句。
例如,上述第4行、第8行、第13行、第30行的代码中,每个方法申明类型对应的代码行包括的子代码行分别为:从第5行到第5行、从第9行到第10行、从第15行到第24行以及从第31行到第31行。
当代码对应的语法类型为方法申明类型时,可以理解为该行代码可以作为父语句。该行代码通常通过每个动态函数对应的方法体来实现,即父语句需要包括至少一个其他的子语句。
在一些实施例中,方法申明类型的代码行对应有自身的申明索引信息,申明索引信息包括代码对应的包名信息、类名信息以及方法名信息。申明索引信息用于在源代码文件中找到对应为方法申明类型代码定义的动态函数。也就是说,在全部源代码文件中,方法申明类型对应的代码均创建并定义了不同的动态函数。
示例性的,在第4行、第8行、第13行、第30行的代码对应的申明索引信息分别为:java.Main.main、java.Main.handleScore、java.Main.award以及java.Main.awardCount。
在本申请的一些实施例中,在第5行、第10行以及第27行的代码对应的语法类型为方法调用类型。方法调用类型用于表征该行代码调用的方法。比如,该行代码可以调用上述方法申明类型代码对应的动态函数。
同样地,当代码对应的语法类型为方法调用类型时,可以理解为该行代码可以作为子语句,归属于某个为方法申明类型的父语句。
当然,该行代码也可以调用除归属之外的其他方法申明类型对应的父语句。由此,当代码对应的语法类型为方法调用类型时,该行代码可以对应有调用索引信息。调用索引信息用于在源代码文件中找到方法调用类型的代码中调用的动态函数。
在一些实施例中,当代码对应的语法类型为方法调用类型时,该行代码可以对应有归属索引信息,也可以不对应有归属索引信息。归属索引信息用于在源代码文件中找到方法调用类型的代码中归属的动态函数。
示例性的,在第5行、第10行以及第27行的代码对应的调用索引信息分别为:java.Main.handleScore、java.Main.award以及java.Main.awardCount。
并且,第5行对应的归属索引信息为:java.Main.handleScore。第10行对应的归属索引信息为:java.Main.handleScore。第27行的代码不对应有归属索引信息。
在本申请的一些实施例中,在第15行、第19行以及第23行的代码对应的语法类型为分支判断类型。分支判断类型用于表征该行代码为条件判断语句,以依据判断结果执行后续不同的步骤。可以理解为分支判断类型对应的代码可以作为子语句,归属于某个语法类型为方法申明类型对应的父语句。
由此,当代码对应的语法类型为分支判断类型时,该行代码可以对应有归属索引信息。
示例性的,在第15行、第19行以及第23行的代码对应的归属索引信息为:java.Main.award、java.Main.award以及java.Main.award。
在本申请的一些实施例中,在第9行、第16行、第20行、第24行以及第31行的代码对应的语法类型为日志打印类型。日志打印类型用于表征记录运行整个源代码文件后对应的业务流程步骤,以便于用户进行查看操作步骤。
可以理解为日志打印类型对应的代码同样也可以作为子语句,归属于某个语法类型为方法申明类型对应的父语句。
由此,当代码对应的语法类型为日志打印类型时,该行代码可以对应有归属索引信息。
示例性的,在第9行、第16行、第20行、第24行以及第31行的代码对应的归属索引信息为:java.Main.handleScore、java.Main.award、java.Main.award、java.Main.award以及java.Main.awardCount。
在本申请的一些实施例中,在建立源代码文件对应的代码索引表之后,还可以建立开始有向节点。该开始有向节点对应的赋值为:开始。便于后续基于开始有向节点,构建源代码文件对应的初始有向图。
在本申请的一些实施例中,目标应用在根据代码索引表,遍历源代码文件,确定至少一个目标节点的过程中,包括:目标应用根据代码索引表,查找源代码文件对应的第一类代码,第一类代码包括源代码文件中语法类型为方法申明类型的至少一个代码行。之后,目标应用根据代码索引表,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句;预设类型包括日志打印类型和分支判断类型。最终,目标应用根据至少一个子语句,确定至少一个目标节点。
具体地,目标应用在根据代码索引表,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句的过程中,包括:目标应用根据代码索引表,获取第一类代码中的第一代码,第一代码为第一类代码的首个代码行。之后,目标应用基于代码索引表中每行代码对应的语法类型,依次遍历第一代码对应的至少一个一级语句,得到语法类型为预设类型的至少一个子语句;一级语句为第一代码对应的下一级子语句。
并且,目标应用在根据至少一个子语句,确定至少一个目标节点的过程中,包括:目标应用若确定一级语句的语法类型是日志打印类型,则基于一级语句对应的代码行信息,建立一级语句对应的第一主体节点。
目标应用若确定一级语句的语法类型是分支判断类型,则基于一级语句对应的代码行信息,建立一级语句对应的第二主体节点和第二主体节点对应的至少一个正分支节点;正分支节点用于表征满足一级语句给定的条件对应的执行步骤。最后,目标应用根据第一主体节点,和/或,第二主体节点和正分支节点,确定目标节点。
当然,目标应用确定目标节点的过程中,还包括将建立的第一主体节点,和/或,第二主体节点和正分支节点对应的节点路径进行指向。
具体地,目标应用建立一级语句对应的第一主体节点的过程中,还包括:目标应用在建立一级语句对应的第一主体节点之后,将有向数据结构的当前尾节点的节点路径指向第一主体节点,以建立完成第一主体节点。
其中,尾节点为有向数据结构中已建立完成的节点路径中未指向其他节点的节点,尾节点初始可以为开始节点。
目标应用在建立一级语句对应的第二主体节点和第二主体节点对应的正分支节点之后,将尾节点的节点路径指向第二主体节点,以及将第二主体节点的节点路径指向正分支节点。
下面将对确定目标节点的过程进行具体说明。
步骤S602、获取源代码文件中首个语法类型为方法申明类型的第一代码。
步骤S603、基于代码索引表,遍历第一代码对应的一级语句。其中,一级语句为第一代码对应的下一级子语句。
基于代码索引表,获取第一代码对应的全部子语句,并且按照代码位序遍历第一代码对应的全部子语句。其中,一级语句的代码位于第一代码下的首个子语句。由此,目标应用在获取第一代码的全部子语句之后,遍历第一代码对应的一级语句。
也就是说,目标应用可以从源代码文件中的程序入口开始进行遍历。遍历过程是从程序入口中第一个语法类型为方法申明类型的代码行开始,即作为首个索引,执行后续遍历过程。
示例性的,继续基于上述源代码文件内容作为示例。该源代码文件中首个为方法申明类型的第一代码为第4行代码。也就是说,该源代码文件对应的执行入口索引为:java.Main.main。之后,基于上述代码索引表,获取第4行代码对应的一级语句,并且遍历该一级语句。
可以理解的是,第4行代码的语法类型为方法申明类型,即第4行代码为父语句。那么,在获取第4行代码对应的全部子语句的过程中,可以将代码索引表中归属索引信息为:java.Main.Main对应的代码行,确定为第4行代码对应的子语句。之后,开始遍历第4行代码下的首个子语句,如第5行代码“handleScore(mathsScore: 90, languageScore: 100)”。
步骤S604、在遍历第一代码对应的一级语句的过程中,确定一级语句的语法类型是否为日志打印类型。若是则执行步骤S605;反之,则执行步骤S606。
在遍历第一代码对应的一级语句的过程中,目标应用可以确定一级语句的语法类型是否为日志打印类型。
步骤S605、若确定一级语句的语法类型为日志打印,则建立一级语句对应的第一主体节点。
目标应用在遍历第一代码对应的一级语句的过程中,若确定一级语句的语法类型为日志打印类型,则建立第一主体节点。
其中,在建立第一主体节点的过程中,基于一级语句的包名信息、类名信息、代码行信息以及描述信息,建立第一主体节点。并且,将有向数据结构中当前尾节点的节点路径指向该第一主体节点,以及将第一主体节点赋值为尾节点。其中,尾节点为有向数据结构中已建立完成的节点路径中未指向其他节点的节点。
可以理解的是,在源代码文件用于表征的业务流程中,当一级语句的语法类型为日志打印时,该一级语句可以表征业务流程中某个执行步骤的执行状态。进而,通过建立一级语句对应的第一主体节点,便于后续将具体的代码信息进行可视化的表征。能清晰地查看某个具体流程的步骤,提高用户的使用体验。
示例性的,基于代码索引表,确定第5行代码“handleScore(mathsScore: 90,languageScore: 100)”的语法类型为方法调用类型,则执行步骤S605。
再示例性的,以第8行代码“public static void handleScore (intmathesScore, int languageScore) {”作为示例。第8行代码的语法类型为方法申明类型,即第8行代码为第一代码。第9行“System.out.println("数学分数:" + mathsScore + ",语文分数:" + languageScore)”的归属索引信息为“java.Main.handleScore”,即第9行为第8行的一级语句。之后,基于代码索引表,确定第9行代码的语法类型为日志打印类型。
那么,基于第9行的包名信息“java”、类名信息“main”、代码行信息“[9]”以及描述信息“数学分数:" + mathsScore + ",语文分数:" + languageScore”,建立第一主体节点。并且,将尾节点的节点路径指向该第一主体节点,以及将第一主体节点赋值为尾节点。例如,参见图7,第一主体节点对应的第一节点控件可以为“[类名.包名][9]描述信息”或[Main.java][9] "数学分数:" + mathsScore + ",语文分数:" + languageScore”。
可见,由于日志打印类型对应的代码行可以表征业务流程中的执行步骤。那么,当一级语句的语法类型为日志打印类型时,对应的第一主体节点可以表征具体流程中的某个分支中的执行步骤,或者,不同分支对应的某个合并中的执行步骤。
在本申请的一些实施例中,链表是一种物理存储单元上非连续、非顺序的存储结构,代码的逻辑顺序是通过链表中的指针链接次序实现的。链表可以包括一系列节点,节点可以在代码遍历过中动态生成。最后,基于包括一系列节点的链表生成有向图。
而尾节点(LastNode)指的是在代码遍历过程中某个时长内链表对应的最后一个节点。那么,在建立第一主体节点之后,需要将尾节点的节点路径指向该第一主体节点,而第一主体节点即成为当前的尾节点。
示例性的,尾节点可以为开始节点。目标应用需要将开始节点的节点路径指向第一主体节点“ [Main.java][9]"数学分数:" + mathsScore + ",语文分数:" +languageScore”,并将“ [Main.java][9]"数学分数:" + mathsScore + ",语文分数:" +languageScore”赋值为当前的尾节点。
步骤S606、确定一级语句的语法类型是否为分支判断类型。若是则执行步骤S607;反之,则执行步骤S608。
步骤S607、建立一级语句对应的第二主体节点和正分支节点。
目标应用在遍历第一代码对应的一级语句的过程中,若确定一级语句的语法类型为分支判断类型,则建立第二主体节点。
其中,在建立第二主体节点的过程中,基于一级语句的包名信息、类名信息以及代码行信息建立第二主体节点。并将尾节点的节点路径指向该第二主体节点以及将第二主体节点赋值为尾节点。
在建立正分支节点的过程中,基于一级语句的包名信息、类名信息、代码行信息以及描述信息,建立正分支节点。并将尾节点指向该正分支节点以及将正分支节点赋值为尾节点。即将第二主体节点的节点路径指向正分支节点。其中,第二主体节点用于表征业务流程中某个条件判断的判断步骤,正分支节点用于表征业务流程中在条件判断的场景下,满足一级语句给定的条件对应的执行步骤。
可以理解的是,在源代码文件用于表征的业务流程中,当一级语句的语法类型为分支判断类型时,该一级语句可以表征业务流程中某个具体流程的条件判断步骤以及满足给的条件的步骤。进而,通过建立一级语句对应的第二主体节点和正分支节点,便于后续将具体的代码信息进行可视化的表征。能清晰地查看某个具体流程中具体分支的步骤,提高用户的使用体验。
示例性的,第5行代码“handleScore(mathsScore: 90, languageScore: 100)”的语法类型为方法调用类型。则执行步骤S606。
再示例性的,以第13行代码“public static void award (int mathesScore,int languageScore) {”作为示例,第13行代码的语法类型为方法申明类型,即第13行代码为第一代码。第15行“if (mathsScore == 100) {”的归属索引信息为“java.Main.award”,即第15行为第13行的一级语句。之后,基于代码索引表,确定第15行代码的语法类型为分支判断类型。
那么,基于第15行代码的包名信息“java”、类名信息“Main”以及代码行信息“[15]”,建立第二主体节点。例如,参见图7,第二主体节点对应的第二节点控件可以为“[类名.包名][15]条件判断”或“[Main.java][15]条件判断”。之后,将尾节点的节点路径指向该第二主体节点,以及将第二主体节点赋值为尾节点。
例如,尾节点为第一主体节点,目标应用需要将第一主体节点“[Main.java][9]"数学分数:" + mathsScore + ",语文分数:" + languageScore”指向第二主体节点“[Main.java][15] 条件判断”。并将“[Main.java][15]条件判断”赋值为当前的尾节点。
之后,基于第15行代码的包名信息“java”、类名信息“Main”以及代码行信息“[15]” 以及描述信息“mathsScore==100”,建立正分支节点。
例如,参见图7,正分支节点对应的第三节点控件可以为“[类名.包名][15]描述信息”或“[Main.java][15]mathsScore==100”。之后,将尾节点指向该正分支节点,以及将正分支节点赋值为尾节点。
例如,尾节点为第二主体节点,目标应用需要将第二主体节点“[Main.java][15]条件判断”指向正分支节点“[Main.java][15]mathsScore==100”。并将“[Main.java][15]mathsScore==100”赋值为当前的尾节点。
在本申请的一些实施中,目标应用在建立一级语句对应的第二主体节点和第二主体节点对应的至少一个正分支节点的过程中,还包括:目标应用遍历一级语句对应的二级语句;二级语句为一级语句对应的下一级子语句。目标应用若遍历完成二级语句,则将尾节点的节点路径回退至第二主体节点。
目标应用若未检测到一级语句对应的负分支节点,则建立一级语句对应的默认节点;其中,负分支节点用于表征未满足一级语句给定的条件对应的执行步骤;以及将尾节点的节点路径指向默认节点。
在本申请的一些实施中,目标应用在确定一级语句的语法类型为分支判断类型之后,继续遍历归属于一级语句的负分支节点即正向子语句。若归属于一级语句的正向子语句已遍历完成,将当前尾节点回退至第二主体节点。其中,正向子语句用于表征满足业务流程中给定的条件的分支执行步骤。
之后,目标应用若未检测到归属于一级语句的负分支节点即负向子语句,建立默认节点(default)。其中,负向子语句用于表征未满足业务流程中给定的条件的分支执行步骤。并将尾节点指向该默认节点,以及将默认节点赋值为尾节点。也就是说,为了便于将整个条件判断过程顺利进行,既需要有满足条件的分支步骤,也需要有未满足条件的分支步骤。
示例性的,参见图7,正分支节点对应第15行“if (mathsScore == 100) {”,即满足给定的条件的分支。那么,也需要建立与正分支节点对应的默认节点。进而,当该具体流程未满足条件时,可以经由该默认节点继续执行后续的步骤。
在本申请的一些实施例中,代码索引表中的索引信息包括源代码文件中每行代码对应的调用索引信息。
目标应用在基于代码索引表,遍历第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句的过程中,还包括:
目标应用若确定一级语句的语法类型是方法调用类型,则获取代码索引表中一级语句对应的调用索引信息。
之后,目标应用根据调用索引信息,遍历第一类代码中的第二代码,得到语法类型为预设类型的至少一个子语句;第二代码为位于第一代码之后的代码行。
步骤S608、确定一级语句的语法类型是否为方法调用类型。若是则执行步骤S609;反之,则执行步骤S610。
步骤S609、获取一级语句的调用索引信息对应的第二代码,继续重复执行上述步骤S603;其中,第二代码和第一代码的语法类型均为方法申明类型。
在本申请的一些实施例中,目标应用在遍历第一代码对应的一级语句的过程中,若确定一级语句的语法类型为方法调用类型,则继续根据自身的调用索引信息获取第二代码。第二代码的语法类型为方法申明类型。
也就是说,在一级语句的语法类型为方法调用类型的场景下,该一级语句用于表征在业务流程中调用的方法,即不能表征业务流程中的执行步骤。
进而,一级语句的语法类型为方法调用类型时,继续获取除第一代码之外的其他第二代码。之后,继续重复执行上述步骤S603,获取第二代码的全部子语句,并且按照代码位序先后遍历第二代码的全部子语句。在此不再赘述。
示例性的,基于代码索引表,确定第5行代码“handleScore(mathsScore: 90,languageScore: 100)”的语法类型为方法调用类型。之后,获取第5行代码“handleScore(mathsScore: 90, languageScore: 100)”的调用索引信息“java.Main.handleScore”。
继续基于代码索引表,查找调用索引信息“java.Main.handleScore”对应的语法类型为方法申明类型的第二代码。例如,第二代码为第8行代码“public static voidhandleScore (int mathesScore, int languageScore) {”。
步骤S610、确定源代码文件对应的全部子语句是否遍历完成;若是则执行步骤S611;反之,则执行步骤S612。
步骤S611、得到源代码文件对应的初始有向图。
在本申请的一些实施例中,目标应用在基于至少一个目标节点,得到源代码文件对应的初始有向图的过程中,包括:目标应用在遍历完成源代码文件中第一类代码对应的全部子语句之后,基于有向数据结构中目标节点和目标节点之间的节点路径,得到源代码文件对应的初始有向图。
步骤S612、依次获取第一代码对应的除一级语句之外的子语句,继续重复执行上述步骤S604。
在本申请的一些实施例中,目标应用在遍历第一类代码对应的全部子语句的过程中,是按照代码预先从头至尾依次遍历的。由此,在遍历完每个子语句的之后,会需要确定源代码文件对应的全部子语句是否遍历完成。
若遍历完成全部子语句,则目标节点和目标节点之间的节点路径,得到源代码文件对应的初始有向图。其中,初始有向图用于表征源代码文件实现业务流程中的执行步骤以及流程走向。
示例性的,以第30行代码“public static void awardCount (int awardCount){”作为示例,第30行代码的语法类型为方法申明类型,即第30行代码为第一代码。第31行“System.out.println("该同学总共发了" + awardCount + "个奖状");”的归属索引信息为“java.Main. awardCount”,即第31行为第30行的一级语句。之后,基于代码索引表,确定第31行代码的语法类型为日志打印类型。
接着,确定源代码文件对应的全部子语句是否遍历完成。第31行代码为源代码文件的程序出口,可以确定源代码文件对应的全部子语句已遍历完成。
进而,继续参见图7,生成源代码文件对应的初始有向图。第31行代码的语法类型为日志打印类型,对应的第一主体节点为“[类名.包名][31]描述信息”或“[Main.java][31]"该同学总共发了" + awardCount + "个奖状"”,该第一主体节点即为尾节点。
在本申请的一些实施例中,若没有遍历完成全部子语句,则继续获取第一代码对应的除一级语句之外的子语句,也就是继续向下遍历第一代码对应的子语句。
示例性的,继续以第13行代码“public static void award (int mathesScore,int languageScore) {”作为示例,第13行代码的语法类型为方法申明类型,即第13行代码为第一代码。第15行为第13行的一级语句。之后,确定第15行代码的语法类型为分支判断类型。并且确定没有遍历完成全部子语句,则继续获取第一代码对应的除一级语句之外的子语句,也就是第16行代码“System.out.println("数学尖兵")”。并循环执行上述步骤S604。
在本申请的一些实施例中,在确定源代码文件对应的全部子语句已遍历完成之后,还可以建立结束有向节点。该开始有向节点对应的赋值为:结束。并将上一个尾节点指向结束有向节点,进而完成初始有向图的生成。
在本申请的一些实施例中,参见图8,用户点击第二控件,则触发打开“test.3”文件后,笔记本电脑在目标应用启动完成之后,还可以提示第一信息,第一信息用于指示是否触发针对源代码文件中异常代码的定位过程。其中,第一信息还对应有第一提示控件,第一提示控件可以实现为文本“是否现在开始定位源代码文件中的异常代码”。第一信息还包括第三控件,用户可以点击第三控件,来触发定位源代码文件中的异常代码。笔记本电脑响应于针对第三控件的点击操作,开始遍历源代码文件。
在本申请的一些实施例中,参见图9,笔记本电脑在检测到定位源代码文件中异常代码的触发指令(如针对第三控件的点击操作)之后,开始遍历源代码文件,还可以提示第二信息,第二信息用于指示已开始遍历源代码文件。其中,第二信息还对应有的第二提示控件,第二提示控件可以实现为文本“正在生成初始有向图,请耐心等待”。
在本申请的一些实施例中,参见图10,目标应用可以将整个源代码文件遍历之后,构建的初始有向图显示在显示屏中。其中,初始有向图中还可包括第四控件,用户可以点击第四控件,来触发后续对源代码文件中异常代码的定位过程。也就是说,笔记本电脑可以响应于针对第四控件的点击操作,执行源代码文件中异常代码的定位过程。
可见,在本申请实施中,通过对源代码文件进行遍历,得到用于表征整个业务流程分支关系的初始有向图。并且可以将该初始有向图显示在显示屏中,能够让用户清晰地感知到源代码文件中具体的执行步骤以及执行流程。无需用户记忆大量的代码信息对源代码文件中的每行代码行进行查看和分析。同时还能够通过初始有向图查看出某个具体业务流程下的所有子流程,提高后续定位源代码文件中异常代码过程的定位速度以及定位精准度。进而,提高用户的使用体验。
在本申请的一些实施例中,目标应用在根据源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点的过程中,包括:目标应用将与运行日志具有相同代码行信息的目标节点,确定为第一匹配节点。之后,目标应用将初始有向图中经由第一匹配节点的目标节点,确定为第二匹配节点。最后,目标应用将第一匹配节点和第二匹配节点,确定为第一类节点。
以下对确定初始有向图中的目标节点中用于表征已执行代码的第一类节点的过程进行具体阐述。
步骤S305、笔记本电脑获取源代码文件对应的运行日志。
步骤S306、笔记本电脑根据源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点。
步骤S307、笔记本电脑显示目标有向图,目标有向图上的第一类节点和第二类节点以不同方式区分显示。
在本申请的一些实施例中,目标应用可以通过获取源代码文件对应的运行日志,确定初始有向图中的目标节点中用于表征已执行代码的第一类节点,进而生成并显示目标有向图。其中,第二类节点为初始有向图的目标节点中除第一类节点以外的节点。第二类节点用于定位异常代码。
在本申请的一些实施例中,目标应用在确定第一类节点的过程中,需要获取源代码文件对应的运行日志。其中,运行日志用于追踪并记录源代码文件在运行时所发生的事件。例如,该运行日志可以包括打印日志。用户可以通过打印日志来感知源代码文件在运行过程时的执行情况。
在一种可实现方式中,在目标应用获取打印日志的过程中,目标应用可以在遍历源代码文件时,利用日志解析器获取源代码文件对应的打印日志。并且,目标应用在生成并显示初始有向图之后,可以自动执行定位源代码文件中异常代码的过程。
示例性的,用户可以点击图10中的第四控件,以触发目标应用自动执行确定第一类节点的过程。参见图11,目标应用在确定第一类节点的过程中,可以提示第三信息,第三信息用于指示现在已开始定位源代码文件中的异常代码。其中,第三信息还对应有的第三提示控件,第三提示控件可以实现为文本“正在定位异常代码,请等待”。
在另一种可实现方式中,目标应用还可以响应于第二触发操作,获取源代码文件对应的打印日志。
具体地,源代码文件对应的打印日志可以预先存储在笔记本电脑中。用户可以在目标应用程序中将预存的打印日志打开,以使目标应用获取到源代码文件对应的打印日志。之后,目标应用在获取到源代码文件对应的运行日志之后,确定第一类节点。当然,目标应用在确定第一类节点的过程中,还可以显示源代码文件对应的运行日志。
示例性的,参见图12中的(A),初始有向图中还可包括第五控件,用户可以点击第五控件,来触发进入打开打印日志的详情页。也就是说,目标应用可以响应于针对第五控件的点击操作,获取源代码文件对应的打印日志。接着参见图12中的(B),打开打印日志的详情页包括磁盘中D盘对应的“日志”文件和第六控件。用户可以点击“日志”文件对应的文件图标,并点击第六控件,触发打开该“日志”文件。目标应用响应于用户针对第六控件的点击操作,获取源代码文件对应的“日志”文件。之后,目标应用根据该“日志”文件,确定第一类节点,以生成并显示目标有向图。
在本申请的一些实施例中,目标应用在确定第一类节点的过程中,将源代码文件对应的打印日志与初始有向图中的目标节点进行匹配。并将匹配的目标节点进行标记。由此可以根据未标记的目标节点对应的代码确定为异常代码。
示例性的,继续以上述源代码文件的编写内容为例,用户在输入数学分数为90且语文分数为100的场景下,该源代码文件对应的打印日志内容如下:
1 [java.main][9] 数学分数:90,语文分数:100
2 [java.main][20] 语文尖兵
3 [java.main][31] 该同学总共发了1个奖状
上述源代码文件的编写逻辑是:如果数学分数为100分,打印“数学尖兵”。如果语文分数为100分,则打印“语文尖兵”。如果数学分数大于90分,且语文分数大于90分,则打印“三好学生”。最后打印该同学总共发了多少奖状。基于上述该源代码文件对应的打印日志内容可以看出,并没有打印“三好学生”。由此,目标应用可以通过打印日志来对确定第一类节点,以定位到出现异常的代码位置。
在本申请的一些实施例中,目标应用将源代码文件对应的打印日志与初始有向图中的目标节点进行匹配的过程中,需要预先查找初始有向图中与打印日志中具有相同代码行信息的目标节点,并将其确定为第一匹配节点。
示例性的,基于上述打印日志,打印日志中的代码行信息分别为[9]、[20]以及[31]。那么,初始有向图中第一匹配节点包括“[类名.包名][9] 描述信息、[类名.包名][20] 描述信息、[类名.包名][31] 描述信息”,并将上述第一匹配节点进行标记。
并且,在查找至少一个第一匹配节点之后,查找初始有向图中经由至少一个第一匹配节点的目标节点,并将其确定为至少一个第二匹配节点。之后,将至第一匹配节点和第二匹配节点确定为第一类节点。
示例性的,首先经由上述第一匹配节点的第二匹配节点包括:“[类名.包名][15]条件判断”、“ [类名.包名][19] 条件判断”以及“[类名.包名][23] 条件判断”。其次,基于“[类名.包名][15] 条件判断”与“[类名.包名][19] 条件判断”之间的目标节点,可以看出目标节点“[类名.包名][15] 描述信息”和“[类名.包名][16] 描述信息”并不是第一匹配节点,说明在执行源代码文件的过程中,并没有满足该分支条件。因此,将未满足该分支条件对应的默认节点确定为第二匹配节点。
同理,基于“[类名.包名][23] 条件判断”与“[类名.包名][31] 描述信息”之间的目标节点,可以看出目标节点“[类名.包名][23] 描述信息和“[类名.包名][24] 描述信息”并不是第一匹配节点,说明在执行源代码文件的过程中,并没有满足该分支条件。因此,将未满足该分支条件对应的默认节点确定为第二匹配节点。
针对“[类名.包名][19]条件判断”与“[类名.包名][23]条件判断”之间的目标节点,可以看出目标节点“[类名.包名][20] 描述信息”为第一匹配节点,进而将“[类名.包名][19] 描述信息”确定为第二匹配节点。
在本申请的一些实施例中,可以将第一匹配节点、第二匹配节点与初始有向图中的其他目标节点进行区分。
在一种可实现方式中,本申请实施例可以采用指可伸缩矢量图形(ScalableVector Graphics,SVG)技术对第一匹配节点、第二匹配节点与初始有向图中的其他目标节点进行区分。例如,对上述目标节点进行线条颜色区分,线条粗细区分以及填充颜色区分等。最后,基于区分完成的初始有向图,生成源代码文件对应的目标有向图。
在另一种可实现方式中,本申请实施例还可以利用预设图案对第一匹配节点、第二匹配节点与初始有向图中的其他目标节点进行区分。示例性的,利用不同的预设图案对上述目标节点进行标记,以完成区分。例如,靠近第一匹配节点和第二匹配节点的空白处采用第一预设图案进行标记,而靠近其他目标节点的空白处采用第二预设图案进行标记。其中,预设图案可以是基础图形、卡通头像以及物品图案等。
示例性的,继续参见图10,用户对第五控件进行点击之后,目标应用响应于针对第五控件的点击操作,显示目标有向图。参见图13,笔记本电脑显示屏中显示有目标有向图,目标有向图中的第一匹配节点和第二匹配节点均为虚线标识。
在本申请的一些实施例中,用户可以根据源代码文件的打印信息和目标有向图,定位源代码中的异常代码。
示例性的,用户在输入学生的数学分数为90且语文分数为100时,发现最后确定打印该学生打印的奖状数量与真实情况不符。而基于打印逻辑,如果数学分数大于90分,且语文分数大于90分,则打印“三好学生”。这样,基于目标有向图中,查找目标节点“[类名.包名][24] 描述信息”即“ [Main.java][24] 三好学生”未与打印日志匹配,说明目标节点“[类名.包名][23] 描述信息”即“[Main.java][23]mathsScore>90&&languageScore>90”为异常代码。
在本申请的一些实施例中,目标应用可以响应于针对目标有向图中第二类节点的触发操作(如对第二类节点的点击操作),跳转至显示第二类节点在源代码文件中对应位置的代码行。进而完成代码精确定位。
也就是说,用户察觉到异常代码对应的目标节点之后,可以对目标节点进行点击,触发进入源代码文件中该目标节点对应的代码行,以完成整个异常代码定位过程。并且,用户还可以直接对异常代码进行修改。无需用户再次打开源代码文件查找异常代码对应的具体位置,简化了用户对整个定位过程的操作步骤,降低了定位异常代码的定位时间。进而提高用户的使用体验感。
综上,本申请实施例可以将源代码文件进行流程化,生成对应的初始有向图。同时还可以根据运行日志将初始有向图中的目标节点进行区分,生成包括异常代码的目标有向图。进而,根据目标有向图中的异常代码,跳转至源代码文件中异常代码对应的具体文字,完成整个定位过程。
并且,在相关技术中通常定位包括1000行代码行的源代码文件需要的定位时间为一个小时。而测试表明基于本申请实施例的定位过程,定位包括1000行代码行的源代码文件需要的定位时间为10分钟。对于逻辑错误类等问题,定位效率能够有效提高。
由此,本申请实施例可以自动地对源代码文件中的异常代码进行定位,相比于人工阅读源代码文件并分析异常代码,减少了工作量,提高了定位过程的定位速度。同时,人工在分析异常代码的过程中,需要凭借记忆对源代码文件进行关键字过滤,会出现记忆不全以及遗漏部分代码的情况。而本申请实施例是遍历源代码文件中的所有代码,进而提高了定位过程的定位精准度。
并且,本申请实施例还可以将整个定位过程可视化,让用户可以感知源代码文件中执行步骤以及执行步骤之间的逻辑关系,例如可以查看某一具体流程以及对应的子流程,提高用户的使用体验感。
在本申请的一些实施例中,上述基于java源代码文件的定位场景进行了详细的说明。当然本申请实施例包括但并不限于java、js、c、c++、python、go以及object-c等编程语言对应的源代码文件。同时,本申请实施例提供的代码处理方法还可以包括但并不限于应用在云原生(Cloud-native)应用开发、iOS®开发以及Android®开发等各种代码开发领域。
在一些方案中,可以对本申请的多个实施例进行组合,并实施组合后的方案。可选的,各方法实施例的流程中的一些操作任选地被组合,并且/或者一些操作的顺序任选地被改变。并且,各流程的步骤之间的执行顺序仅是示例性的,并不构成对步骤之间执行顺序的限制,各步骤之间还可以是其他执行顺序。并非旨在表明执行次序是可以执行这些操作的唯一次序。本领域的普通技术人员会想到多种方式来对本申请实施例所描述的操作进行重新排序。另外,应当指出的是,本申请某个实施例涉及的过程细节同样以类似的方式适用于其他实施例,或者,不同实施例之间可以组合使用。
此外,方法实施例中的某些步骤可等效替换成其他可能的步骤。或者,方法实施例中的某些步骤可以是可选的,在某些使用场景中可以删除。或者,可以在方法实施例中增加其他可能的步骤。
并且,各方法实施例之间可以单独实施,或结合起来实施。
本申请实施例提供一种代码处理装置,代码处理装置包括语法解析模块、日志解析模块、日志标记模块、代码有向图模块以及日志可视化模块。
其中,语法解析模块用于解析源代码文件以及生成源代码文件对应的语法信息。
日志解析模块用于解析源代码文件并生成源代码文件对应的运行日志。
日志标记模块用于根据源代码文件对应的运行日志,确定初始有向图中用于表征已执行代码的第一类节点。
代码有向图模块用于构建并生成源代码文件对应的初始有向图和目标有向图。
日志可视化模块用于显示源代码文件对应的运行日志。
本申请实施例还提供一种电子设备,比如可以是上述笔记本电脑,如图14所示,该电子设备可以包括一个或者多个处理器1410、存储器1420和通信接口1430。
其中,存储器1420、通信接口1430与处理器1410耦合。例如,存储器1420、通信接口1430与处理器1410可以通过总线1440耦合在一起。
其中,通信接口1430用于与其他设备进行数据传输。存储器1420中存储有计算机程序代码。计算机程序代码包括计算机指令,当计算机指令被处理器1410执行时,使得电子设备执行本申请实施例中的后台应用程序的控制方法。
其中,处理器1410可以是处理器或控制器,例如可以是中央处理器(CentralProcessing Unit,CPU),通用处理器,数字信号处理器(Digital Signal Processor,DSP),专用集成电路(Application-Specific Integrated Circuit,ASIC),现场可编程门阵列(Field Programmable Gate Array,FPGA)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器也可以是实现计算功能的组合,例如包含一种或多种微处理器组合,DSP和微处理器的组合等等。
其中,总线1440可以是外设部件互连标准(Peripheral ComponentInterconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。上述总线1440可以分为地址总线、数据总线、控制总线等。为便于表示,图14中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
本申请实施例还提供一种计算机可读存储介质,该计算机存储介质中存储有计算机程序代码,当上述处理器执行该计算机程序代码时,电子设备执行上述方法实施例中的相关方法步骤。
本申请实施例还提供了一种计算机程序产品,当该计算机程序产品在计算机上运行时,使得计算机执行上述方法实施例中的相关方法步骤。
其中,本申请提供的电子设备、计算机存储介质或者计算机程序产品均用于执行上文所提供的对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
通过以上实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其他的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其他的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read only memory,ROM)、随机存取存储器(randomaccess memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上内容,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (12)
1.一种代码处理方法,其特征在于,应用于电子设备,方法包括:
根据源代码文件对应的抽象语法树,建立所述源代码文件对应的代码索引表;其中,所述代码索引表用于表征所述源代码文件中每行代码的代码信息,所述每行代码的代码信息与所述抽象语法树中的节点对应;
根据所述代码索引表,查找所述源代码文件对应的第一类代码,所述第一类代码包括所述源代码文件中语法类型为方法申明类型的至少一个代码行;
根据所述代码索引表,遍历所述第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句;所述预设类型包括日志打印类型和分支判断类型;
根据所述至少一个子语句,确定至少一个目标节点;
基于所述至少一个目标节点,构建所述源代码文件对应的初始有向图;所述有向图用于表征所述源代码文件中执行步骤对应的执行流程;
显示所述源代码文件对应的所述初始有向图;
根据所述源代码文件对应的运行日志,确定所述初始有向图中的所述目标节点中用于表征已执行代码的第一类节点;所述运行日志用于记录所述源代码文件对应的执行状态信息;
显示目标有向图;所述目标有向图上的所述第一类节点和第二类节点以不同方式区分显示,所述第二类节点用于定位异常代码,所述第二类节点为所述初始有向图的目标节点中除所述第一类节点以外的节点。
2.根据权利要求1所述的方法,其特征在于,所述根据源代码文件对应的抽象语法树,建立所述源代码文件对应的代码索引表,包括:
检测到针对所述源代码文件的打开操作后,获取所述源代码文件,生成所述抽象语法树;
根据所述抽象语法树,建立所述源代码文件对应的代码索引表。
3.根据权利要求1所述的方法,其特征在于,所述代码索引表包括所述源代码文件中每行代码对应的语法类型和代码行信息;所述根据所述代码索引表,遍历所述第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句,包括:
根据所述代码索引表,获取所述第一类代码中的第一代码,所述第一代码为所述第一类代码的首个代码行;
基于所述代码索引表中每行代码对应的所述语法类型,依次遍历所述第一代码对应的至少一个一级语句,得到所述语法类型为预设类型的至少一个所述子语句;所述一级语句为所述第一代码对应的下一级子语句;
所述根据所述至少一个子语句,确定所述至少一个所述目标节点,包括:
若确定所述一级语句的语法类型是所述日志打印类型,则基于所述一级语句对应的代码行信息,建立所述一级语句对应的第一主体节点;
若确定所述一级语句的语法类型是所述分支判断类型,则基于所述一级语句对应的代码行信息,建立所述一级语句对应的第二主体节点和所述第二主体节点对应的至少一个正分支节点;所述正分支节点用于表征满足所述一级语句给定的条件对应的执行步骤;
根据所述第一主体节点,和/或,所述第二主体节点和所述正分支节点,确定所述目标节点。
4.根据权利要求3所述的方法,其特征在于,所述建立所述一级语句对应的第一主体节点,还包括:
在所述建立所述一级语句对应的第一主体节点之后,将有向数据结构的当前尾节点的节点路径指向所述第一主体节点,以建立完成所述第一主体节点;其中,所述尾节点为所述有向数据结构中已建立完成的节点路径中未指向其他节点的节点,所述尾节点初始为开始节点;
在所述建立所述一级语句对应的第二主体节点和所述第二主体节点对应的正分支节点之后,将所述尾节点的节点路径指向所述第二主体节点,以及将所述第二主体节点的节点路径指向所述正分支节点。
5.根据权利要求4所述的方法,其特征在于,所述建立所述一级语句对应的第二主体节点和所述第二主体节点对应的至少一个正分支节点,还包括:
遍历所述一级语句对应的二级语句;所述二级语句为所述一级语句对应的下一级子语句;
若遍历完成所述二级语句,则将所述尾节点的节点路径回退至所述第二主体节点;
若未检测到所述一级语句对应的负分支节点,则建立所述一级语句对应的默认节点;其中,所述负分支节点用于表征未满足所述一级语句给定的条件对应的执行步骤;
将所述尾节点的节点路径指向所述默认节点。
6.根据权利要求5所述的方法,其特征在于,所述代码索引表还包括所述源代码文件中每行代码对应的调用索引信息;所述基于所述代码索引表,遍历所述第一类代码对应的全部子语句,得到语法类型为预设类型的至少一个子语句,还包括:
若确定所述一级语句的语法类型是方法调用类型,则获取所述代码索引表中所述一级语句对应的所述调用索引信息;
根据所述调用索引信息,遍历所述第一类代码中的第二代码,得到语法类型为预设类型的至少一个子语句;所述第二代码为位于所述第一代码之后的代码行。
7.根据权利要求6所述的方法,其特征在于,所述基于所述至少一个目标节点,得到所述源代码文件对应的初始有向图,包括:
在遍历完成所述源代码文件中所述第一类代码对应的全部子语句之后,基于所述有向数据结构中所述目标节点和所述目标节点之间的节点路径,得到所述源代码文件对应的初始有向图。
8.根据权利要求1所述的方法,其特征在于,所述根据所述源代码文件对应的运行日志,确定所述初始有向图中的所述目标节点中用于表征已执行代码的第一类节点,包括:
将与所述运行日志具有相同代码行信息的所述目标节点,确定为第一匹配节点;
将所述初始有向图中经由所述第一匹配节点的所述目标节点,确定为第二匹配节点;
将所述第一匹配节点和所述第二匹配节点,确定为所述第一类节点。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
响应于针对所述目标有向图中所述第二类节点的触发操作,跳转至显示所述第二类节点在所述源代码文件中对应位置的代码行。
10.根据权利要求9所述的方法,其特征在于,所述方法还包括:
在目标应用启动完成之后,提示第一信息;所述第一信息用于指示是否触发针对所述源代码文件中异常代码的定位过程;和/或,
在检测到定位源代码文件中异常代码的触发指令之后,提示第二信息;所述第二信息用于指示已开始遍历所述源代码文件。
11.一种电子设备,其特征在于,所述电子设备包括存储器、一个或多个处理器;所述存储器与所述处理器耦合;其中,所述存储器中存储有计算机程序代码,所述计算机程序代码包括计算机指令,当所述计算机指令被所述处理器执行时,使得所述电子设备执行如权利要求1-10任一项所述的代码处理方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当所述指令在计算机上运行时,使得计算机可以执行如权利要求1-10任一项所述的代码处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310265361.8A CN115981711B (zh) | 2023-03-20 | 2023-03-20 | 一种代码处理方法及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310265361.8A CN115981711B (zh) | 2023-03-20 | 2023-03-20 | 一种代码处理方法及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115981711A CN115981711A (zh) | 2023-04-18 |
CN115981711B true CN115981711B (zh) | 2023-06-27 |
Family
ID=85963486
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310265361.8A Active CN115981711B (zh) | 2023-03-20 | 2023-03-20 | 一种代码处理方法及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115981711B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113918951A (zh) * | 2021-12-16 | 2022-01-11 | 北京微步在线科技有限公司 | 基于抽象语法树的恶意代码检测方法、装置及电子设备 |
CN114595449A (zh) * | 2020-11-19 | 2022-06-07 | 花瓣云科技有限公司 | 一种安全扫描方法及装置 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
FR2812479B1 (fr) * | 2000-07-28 | 2003-01-31 | Airsys Atm S A | Generateur universel de code informatique |
CN102385505B (zh) * | 2010-08-30 | 2013-03-20 | 北京理工大学 | 针对面向对象程序设计语言源代码的软件可视化方法 |
US9389984B2 (en) * | 2013-09-10 | 2016-07-12 | International Business Machines Corporation | Directing verification towards bug-prone portions |
CN104536883B (zh) * | 2014-12-05 | 2017-06-16 | 北京邮电大学 | 一种静态缺陷检测方法及其系统 |
CN106294156B (zh) * | 2016-08-11 | 2018-12-07 | 北京邮电大学 | 一种静态代码缺陷检测分析方法及装置 |
CN108664391B (zh) * | 2018-03-13 | 2021-03-23 | 北京邮电大学 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
US20200167787A1 (en) * | 2018-11-26 | 2020-05-28 | Bank Of America Corporation | System for anomaly detection and remediation based on dynamic directed graph network flow analysis |
US20200175174A1 (en) * | 2018-12-04 | 2020-06-04 | Sap Se | Vulnerability Context Graph |
CN111240982A (zh) * | 2020-01-09 | 2020-06-05 | 华东师范大学 | 源代码静态分析方法 |
CN111240687A (zh) * | 2020-01-09 | 2020-06-05 | 华东师范大学 | 源代码静态分析装置 |
KR102344496B1 (ko) * | 2020-02-28 | 2021-12-28 | 국방과학연구소 | 악성코드의 기능을 분석하는 방법 및 장치 |
GB202101977D0 (en) * | 2021-02-12 | 2021-03-31 | Taravu Ltd | Optimising computer program code |
CN113434397B (zh) * | 2021-06-23 | 2022-04-08 | 平安银行股份有限公司 | 任务系统的测试方法、装置、电子设备及存储介质 |
CN113793128A (zh) * | 2021-09-18 | 2021-12-14 | 北京京东振世信息技术有限公司 | 业务故障原因信息生成方法、装置、设备和计算机可读介质 |
CN114327495A (zh) * | 2021-12-27 | 2022-04-12 | 城云科技(中国)有限公司 | 基于ast的异常捕获代码注入方法、装置及其应用 |
CN114356703A (zh) * | 2021-12-27 | 2022-04-15 | 中国民航信息网络股份有限公司 | 一种根因分析方法及装置 |
-
2023
- 2023-03-20 CN CN202310265361.8A patent/CN115981711B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114595449A (zh) * | 2020-11-19 | 2022-06-07 | 花瓣云科技有限公司 | 一种安全扫描方法及装置 |
CN113918951A (zh) * | 2021-12-16 | 2022-01-11 | 北京微步在线科技有限公司 | 基于抽象语法树的恶意代码检测方法、装置及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN115981711A (zh) | 2023-04-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103518393B (zh) | 检测移动通信设备内容的系统和方法 | |
US10216377B2 (en) | Visual regression analysis | |
CN103959282B (zh) | 用于文本识别系统的选择性反馈 | |
US20140359573A1 (en) | Troubleshooting visuals and transient expressions in executing applications | |
EP3848855A1 (en) | Learning method and apparatus for intention recognition model, and device | |
CN109471805B (zh) | 资源测试方法及装置、存储介质、电子设备 | |
CN109871326A (zh) | 一种脚本录制的方法和装置 | |
CN106471476A (zh) | 用于对经优化代码的编辑并继续以及增强的经优化调试的技术 | |
CN106649084A (zh) | 函数调用信息的获取方法及装置、测试设备 | |
CN110221959B (zh) | 应用程序的测试方法、设备以及计算机可读介质 | |
EP2706459B1 (en) | Apparatus and method for validating a compiler for a reconfigurable processor | |
US10970449B2 (en) | Learning framework for software-hardware model generation and verification | |
CN108027721A (zh) | 用于使用控件来配置通用程序的技术 | |
CN109857645A (zh) | 一种针对应用程序的自动化测试方法及装置 | |
US8904247B2 (en) | Test pattern generation apparatus, test program generation apparatus, generation method, program, and test apparatus | |
CN117290694B (zh) | 问答系统评估方法、装置、计算设备及存储介质 | |
CN109918338B (zh) | 安全芯片操作系统测试装置 | |
KR20170009917A (ko) | 규약에 대한 애플리케이션으로부터의 그래픽 출력 데이터의 순응성 검출 | |
US10409623B2 (en) | Graphical user interface for localizing a computer program using context data captured from the computer program | |
CN115981711B (zh) | 一种代码处理方法及电子设备 | |
CN105607990A (zh) | 一种空指针崩溃的挖掘方法及装置 | |
CN116339818A (zh) | 代码变更类型的筛选方法、电子设备及可读存储介质 | |
CN113961534B (zh) | 生成日志文件的方法和电子设备 | |
CN113805861B (zh) | 基于机器学习的代码生成方法、代码编辑系统及存储介质 | |
CN113051153B (zh) | 一种应用软件漏洞扫描方法及相关设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |