CN113553059A - 局部变量查询方法、装置、服务器及存储介质 - Google Patents
局部变量查询方法、装置、服务器及存储介质 Download PDFInfo
- Publication number
- CN113553059A CN113553059A CN202110857966.7A CN202110857966A CN113553059A CN 113553059 A CN113553059 A CN 113553059A CN 202110857966 A CN202110857966 A CN 202110857966A CN 113553059 A CN113553059 A CN 113553059A
- Authority
- CN
- China
- Prior art keywords
- instruction
- local variable
- queried
- line
- compiled file
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 62
- 238000004590 computer program Methods 0.000 claims description 10
- 238000004806 packaging method and process Methods 0.000 claims description 8
- 230000002349 favourable effect Effects 0.000 abstract description 3
- 230000008569 process Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 9
- 230000006870 function Effects 0.000 description 6
- 230000004048 modification Effects 0.000 description 5
- 238000012986 modification Methods 0.000 description 5
- 238000007639 printing Methods 0.000 description 4
- 238000012545 processing Methods 0.000 description 3
- 230000001960 triggered effect Effects 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000011084 recovery Methods 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000006978 adaptation Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 150000001875 compounds Chemical class 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开关于一种局部变量查询方法、装置、服务器及存储介质,该方法包括:根据局部变量查询请求,确定待查询编译文件中的待查询指令行;生成与所述待查询指令行关联的局部变量获取指令;所述局部变量获取指令用于获取所述待查询指令行中的局部变量的变量信息;在所述待查询编译文件中的待查询指令行中,添加所述局部变量获取指令,得到新的编译文件;当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息。采用本方法,实现了在编译文件运行时,动态查询待查询指令行中的局部变量的变量信息的目的,有利于提高局部变量查询效率。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种局部变量查询方法、装置、服务器及存储介质。
背景技术
在程序开发过程中或者在线上排查问题时,经常需要对运行中的程序进行问题定位,其中一种常见的需求是查看程序中的某个局部变量在执行到某一行时的变量信息。
相关技术中,目前的局部变量查询方法,是通过在源代码中手动添加一段用于查看局部变量的变量信息的目标代码,并重新打包上线,当执行到目标代码时,则可以获取相应局部变量的变量信息;但是,通过手动添加代码并重新打包上线的过程比较繁琐,特别是在没有源代码时,还需要对代码进行反编译,导致局部变量查询效率较低。
发明内容
本公开提供一种局部变量查询方法、装置、服务器及存储介质,以至少解决相关技术中局部变量查询效率较低的问题。本公开的技术方案如下:
根据本公开实施例的第一方面,提供一种局部变量查询方法,包括:
根据局部变量查询请求,确定待查询编译文件中的待查询指令行;
生成与所述待查询指令行关联的局部变量获取指令;所述局部变量获取指令用于获取所述待查询指令行中的局部变量的变量信息;
在所述待查询编译文件中的待查询指令行中,添加所述局部变量获取指令,得到新的编译文件;
当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息。
在一示例性实施例中,所述生成与所述待查询指令行关联的局部变量获取指令,包括:
通过预先生成的局部变量查询文件,查询所述待查询编译文件中的指令行和局部变量之间的匹配关系,确定所述待查询指令行中的局部变量;
根据所述待查询指令行中的局部变量,生成用于获取所述局部变量的变量信息的局部变量获取指令,并将生成的所述局部变量获取指令,作为与所述待查询指令行关联的局部变量获取指令。
在一示例性实施例中,所述预先生成的局部变量查询文件通过下述方式得到:
获取所述待查询编译文件中的指令行和局部变量之间的匹配关系;
获取指令集;所述指令集用于根据所述匹配关系,生成与指令行关联的局部变量获取指令;
将所述指令集封装成预设格式的文件,并将所述文件作为所述预先生成的局部变量查询文件。
在一示例性实施例中,所述获取所述待查询编译文件中的指令行和局部变量之间的匹配关系,包括:
获取所述待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,以及所述待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系;
根据所述第一匹配关系和所述第二匹配关系,确定所述待查询编译文件中的指令行和局部变量之间的匹配关系。
在一示例性实施例中,所述当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息,包括:
当执行到所述新的编译文件中的所述待查询指令行时,触发与所述待查询指令行关联的所述局部变量获取指令;
通过所述局部变量获取指令查询所述待查询指令行所对应的信息,得到所述待查询指令行中的局部变量的变量信息。
在一示例性实施例中,所述根据局部变量查询请求,确定待查询编译文件中的待查询指令行,包括:
对局部变量查询请求进行解析,得到编译文件标识和指令行标识;
确定所述编译文件标识对应的编译文件,将所述编译文件作为所述待查询编译文件;
确定所述待查询编译文件中的所述指令行标识对应的指令行,将所述指令行作为所述待查询编译文件中的待查询指令行。
在一示例性实施例中,在获取所述待查询指令行中的局部变量的变量信息之后,还包括:
将所述待查询指令行中的局部变量的变量信息,发送至所述局部变量查询请求的请求终端,并将所述新的编译文件替换为所述待查询编译文件。
根据本公开实施例的第二方面,提供一种局部变量查询装置,包括:
确定单元,被配置为执行根据局部变量查询请求,确定待查询编译文件中的待查询指令行;
生成单元,被配置为执行生成与所述待查询指令行关联的局部变量获取指令;所述局部变量获取指令用于获取所述待查询指令行中的局部变量的变量信息;
添加单元,被配置为执行在所述待查询编译文件中的待查询指令行中,添加所述局部变量获取指令,得到新的编译文件;
获取单元,被配置为执行当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息。
在一示例性实施例中,所述生成单元,还被配置为执行通过预先生成的局部变量查询文件,查询所述待查询编译文件中的指令行和局部变量之间的匹配关系,确定所述待查询指令行中的局部变量;根据所述待查询指令行中的局部变量,生成用于获取所述局部变量的变量信息的局部变量获取指令,并将生成的所述局部变量获取指令,作为与所述待查询指令行关联的局部变量获取指令。
在一示例性实施例中,所述局部变量查询装置还包括封装单元,被配置为执行获取所述待查询编译文件中的指令行和局部变量之间的匹配关系;获取指令集;所述指令集用于根据所述匹配关系,生成与指令行关联的局部变量获取指令;将所述指令集封装成预设格式的文件,并将所述文件作为所述预先生成的局部变量查询文件。
在一示例性实施例中,所述封装单元,还被配置为执行获取所述待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,以及所述待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系;根据所述第一匹配关系和所述第二匹配关系,确定所述待查询编译文件中的指令行和局部变量之间的匹配关系。
在一示例性实施例中,所述获取单元,还被配置为执行当执行到所述新的编译文件中的所述待查询指令行时,触发与所述待查询指令行关联的所述局部变量获取指令;通过所述局部变量获取指令查询所述待查询指令行所对应的信息,得到所述待查询指令行中的局部变量的变量信息。
在一示例性实施例中,所述确定单元,还被配置为执行对局部变量查询请求进行解析,得到编译文件标识和指令行标识;确定所述编译文件标识对应的编译文件,将所述编译文件作为所述待查询编译文件;确定所述待查询编译文件中的所述指令行标识对应的指令行,将所述指令行作为所述待查询编译文件中的待查询指令行。
在一示例性实施例中,所述局部变量查询装置还包括替换单元,被配置为执行将所述待查询指令行中的局部变量的变量信息,发送至所述局部变量查询请求的请求终端,并将所述新的编译文件替换为所述待查询编译文件。
根据本公开实施例的第三方面,提供一种服务器,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如第一方面的任一项实施例中所述的局部变量查询方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,包括:当所述计算机可读存储介质中的指令由服务器的处理器执行时,使得所述服务器能够执行第一方面的任一项实施例中所述的局部变量查询方法。
根据本公开实施例的第五方面,提供一种计算机程序产品,所述程序产品包括计算机程序,所述计算机程序存储在可读存储介质中,设备的至少一个处理器从所述可读存储介质读取并执行所述计算机程序,使得设备执行第一方面任一项实施例中所述的局部变量查询方法。
本公开的实施例提供的技术方案至少带来以下有益效果:
根据局部变量查询请求,确定待查询编译文件中的待查询指令行;然后生成用于获取待查询指令行中的局部变量的变量信息的局部变量获取指令,作为与待查询指令行关联的局部变量获取指令;接着在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件;最后当执行到新的编译文件中的待查询指令行时,通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息;这样,通过在编译文件中自动添加局部变量获取指令,有利于在编译文件运行时,动态查询待查询指令行中的局部变量的变量信息,无需通过手动添加代码并重新打包上线,也无需对代码进行反编译,从而简化了局部变量查询过程,进一步提高了局部变量查询效率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
图1是根据一示例性实施例示出的一种局部变量查询方法的应用环境图。
图2是根据一示例性实施例示出的一种局部变量查询方法的流程图。
图3是根据一示例性实施例示出的局部变量查询文件的生成步骤的流程图。
图4是根据一示例性实施例示出的另一种局部变量查询方法的流程图。
图5是根据一示例性实施例示出的用户终端连接到目标进程的示意图。
图6是根据一示例性实施例示出的又一种局部变量查询方法的流程图。
图7是根据一示例性实施例示出的一种局部变量查询装置的框图。
图8是根据一示例性实施例示出的一种服务器的框图。
具体实施方式
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
本公开所提供的局部变量查询方法,可以应用于如图1所示的应用环境中。其中,终端110通过网络与服务器120进行交互。具体的,参考图1,服务器120根据终端110发送的局部变量查询请求,确定待查询编译文件中的待查询指令行;生成与待查询指令行关联的局部变量获取指令;局部变量获取指令用于获取待查询指令行中的局部变量的变量信息;在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件;当执行到新的编译文件中的待查询指令行时,通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息;此外,服务器120还可以将待查询指令行中的局部变量的变量信息返回至终端110,通过终端110展示待查询指令行中的局部变量的变量信息。其中,终端110可以但不限于是各种个人计算机、笔记本电脑、智能手机和平板电脑,服务器120可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
图2是根据一示例性实施例示出的一种局部变量查询方法的流程图,如图2所示,局部变量查询方法用于如图1所示的服务器中,包括以下步骤:
在步骤S210中,根据局部变量查询请求,确定待查询编译文件中的待查询指令行。
其中,局部变量,也称内部变量,是指在一个函数内部或复合语句内部定义的变量,具有对应的变量信息,比如变量名称、变量值;需要说明的是,在编译文件执行过程中,局部变量的变量值可能是会变化的。
其中,局部变量查询请求是指用于查询指令行中的局部变量的变量信息的请求,比如用于查询第4行代码行中的局部变量的变量信息,具体可以通过终端生成。
其中,待查询编译文件是指需要查询局部变量的编译文件;编译文件是指字节码,比如Java字节码,具体是指程序最终运行的代码,由源代码(即开发者编写的代码)经过编译器编译后得到;例如,Java源代码经过Java编译器编译后得到Java字节码。编译文件中包含有源代码的信息,比如局部变量的名称、局部变量的表示范围、代码的行号等。
其中,待查询指令行是指待查询编译文件中需要查看局部变量的变量信息的指令行,比如代码行,具体是指第几行代码行。需要说明的是,一个指令行中可以包含多个局部变量。
具体地,服务器通过请求解析指令,对局部变量查询请求进行解析,得到需要查询的局部变量的位置信息;根据需要查询的局部变量的位置信息,确定需要查询的局部变量所在的目标编译文件中的目标指令行,作为待查询编译文件中的待查询指令行。
举例说明,用户在终端的局部变量查询界面上输入编译文件名称、代码行号,并点击查询按钮,触发局部变量查询操作,终端响应用户的局部变量查询操作,生成局部变量查询请求,并将局部变量查询请求发送至对应的服务器;服务器对接收到的局部变量查询请求进行解析,得到编译文件名称和代码行号;根据编译文件名称和代码行号,确定待查询编译文件中的待查询指令行。
在步骤S220中,生成与待查询指令行关联的局部变量获取指令;局部变量获取指令用于获取待查询指令行中的局部变量的变量信息。
其中,与待查询指令行关联的局部变量获取指令,是一种用于在执行到相应的待查询指令行时,自动获取待查询指令行中的局部变量的变量信息的指令。
具体地,服务器通过加载用于生成局部变量获取指令的文件,确定查询指令行中的局部变量,并生成用于获取待查询指令行中的局部变量的变量信息的指令,作为与待查询指令行关联的局部变量获取指令。
在步骤S230中,在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件。
其中,新的编译文件是指添加局部变量获取指令后的待查询编译文件。
具体地,服务器获取局部变量获取指令在待查询编译文件中的待查询指令行中的位置标签,并按照位置标签,将局部变量获取指令添加到待查询编译文件中的待查询指令行中的对应位置,得到更新后的待查询编译文件,作为新的编译文件。这样,无需通过手动添加代码并重新打包上线,也无需对代码进行反编译,从而简化了局部变量查询过程,进一步提高了局部变量查询效率。
举例说明,服务器将局部变量获取指令添加到待查询编译文件中的待查询指令行中的末端,得到新的编译文件。
进一步地,服务器还可以通过利用字节码修改工具(比如asm、javassist等),在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件。
在步骤S240中,当执行到新的编译文件中的待查询指令行时,通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息。
具体地,服务器当执行到新的编译文件中的待查询指令行时,自动触发与待查询指令行关联的局部变量获取指令,以通过该局部变量获取指令获取待查询指令行中的局部变量的变量信息;这样,整个局部变量信息获取过程中,无需修改程序启动命令,也无需暂停程序,从而实现了在编译文件运行时,动态查询待查询指令行中的局部变量的变量信息的目的,进而提高了局部变量获取效率。
进一步地,在获取待查询指令行中的局部变量的变量信息之后,服务器还可以根据待查询指令行中的局部变量的变量信息,确定待查询指令行是否出现异常,进而确定是否对待查询编译文件进行修复。
上述局部变量查询方法中,根据局部变量查询请求,确定待查询编译文件中的待查询指令行;然后生成用于获取待查询指令行中的局部变量的变量信息的局部变量获取指令,作为与待查询指令行关联的局部变量获取指令;接着在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件;最后当执行到新的编译文件中的待查询指令行时,通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息;这样,通过在编译文件中自动添加局部变量获取指令,有利于在编译文件运行时,动态查询待查询指令行中的局部变量的变量信息,无需通过手动添加代码并重新打包上线,也无需对代码进行反编译,从而简化了局部变量查询过程,进一步提高了局部变量查询效率。
在一示例性实施例中,上述步骤S220,生成与待查询指令行关联的局部变量获取指令,具体包括:通过预先生成的局部变量查询文件,查询待查询编译文件中的指令行和局部变量之间的匹配关系,确定待查询指令行中的局部变量;根据待查询指令行中的局部变量,生成用于获取局部变量的变量信息的局部变量获取指令,并将生成的局部变量获取指令,作为与待查询指令行关联的局部变量获取指令。
其中,预先生成的局部变量查询文件是一种用于生成与待查询指令行关联的局部变量获取指令的文件,比如jar文件,例如localvariable-inspect-agent.jar;在实际场景中,局部变量查询文件是指查询局部变量的变量信息的程序文件。
其中,待查询编译文件中的指令行和局部变量之间的匹配关系,是指每个指令行与局部变量的对应关系,用于表示每个指令行对应一个或者多个局部变量。比如,第4行指令行对应局部变量A、局部变量B和局部变量C,第5行指令行对应局部变量D、局部变量E和局部变量F,第6行指令行对应局部变量G、局部变量H和局部变量I。
具体地,在确定待查询编译文件中的待查询指令行之后,服务器加载预先生成的局部变量查询文件,并根据预先生成的局部变量查询文件,基于待查询编译文件中的指令行和局部变量之间的匹配关系,确定与待查询指令行相同的指令行所对应的局部变量,作为待查询指令行中的局部变量;根据预先生成的局部变量查询文件,自动生成用于获取待查询指令行中的局部变量的变量信息的局部变量获取指令,并将该局部变量获取指令作为与待查询指令行关联的局部变量获取指令。
举例说明,假设待查询编译文件中的待查询指令行为编译文件a中的第4行指令行,而编译文件a中的第4行指令行对应局部变量A、局部变量B、局部变量C,说明第4行指令行中的局部变量包括局部变量A、局部变量B、局部变量C,则通过服务器加载预先生成的局部变量查询文件,得到用于获取第4行指令行中的局部变量A、局部变量B、局部变量C的变量信息的局部变量获取指令,作为与第4行指令行关联的局部变量获取指令。
本公开实施例提供的技术方案,通过预先生成的局部变量查询文件,自动生成与待查询指令行关联的局部变量获取指令,有利于后续直接在待查询编译文件中的待查询指令行中添加局部变量获取指令,无需通过手动添加代码并重新打包上线,也无需对代码进行反编译,更无需暂停程序,从而节省了查询局部变量的时间,进一步提高了局部变量查询效率。
在一示例性实施例中,如图3所示,预先生成的局部变量查询文件具体通过下述步骤实现:
在步骤S310中,获取待查询编译文件中的指令行和局部变量之间的匹配关系。
具体地,服务器通过匹配关系获取指令,从待查询编译文件中获取待查询编译文件中的指令行和局部变量之间的匹配关系。
在步骤S320中,获取指令集;指令集用于根据匹配关系,生成与指令行关联的局部变量获取指令。
其中,根据匹配关系,生成与指令行关联的局部变量获取指令,是指根据匹配关系确定指令行中的局部变量,进而生成用于获取指令行中的局部变量的变量信息的指令,作为与指令行关联的局部变量获取指令。
其中,指令集是指用于根据匹配关系,生成与指令行关联的局部变量获取指令的指令集,具体是指能够实现根据匹配关系,生成与指令行关联的局部变量获取指令的功能的所有指令的集合;在实际场景中,指令集是指能够实现根据匹配关系,生成与指令行关联的局部变量获取指令的功能的整份程序代码。
具体地,服务器通过指令编辑工具,得到能够实现根据匹配关系生成与指令行关联的局部变量获取指令的功能的所有指令,并将这些指令进行组合,得到指令集,作为用于根据匹配关系生成与指令行关联的局部变量获取指令的指令集。
举例说明,服务器获取能够实现根据匹配关系生成与指令行关联的局部变量获取指令的功能的整份程序代码,作为用于根据匹配关系生成与指令行关联的局部变量获取指令的指令集。
在步骤S330中,将指令集封装成预设格式的文件,并将文件作为预先生成的局部变量查询文件。
其中,预设格式是指jar文件格式。
具体地,服务器将用于根据匹配关系生成与指令行关联的局部变量获取指令的指令集进行封装,得到预设格式的文件,比如jar文件;并将预设格式的文件,作为预先生成的局部变量查询文件。
本公开实施例提供的技术方案,通过生成局部变量查询文件,有利于后续通过预先生成的局部变量查询文件,自动生成与待查询指令行关联的局部变量获取指令,有利于简化后续的局部变量获取流程,从而提高了局部变量查询效率。
在一示例性实施例中,上述步骤S310,获取待查询编译文件中的指令行和局部变量之间的匹配关系,具体包括:获取待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,以及待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系;根据第一匹配关系和第二匹配关系,确定待查询编译文件中的指令行和局部变量之间的匹配关系。
其中,待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,是指每行指令行和字节码指令范围的对应关系,用于表示每行指令行对应多个字节码指令。比如,第4行指令行对应字节码指令a、字节码指令b、字节码指令c,第5行指令行对应字节码指令d、字节码指令e、字节码指令f、字节码指令g。
需要说明的是,每一行源代码都会编译成相应指令行的一段字节码,相应指令行的一段字节码中包括多个字节码指令,比如第一个字节码指令、第二个字节码指令······最后一个字节码指令;说明相应指令行的一段字节码对应一个字节码指令范围,进而说明每行指令行都对应一个字节码指令范围。
其中,待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系,是指每个局部变量和字节码指令范围的对应关系,用于表示每个局部变量对应多个字节码指令;比如,局部变量A对应字节码指令a、字节码指令b、字节码指令c,局部变量B对应字节码指令d、字节码指令e、字节码指令f、字节码指令g。
需要说明的是,待查询编译文件的信息中包含每个局部变量的范围,每个局部变量的范围也称为字节码指令的范围,说明每个局部变量对应一个字节码指令范围。
具体地,服务器根据待查询编译文件中的每一行指令行中的字节码指令,确定每一行指令行对应的字节码指令范围,根据每一行指令行对应的字节码指令范围,确定待查询编译文件的指令行和字节码指令范围之间的第一匹配关系;服务器根据待查询编译文件中的每一个局部变量的范围,确定每一个局部变量对应的字节码指令范围,根据每一个局部变量对应的字节码指令范围,确定待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系;根据第一匹配关系和第二匹配关系,确定每一个指令行对应的局部变量,根据每一个指令行对应的局部变量,确定待查询编译文件中的指令行和局部变量之间的匹配关系。
举例说明,假设第4行指令行对应的字节码指令范围包括字节码指令a、字节码指令b、字节码指令c,第5行指令行对应的字节码指令范围包括字节码指令d、字节码指令e、字节码指令f,第6行指令行对应的字节码指令范围包括字节码指令g、字节码指令h、字节码指令i,局部变量A对应的字节码指令范围包括字节码指令c、字节码指令f、字节码指令g,局部变量B对应的字节码指令范围包括字节码指令a、字节码指令d、字节码指令n,说明第4行指令行对应局部变量A和局部变量B,第5行指令行对应局部变量A和局部变量B,第6行指令行对应局部变量A;通过这种方法,可以得到待查询编译文件中的指令行和局部变量之间的匹配关系。
本公开实施例提供的技术方案,通过获取待查询编译文件中的指令行和局部变量之间的匹配关系,有利于后续获取用于根据匹配关系生成与指令行关联的局部变量获取指令的指令集,进而得到用于生成局部变量获取指令的局部变量查询文件。
在一示例性实施例中,上述步骤S240,当执行到新的编译文件中的待查询指令行时,通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息,具体包括:当执行到新的编译文件中的待查询指令行时,触发与待查询指令行关联的局部变量获取指令;通过局部变量获取指令查询待查询指令行所对应的信息,得到待查询指令行中的局部变量的变量信息。
举例说明,当执行到新的编译文件中的第4行指令行时,自动触发与第4行指令行关联的局部变量获取指令,该局部变量获取指令用于获取第4行指令行中的局部变量A和局部变量B的变量信息;接着,通过与第4行指令行关联的局部变量获取指令,查询第4行指令行的相关信息,得到第4行指令行中的局部变量A和局部变量B的变量信息。
本公开实施例提供的技术方案,当执行到新的编译文件中的待查询指令行时,自动通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息,实现了在编译文件运行时,动态查询待查询指令行中的局部变量的变量信息的目的,整个查询过程无需暂停程序,从而提高了局部变量查询效率。
在一示例性实施例中,上述步骤S210,根据局部变量查询请求,确定待查询编译文件中的待查询指令行,具体包括:对局部变量查询请求进行解析,得到编译文件标识和指令行标识;确定编译文件标识对应的编译文件,将编译文件作为待查询编译文件;确定待查询编译文件中的指令行标识对应的指令行,将指令行作为待查询编译文件中的待查询指令行。
其中,编译文件标识是指编译文件标识的标识信息,比如类名;指令行标识是指指令行的标识信息,比如行号。
具体地,服务器通过请求解析指令,对局部变量查询请求进行解析,得到编译文件标识和指令行标识;从编译文件集合中,确定出文件标识与编译文件标识相同的编译文件,并将其作为待查询编译文件;从待查询编译文件中,确定与指令行标识对应的指令行,并将其作为待查询编译文件中的待查询指令行。
举例说明,终端通过利用jvm的attach机制,连接到执行程序的Java进程,接着通过Java进程根据终端传递的参数,比如需要查看局部变量的类的名字和对应的行数的信息,确定待查询编译文件中的待查询指令行;例如要查看TargetClass的第4行的局部变量的局部信息,则通过终端传入参数TargetClass:4。
本公开实施例提供的技术方案,通过局部变量查询请求,确定待查询编译文件中的待查询指令行,有利于后续通过预先生成的局部变量查询文件,生成用于获取待查询编译文件中的待查询指令行中的局部变量的变量信息的局部变量获取指令。
在一示例性实施例中,上述步骤S240,在获取待查询指令行中的局部变量的变量信息之后,还包括:将待查询指令行中的局部变量的变量信息,发送至局部变量查询请求的请求终端,并将新的编译文件替换为待查询编译文件。
具体地,服务器根据局部变量查询请求中的终端标识,确定局部变量查询请求的请求终端,并将待查询指令行中的局部变量的变量信息,发送至局部变量查询请求的请求终端,通过请求终端的终端界面展示待查询指令行中的局部变量的变量信息,便于供用户查看,并进行问题定位。
进一步地,当通过服务器将待查询指令行中的局部变量的变量信息,发送至局部变量查询请求的请求终端时,说明待查询指令行中的局部变量的变量信息查询结束,无需再查询编译文件执行到某一行指令行时对应的局部变量的变量信息,则将新的编译文件替换为在添加局部变量获取指令之前所保存的待查询编译文件,以恢复最初的待查询编译文件。
本公开实施例提供的技术方案,在将待查询指令行中的局部变量的变量信息,发送至局部变量查询请求的请求终端之后,直接将新的编译文件替换为最初保存的待查询编译文件,无需手动修改成原来的代码并打包上线,从而简化了编译文件的恢复过程,进而提高了编译文件的恢复效率。
图4是根据一示例性实施例示出的一种局部变量查询方法的流程图,如图2所示,局部变量查询方法用于如图1所示的服务器中,包括以下步骤:
在步骤S410中,获取待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,以及待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系。
在步骤S420中,根据第一匹配关系和第二匹配关系,确定待查询编译文件中的指令行和局部变量之间的匹配关系。
在步骤S430中,获取指令集;指令集用于根据匹配关系,生成与指令行关联的局部变量获取指令。
在步骤S440中,将指令集封装成预设格式的文件,并将文件作为预先生成的局部变量查询文件。
在步骤S450中,对局部变量查询请求进行解析,得到编译文件标识和指令行标识;确定编译文件标识对应的编译文件,将编译文件作为待查询编译文件;确定待查询编译文件中的指令行标识对应的指令行,将指令行作为待查询编译文件中的待查询指令行。
在步骤S460中,通过预先生成的局部变量查询文件,生成用于获取待查询指令行中的局部变量的变量信息的局部变量获取指令,作为与待查询指令行关联的局部变量获取指令。
在步骤S470中,在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件。
在步骤S480中,当执行到新的编译文件中的待查询指令行时,触发与待查询指令行关联的局部变量获取指令;通过局部变量获取指令查询待查询指令行所对应的信息,得到待查询指令行中的局部变量的变量信息。
在步骤S490中,将待查询指令行中的局部变量的变量信息,发送至局部变量查询请求的请求终端,并将新的编译文件替换为待查询编译文件。
上述局部变量查询方法,通过在编译文件中自动添加局部变量获取指令,有利于在编译文件运行时,动态查询待查询指令行中的局部变量的变量信息,无需通过手动添加代码并重新打包上线,也无需对代码进行反编译,从而简化了局部变量查询过程,进一步提高了局部变量查询效率。
在一示例性实施例中,为了更清晰阐明本公开实施例提供的技术方案,以下将详细阐述本公开的局部变量查询方法的一个应用实例,该应用实例利用字节码修改工具对类进行动态修改,以便实现动态获取局部变量信息的功能;其具体内容如下:
收集对应的类的所有的方法中的局部变量范围,即每个局部变量和源代码行号的对应关系。在Java字节码中,有对应的源代码行数和这行代码对应的字节码指令的映射关系;方法的信息中会包含每个局部变量的范围,这个范围就是字节码指令的范围;根据源代码行号到字节码指令的范围,以及局部变量到字节码指令的范围,可以得到局部变量到源代码行号的范围。
修改方法字节信息,植入变量信息打印逻辑。例如,如果我们要获取程序在执行到line4这一行时的局部变量信息,则会判断当前类的所有局部变量,判断哪些局部变量在line4这一行可见(局部变量对应的可见范围包含Line4),则收集对应的变量名和对应的值;然后通过字节码修改工具,调用打印方法打印这个变量的变量名和值的信息。需要说明的是,上面的逻辑会打包成一个jar文件,例如localvariable-inspect-agent.jar。
获取执行到某一行代码时对应的局部变量的变量信息。例如,参考图5,用户终端利用jvm的attach机制,连接到对应的Java进程,attach后可以加载我们预先制定的jar文件(比如localvariable-inspect-agent.jar),attach时可以传递参数,传递的就是我们要查看的类的名字和对应的行数的信息,例如要查看TargetClass的第4行,则传入TargetClass:4。
举例说明,参考图6,用户通过attach agent(连接机制),传入类和行数,作为参数。接着,对类进行重定义,比如获取所有局部变量信息,在行号对应的方法内,修改方法内容,打印当前行能看到的所有局部变量的名字和值。这个类下次执行到对应的行数时,会自动执行上述逻辑代码,从而打印能看到的局部变量的值。
当不再需要获取执行到某一行代码时对应的局部变量信息后,则只需要将对应的类进行字节码重置就可,就可以恢复原样。
本公开实施例提供的技术方案,能够动态查看运行中的程序,在某个方法内某一行时,各个局部变量的值;不会有调试方案的修改启动参数、阻塞程序的问题,也解决了手动添加日志的操作繁琐的问题。
应该理解的是,虽然图2-4的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2-4中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
图7是根据一示例性实施例示出的一种局部变量查询装置的框图。参照图7,该装置包括确定单元710,生成单元720,添加单元730和获取单元740。
确定单元710,被配置为执行根据局部变量查询请求,确定待查询编译文件中的待查询指令行。
生成单元720,被配置为执行生成与待查询指令行关联的局部变量获取指令;局部变量获取指令用于获取待查询指令行中的局部变量的变量信息。
添加单元730,被配置为执行在待查询编译文件中的待查询指令行中,添加局部变量获取指令,得到新的编译文件。
获取单元740,被配置为执行当执行到新的编译文件中的待查询指令行时,通过局部变量获取指令,获取待查询指令行中的局部变量的变量信息。
在一示例性实施例中,生成单元720,还被配置为执行通过预先生成的局部变量查询文件,查询待查询编译文件中的指令行和局部变量之间的匹配关系,确定待查询指令行中的局部变量;根据待查询指令行中的局部变量,生成用于获取局部变量的变量信息的局部变量获取指令,并将生成的局部变量获取指令,作为与待查询指令行关联的局部变量获取指令。
在一示例性实施例中,局部变量查询装置还包括封装单元,被配置为执行获取待查询编译文件中的指令行和局部变量之间的匹配关系;获取指令集;指令集用于根据匹配关系,生成与指令行关联的局部变量获取指令;将指令集封装成预设格式的文件,并将文件作为预先生成的局部变量查询文件。
在一示例性实施例中,封装单元,还被配置为执行获取待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,以及待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系;根据第一匹配关系和第二匹配关系,确定待查询编译文件中的指令行和局部变量之间的匹配关系。
在一示例性实施例中,获取单元740,还被配置为执行当执行到新的编译文件中的待查询指令行时,触发与待查询指令行关联的局部变量获取指令;通过局部变量获取指令查询待查询指令行所对应的信息,得到待查询指令行中的局部变量的变量信息。
在一示例性实施例中,确定单元710,还被配置为执行对局部变量查询请求进行解析,得到编译文件标识和指令行标识;确定编译文件标识对应的编译文件,将编译文件作为待查询编译文件;确定待查询编译文件中的指令行标识对应的指令行,将指令行作为待查询编译文件中的待查询指令行。
在一示例性实施例中,局部变量查询装置还包括替换单元,被配置为执行将待查询指令行中的局部变量的变量信息,发送至局部变量查询请求的请求终端,并将新的编译文件替换为待查询编译文件。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
图8是根据一示例性实施例示出的一种用于执行上述局部变量查询方法的设备800的框图。例如,设备800可以为一服务器。参照图8,设备800包括处理组件820,其进一步包括一个或多个处理器,以及由存储器822所代表的存储器资源,用于存储可由处理组件820的执行的指令,例如应用程序。存储器822中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件820被配置为执行指令,以执行上述局部变量查询方法。
设备800还可以包括一个电源组件824被配置为执行设备800的电源管理,一个有线或无线网络接口826被配置为将设备800连接到网络,和一个输入输出(I/O)接口828。设备800可以操作基于存储在存储器822的操作系统,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
在示例性实施例中,还提供了一种包括指令的计算机可读存储介质,例如包括指令的存储器822,上述指令可由设备800的处理器执行以完成上述局部变量查询方法。计算机可读存储介质可以是非临时性计算机可读存储介质,例如,非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
在示例性实施例中,还提供一种计算机程序产品,该程序产品包括计算机程序,该计算机程序存储在可读存储介质中,设备的至少一个处理器从该可读存储介质读取并执行该计算机程序,使得设备执行本公开的任一项实施例中所述的局部变量查询方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (10)
1.一种局部变量查询方法,其特征在于,包括:
根据局部变量查询请求,确定待查询编译文件中的待查询指令行;
生成与所述待查询指令行关联的局部变量获取指令;所述局部变量获取指令用于获取所述待查询指令行中的局部变量的变量信息;
在所述待查询编译文件中的待查询指令行中,添加所述局部变量获取指令,得到新的编译文件;
当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息。
2.根据权利要求1所述的局部变量查询方法,其特征在于,所述生成与所述待查询指令行关联的局部变量获取指令,包括:
通过预先生成的局部变量查询文件,查询所述待查询编译文件中的指令行和局部变量之间的匹配关系,确定所述待查询指令行中的局部变量;
根据所述待查询指令行中的局部变量,生成用于获取所述局部变量的变量信息的局部变量获取指令,并将生成的所述局部变量获取指令,作为与所述待查询指令行关联的局部变量获取指令。
3.根据权利要求2所述的局部变量查询方法,其特征在于,所述预先生成的局部变量查询文件通过下述方式得到:
获取所述待查询编译文件中的指令行和局部变量之间的匹配关系;
获取指令集;所述指令集用于根据所述匹配关系,生成与指令行关联的局部变量获取指令;
将所述指令集封装成预设格式的文件,并将所述文件作为所述预先生成的局部变量查询文件。
4.根据权利要求3所述的局部变量查询方法,其特征在于,所述获取所述待查询编译文件中的指令行和局部变量之间的匹配关系,包括:
获取所述待查询编译文件的指令行和字节码指令范围之间的第一匹配关系,以及所述待查询编译文件的局部变量和字节码指令范围之间的第二匹配关系;
根据所述第一匹配关系和所述第二匹配关系,确定所述待查询编译文件中的指令行和局部变量之间的匹配关系。
5.根据权利要求1所述的局部变量查询方法,其特征在于,所述当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息,包括:
当执行到所述新的编译文件中的所述待查询指令行时,触发与所述待查询指令行关联的所述局部变量获取指令;
通过所述局部变量获取指令查询所述待查询指令行所对应的信息,得到所述待查询指令行中的局部变量的变量信息。
6.根据权利要求1所述的局部变量查询方法,其特征在于,所述根据局部变量查询请求,确定待查询编译文件中的待查询指令行,包括:
对局部变量查询请求进行解析,得到编译文件标识和指令行标识;
确定所述编译文件标识对应的编译文件,将所述编译文件作为所述待查询编译文件;
确定所述待查询编译文件中的所述指令行标识对应的指令行,将所述指令行作为所述待查询编译文件中的待查询指令行。
7.一种局部变量查询装置,其特征在于,包括:
确定单元,被配置为执行根据局部变量查询请求,确定待查询编译文件中的待查询指令行;
生成单元,被配置为执行生成与所述待查询指令行关联的局部变量获取指令;所述局部变量获取指令用于获取所述待查询指令行中的局部变量的变量信息;
添加单元,被配置为执行在所述待查询编译文件中的待查询指令行中,添加所述局部变量获取指令,得到新的编译文件;
获取单元,被配置为执行当执行到所述新的编译文件中的所述待查询指令行时,通过所述局部变量获取指令,获取所述待查询指令行中的局部变量的变量信息。
8.一种服务器,其特征在于,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如权利要求1至6中任一项所述的局部变量查询方法。
9.一种计算机可读存储介质,其特征在于,当所述计算机可读存储介质中的指令由服务器的处理器执行时,使得所述服务器能够执行如权利要求1至6中任一项所述的局部变量查询方法。
10.一种计算机程序产品,包括计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6任一项所述的局部变量查询方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110857966.7A CN113553059B (zh) | 2021-07-28 | 2021-07-28 | 局部变量查询方法、装置、服务器及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110857966.7A CN113553059B (zh) | 2021-07-28 | 2021-07-28 | 局部变量查询方法、装置、服务器及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113553059A true CN113553059A (zh) | 2021-10-26 |
CN113553059B CN113553059B (zh) | 2024-04-30 |
Family
ID=78133081
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110857966.7A Active CN113553059B (zh) | 2021-07-28 | 2021-07-28 | 局部变量查询方法、装置、服务器及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113553059B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109783342A (zh) * | 2017-11-10 | 2019-05-21 | 华为技术有限公司 | 脚本调试方法、设备及计算机存储介质 |
CN109933326A (zh) * | 2017-12-15 | 2019-06-25 | 北京奇虎科技有限公司 | 改写代码的编译方法、装置及相应终端 |
CN110225029A (zh) * | 2019-06-10 | 2019-09-10 | 北京达佳互联信息技术有限公司 | 注入攻击检测方法、装置、服务器及存储介质 |
CN111339035A (zh) * | 2020-02-21 | 2020-06-26 | 苏宁云计算有限公司 | 一种目标数据的查询方法、装置、计算机设备和存储介质 |
CN112948418A (zh) * | 2021-02-25 | 2021-06-11 | 平安普惠企业管理有限公司 | 动态查询方法、装置、设备及存储介质 |
-
2021
- 2021-07-28 CN CN202110857966.7A patent/CN113553059B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109783342A (zh) * | 2017-11-10 | 2019-05-21 | 华为技术有限公司 | 脚本调试方法、设备及计算机存储介质 |
CN109933326A (zh) * | 2017-12-15 | 2019-06-25 | 北京奇虎科技有限公司 | 改写代码的编译方法、装置及相应终端 |
CN110225029A (zh) * | 2019-06-10 | 2019-09-10 | 北京达佳互联信息技术有限公司 | 注入攻击检测方法、装置、服务器及存储介质 |
CN111339035A (zh) * | 2020-02-21 | 2020-06-26 | 苏宁云计算有限公司 | 一种目标数据的查询方法、装置、计算机设备和存储介质 |
CN112948418A (zh) * | 2021-02-25 | 2021-06-11 | 平安普惠企业管理有限公司 | 动态查询方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN113553059B (zh) | 2024-04-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112394942B (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
CN109032631B (zh) | 应用程序补丁包获取方法、装置、计算机设备及存储介质 | |
WO2016177341A1 (zh) | 接口调用方法、装置及终端 | |
CN109597618B (zh) | 程序开发方法、装置、计算机设备及存储介质 | |
CN107797823B (zh) | 业务规则管理方法、装置、存储介质和计算机设备 | |
CN110928548B (zh) | 一种数据处理方法以及设备 | |
CN111158741A (zh) | 监控业务模块对第三方类库依赖关系变化的方法及装置 | |
CN110750315B (zh) | Android系统中的类加载方法、装置、设备和存储介质 | |
CN112769706B (zh) | 组件化路由方法及系统 | |
CN108595178B (zh) | 一种基于hook的数据采集方法、装置及设备 | |
CN112019609A (zh) | 基于物联网的设备监控方法、装置、设备及计算机介质 | |
CN110955434B (zh) | 软件开发包处理方法、装置、计算机设备和存储介质 | |
CN115390944A (zh) | 一种算法服务调用方法、装置、电子设备及存储介质 | |
CN114253587A (zh) | 应用程序更新方法、装置、电子设备及可读存储介质 | |
CN113296752A (zh) | 生成api文档的方法、系统、设备及存储介质 | |
CN111488144A (zh) | 一种数据处理方法以及设备 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
CN114115884A (zh) | 一种编程服务的管理方法以及相关装置 | |
CN112035178A (zh) | 一种应用启动方法、装置和存储介质 | |
CN114860204B (zh) | 程序处理、运行方法、装置、终端、智能卡及存储介质 | |
CN116560621A (zh) | 基板管理控制器芯片适配方法、系统、设备和介质 | |
CN113495723B (zh) | 一种调用功能组件的方法、装置及存储介质 | |
CN115705294B (zh) | 用于获取函数调用信息的方法、装置、电子设备和介质 | |
CN113553059B (zh) | 局部变量查询方法、装置、服务器及存储介质 | |
CN113141407B (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 |