一种Java字节码调试器及调试方法与流程

文档序号:11950031阅读:601来源:国知局
一种Java字节码调试器及调试方法与流程

本申请涉及软件工程技术领域,特别涉及一种Java字节码调试器及调试方法。



背景技术:

Java语言已经应用到各种应用程序的编程中,卡内芯片系统由Java语言来编写的智能卡又称为Java卡,Java卡中包括由Java源代码编译后的Java字节码和由C程序编写的虚拟机,虚拟机用来对Java字节码进行解析并执行。

目前Java卡内的系统程序均基于Java源代码进行调试,一般通过在eclipse开发平台增加调试插件,并将调试插件连接到虚拟机来实现,具体调试过程包括将Java源代码编译成Java字节码和在虚拟机上运行编译后的Java字节码两个过程。

由于在上述对Java源代码进行调试的过程中,被封装到Java卡芯片并在虚拟机上运行的实际是Java字节码,进而使得上述基于Java源代码的调试方法不能直观并准确地帮助工程师去定位运行中间出现的异常问题,使得Java软件工程师的调试效率比较低。



技术实现要素:

本发明的目的在于提高Java软件工程师的调试效率,提供一种Java字节码调试器及调试方法。

为达到上述目的,本发明的技术方案是提供一种Java字节码调试器,包括符号库模块、缓存模块、调试模块、栈解析模块和引用解析模块,其中:

符号库模块,用于从Java源代码文件中获取符号信息,并存放符号信息;

缓存模块,用于从Java字节码文件中获取符号信息和数据信息,并缓存符号信息和数据信息;

调试模块,用于通过Keil通道与虚拟机连接,使得Java字节码文件可在虚拟机上运行并调试,其中,用户直接在Java字节码上设置断点,调试模块将该断点同步到Keil通道进行调试,调试结束后,调试模块通过Keil通道将运行到断点位置的虚拟机的存储器中的Java栈提取出来发送到栈解析模块;

栈解析模块,用于接收运行到断点位置的虚拟机的存储器中的Java栈,并对Java栈进行解析,其中,解析结果包括执行到断点位置时应用程序对应的Java函数的调用关系、函数参数信息、函数局部变量值和地址信息中的至少一个;

引用解析模块,用于对执行到断点位置时Java字节码对应的Java引用进行解析,其中,如果Java引用指向一个Java对象,根据Java对象的存储方式和规则进行解析,解析出这个Java对象所属的Java类别及其对应的状态、拥有者和域值中的至少一个;如果Java引用指向一个数组,则解析出这个数组元素的类型和所有元素的值。

可选地,所述Java字节码调试器还包括静态变量解析模块,用于对Java代码中的静态变量进行解析,并允许开发者在任意时刻选择任意一个静态变量进行解析和查看。

本发明提供的Java字节码调试器具有如上所述的结构,从而使得一方面,本发明提出的Java字节码调试器利用Keil通道使得Java字节码文件可以在虚拟机上运行,实现了基于Java字节码的调试功能;另一方面,本发明提出的Java字节码调试器中的符号库模块和缓存模块预先对Java字节码文件和Java源代码文件中的符号信息和数据信息做了计算和缓存,使得栈解析模块和引用解析模块能够快速地解析出调试模块返回的调试结果,可见,本发明提出的Java字节码调试器能够有效地提高软件工程师的调试效率。

本发明还提供一种Java字节码调试方法,该Java字节码调试方法包括:

S1、从Java源代码文件中提取字符信息,创建字符库模块;

S2、从Java字节码文件中提取符号信息和数据值,建立缓存模块;

S3、在Kei在Keil μVision集成开发环境中,配置Keil通道使其分别与Java字节码调试器的调试模块和虚拟机建立通信连接;

S4、用户直接在Java字节码上设置断点,该断点被同步到Keil通道来执行调试动作;

S5、调试结束后,Keil通道将运行到断点位置的虚拟机的存储器中对应的Java栈整个提取出来发送到栈解析模块;

S6、栈解析模块接收执行到断点位置的虚拟机的存储器中对应的Java栈,通过访问和加载缓存模块中符号信息和数据信息来对Java栈进行解析;

S7、引用解析模块通过访问和加载缓存模块中符号信息和数据信息来对执行到断点位置的Java字节码对应的Java引用进行解析;

S8、用户通过步骤S6的解析结果和步骤S7的解析结果对执行到当前断点的Java字节码中的函数信息、变量信息及引用对象进行查看。

具体地,所述Java字节码调试方法中步骤S1以方法为单位对从Java源代码文件中获取的符号信息进行组织,生成符号文件来创建字符库模块;其中,符号文件的文件名与Java字节码文件中的方法全名相对应,符号文件的文件名依次包括包名、类名、方法名、参数编码和返回值编码;符号文件的内容包括方法的源代码起始行号、方法体的起始行号、方法体的终止行号、所有函数的参数信息和所有函数的局部变量信息。

可选地,所述Java字节码调试方法中的步骤S2采用四级缓存的方式对从Java字节码文件中提取符号信息和数据值进行缓存,四级缓存从上到下依次为系统缓存、包缓存、类缓存和方法缓存。

可选地,所述Java字节码调试方法中的步骤S4中至少包括单步执行、跳进执行、跳出执行和执行到光标处中的至少一个调试动作。

可选地,所述Java字节码调试方法的步骤S4和步骤S5中间还包括:Java 字节码调试器对虚拟机中的存储器进行存储访问的步骤,该步骤中,通过将执行存储访问任务所需要的函数信息和Keil通道信息以DLL文件统一到虚拟机代码体系,再由Java字节码调试器对其进行调用来实现;其中,DLL文件由GNU makefile平台调用VC编译器和链接器,对实现存储访问任务所需要的文件进行编译和链接来生成;实现存储访问任务所需要的文件包括:Keil工程中定义的除.c或.h文件中定义的宏之外的其他宏的.mak文件、Keil工程中定义的所有包含路径的.mak文件、Keil工程中Java字节码调试器需要的.c文件的.mak文件、屏蔽Keil工程中有而VC环境不支持的关键字的.h文件、定义对虚拟机中的存储器进行寻址和存储访问的.c文件、定义计算Java数组或Java对象大小的.c文件和定义所有被Java字节码调试器调用的函数、全局变量或宏等的.c文件。

具体地,所述Java字节码调试方法的步骤S6中的Java字节码调试器对缓存模块的访问和加载过程包括:

当用户对系统缓存进行首次访问时,加载并生成所有的包对象;

当用户对每个包缓存进行首次访问时,加载该包中类库的所有内容,包括所有类的类信息和所有方法的方法信息;

当用户对每个类对象进行首次访问时,由类组件从类库获取并生成该类对象所属包内的所有类对象;

当用户对每个方法对象进行首次访问时,由方法组件从类库获取并生成该方法对象所属包内的所有方法对象。

可选地,所述Java字节码调试方法还包括:用户根据调试返回的信息在Java字节码文件中进行关键字搜索的步骤,以对导致程序运行异常的函数参数或局部变量等信息进行修改和确认,该步骤以包为单位进行关键字的搜索任务,当需要对某个包中的方法进行首次搜索时,先扫描整个Java字节码文件,将Java字节码文件中与该包相关的信息提取到一个缓存中,再从该缓存对该包进行搜索,搜索结果被显示在列表框中,双击即可将光标定位到Java字节码文件中相应的行。

可选地,所述Java字节码调试方法还包括:在Java字节码文件和Java源代码文件之间进行双向定位的步骤。

本发明提供的Java字节码调试方法应用于具有如上结构的Java字节码调试器,用户预先创建了符号库模块和缓存模块,然后配置Keil通道使其分别与Java字节码调试器的调试模块和虚拟机建立通信连接,使得Java字节码文件可以在虚拟机上运行并调试,调试时,用户直接在Java字节码上设置断点,将该断点同步到Keil通道即可执行调试动作,调试结束后Keil通道将运行到断点位置的虚拟机的存储器中的Java栈整个提取出来对Java栈进行解析,进一步地对Java引用对象进行解析,然后通过解析结果对运行到当前断点的调试返回的Java字节码中的各种函数信息、变量信息及引用对象进行方便地查看。如上所述,一方面,本发明提出的Java字节码调试方法利用Keil平台作为传输通道,使得Java字节码文件可以在虚拟机上运行,实现了基于Java字节码的调试功能;另一方面,本发明提出的Java字节码调试方法预先创建了符号库模块和缓存模块,对Java字节码文件和Java源代码码文件中的符号信息和数据信息做了计算和缓存,使得栈解析模块和引用解析模块能够快速地解析出调试模块返回的调试结果,可见,本发明提出的Java字节码调试方法能够有效地提高软件工程师的调试效率。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1是Java字节码调试器的结构图;

图2是缓存模块存储数据时采用的四级缓存结构的示意图;

图3是Java字节码调试方法的流程图;

图4使Java字节码调试器对虚拟机中的存储器进行存储访问的示意图。

附图标记说明:

1-Java字节码调试器;2-符号库模块;3-缓存模块;4-调试模块;5-栈解析模块;6-引用解析模块;7-Java字节码文件;8-Keil通道;9-虚拟机;10-静态变量解析模块。

具体实施方式

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

本发明实施例提供一种Java字节码调试器1,如图1所示,Java字节码调试器1包括符号库模块2、缓存模块3、调试模块4、栈解析模块5和引用解析模块6。

其中,符号库模块2用于从Java源代码文件中获取符号信息(symbol),并存放符号信息。

可选地,符号信息以Java method(方法)为单位进行组织,文件名是method的全名称,和Java字节码文件7中的method全名相对应,依次包括package(包)名、class(类)名、method名、参数编码和返回值编码,示例性地,符号文件的内容包含:method的源代码起始行号(可能是注释行)method body的起始行号;method body的终止行号;所有的函数参数信息:name(名称),type(类型),…;所有的局部变量信息:name(名称),type(类型),…。

缓存模块3,用于从Java字节码文件7中获取符号信息和数据信息,并缓存符号信息和数据信息。

可选地,缓存模块3共分为四级缓存(cache),如图2所示,从上到下依次为系统缓存(System cache)、包缓存(package cache)、类缓存(class cache)和方法缓存(method cache)。示例性地,系统缓存的内容包括所有 的包,每个包的内容又包含该包的name、ID、包引用和CP(类库)引用信息,类库的作用是指定类运行所依赖的其他类的路径。示例性地,包缓存的内容包括所有类库和静态变量,每个类库的内容又包含该包中所有类的类信息(Class Info)和所有方法的方法信息(Method Info),其中每个类的类信息又包含该类的全名称、类库索引(CP index)和是否是接口(interface)的标志信息,每个方法信息又包含该方法的全名称和类库索引信息;静态变量以包为单位进行组织,每个静态变量又包含该静态变量的名称、类型、长度(length)和位置(CS2)等信息。示例性地,类缓存的内容包括是否是接口的标志信息、类引用(class reference)、父类的类引用、类实例(class instance)的字节码大小(in short,2bytes per unit)、类组件(Class component)在字节码(BC)文件7中的行号和所有的类实例的域值(fields)信息,其中类实例的域值信息又包含该类实例的名称、类型和在类实例中的位置信息(token),此外一个类中的类实例的域值信息中还包括了各级父类的类实例域值信息。示例性地,方法缓存的内容包括方法实现字节码在字节码文件7中的开始行号、方法的4个元数据信息(flags,maxStack,nargs和maxLocals)、方法的位置信息(CS3)、方法位置信息(BAddr)和方法的字节码大小(in bytes)等信息。

调试模块4,用于通过Keil通道8与虚拟机9连接,使得Java字节码文件7可在虚拟机9上运行并调试,其中,用户直接在Java字节码上设置断点,调试模块4将该断点同步到Keil通道8进行调试,调试结束后,调试模块4通过Keil通道8将运行到断点位置的虚拟机9的存储器中的Java栈提取出来发送到栈解析模块5。

如图1所示,Java字节码调试器与Keil通道之间采用TCP协议(Transmission Control Protocol,传输控制协议)进行通信,TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义,在简化的计算机网络OSI(Open System Interconnection,开放式系统互联模型)中,它完成第四层传输层所指定的功能,在因特网协议族中,TCP 层是位于IP层之上,应用层之下的中间层。

栈解析模块5,用于接收运行到断点位置的虚拟机9的存储器中的Java栈,并对Java栈进行解析,其中,解析结果包括执行到断点位置时应用程序对应的Java函数的调用关系、函数参数信息、函数局部变量值和地址信息中的至少一个,示例性地,函数参数名称和类型、局部变量名称和类型的解析均来自对符号库文件的访问。

引用解析模块6,用于对执行到断点位置时Java字节码对应的Java引用进行解析,其中,如果Java引用指向一个Java对象,根据Java对象的存储方式和规则进行解析,解析出这个Java对象所属的Java类别及其对应的状态、拥有者和域值中的至少一个;如果Java引用指向一个数组,则解析出这个数组元素的类型和所有元素的值。

可选地,Java字节码调试器1还包括静态变量解析模块10,用于对Java字节码中的静态变量进行解析,并允许开发者在任意时刻选择任意一个静态变量进行解析和查看,其中,Java字节码文件7中所有的静态变量均以包的形式进行组织,然后存储在虚拟机9的存储器中并且存储地址固定。

本发明实施例提供的Java字节码调试器1具有如上所述的结构,其中符号库模块2和缓存模块3预先计算并缓存了大量信息,然后连接Keil通道8使得Java字节码可以在虚拟机9上运行并调试,用户直接在Java字节码上设置断点,将该断点同步到Keil通道8即可进行调试,调试结束后Keil通道8将运行到断点位置的虚拟机9的存储器中对应的Java栈整个提取出来进行Java栈解析,进一步地对Java引用对象进行解析。如上所述,一方面,本发明提出的Java字节码调试器1利用Keil通道8使得Java字节码文件7可以在虚拟机9上运行,实现了基于Java字节码的调试功能;另一方面,本发明提出的Java字节码调试器1中的符号库模块2和缓存模块3预先对Java字节码文件7和Java源代码文件中的符号信息和数据信息做了计算和缓存,使得栈解析模块5和引用解析模块6能够快速地解析出调试模块4返回的调试结果,可见,本发明提出的Java字节码调试器1能够有效地提高软件工程师 的调试效率。

本发明实施例还提供一种Java字节码调试方法,如图3所示,应用于如上所述的Java字节码调试器1,包括:

步骤S1、从Java源代码文件中提取字符信息,创建字符库模块;

步骤S2、从Java字节码文件中提取符号信息和数据值,建立缓存模块;

步骤S3、在Keil μVision集成开发环境中,配置Keil通道使其分别与Java字节码调试器的调试模块和虚拟机建立通信连接;

步骤S4、用户直接在Java字节码上设置断点,该断点被同步到Keil通道来执行调试动作;

步骤S5、调试结束后,Keil通道将运行到断点位置的虚拟机的存储器中对应的Java栈整个提取出来发送到栈解析模块;

步骤S6、栈解析模块接收执行到断点位置的虚拟机的存储器中对应的Java栈,通过访问和加载缓存模块来对Java栈进行解析;

步骤S7、栈解析模块接收执行到断点位置的虚拟机的存储器中对应的Java栈,通过访问和加载缓存模块中符号信息和数据信息来对Java栈进行解析;

步骤S8、用户通过步骤S6的解析结果和步骤S7的解析结果对执行到当前断点的Java字节码中的函数信息、变量信息及引用对象进行查看。

进一步地,在本发明实施例提出的Java字节码调试方法的步骤S1之前的准备工作包括:打开Java字节码调试器1并新建一个工程,加载准备调试的Java字节码文件7,由于Java字节码文件7数据量较大,为了不影响前台的用户操作,其加载过程放在了后台进行,加载的进度和状态等信息在状态栏中进行显示,当Java字节码文件7正确加载后,所有的Java字节码文件7的内容以标签页(tab page)的方式显示在主窗口中,显示时,每个标签页中预先填入1000行数据,其它数据放到后台进行加载,在程序空闲(idle)时再进行加载。

具体地,Java字节码调试方法中步骤S1以方法(method)为单位对从 Java源代码文件中获取的符号信息进行组织,生成符号文件来创建字符库模块;其中,符号文件的文件名是method的全名称,和Java字节码文件7中的method全名相对应,依次包括package(包)名、class(类)名、method名、参数编码和返回值编码,示例性地,符号文件的内容包含:method的源代码起始行号(可能是注释行)method body的起始行号;method body的终止行号;所有的函数参数信息:name(名称),type(类型),…;所有的局部变量信息:name(名称),type(类型),…。由于字符库模块2包含了关于Java原代码文件的详细字符信息,从而为解析返回的调试码的信息提供了路径。

可选地,如图2所示,Java字节码调试方法中的步骤S2采用四级缓存的方式对从Java字节码文件7中提取符号信息和数据值进行缓存,四级缓存从上到下依次为系统缓存(System cache)、包缓存(package cache)、类缓存(class cache)和方法缓存(method cache)。示例性地,系统缓存的内容包括所有的包,每个包的内容又包含该包的name、ID、包引用和CP(类库)引用信息,类库的作用是指定类运行所依赖的其他类的路径。示例性地,包缓存的内容包括所有类库和静态变量,每个类库的内容又包含该包中所有类的类信息(Class Info)和所有方法的方法信息(Method Info),其中每个类的类信息又包含该类的全名称、类库索引(CP index)和是否是接口(interface)的标志信息,每个方法信息又包含该方法的全名称和类库索引信息;静态变量以包为单位进行组织,每个静态变量又包含该静态变量的名称、类型、长度(length)和位置(CS2)等信息。示例性地,类缓存的内容包括是否是接口的标志信息、类引用(class reference)、父类的类引用、类实例(class instance)的字节码大小(in short,2bytes per unit)、类组件(Class component)在字节码(BC)文件7中的行号和所有的类实例的域值(fields)信息,其中类实例的域值信息又包含该类实例的名称、类型和在类实例中的位置信息(token),此外一个类中的类实例的域值信息中还包括了各级父类的类实例域值信息。示例性地,方法缓存的内容包括方法实现字节码在字节码文件7 中的开始行号、方法的4个元数据信息(flags,maxStack,nargs和maxLocals)、方法的位置信息(CS3)、方法位置信息(BAddr)和方法的字节码大小(in bytes)等信息。本发明实施例中的缓存模块3采用四级缓存的方式将Java字节码文件7中包含的大量的符号信息、数据信息及其注释进行了合理地缓存布局,不仅使得程序开发者一目了然,而且优化了对执行调试后返回信息的解析过程,加快了解析速度。

可选地,Java字节码调试方法中的步骤S4中至少包括单步执行、跳进执行、跳出执行和执行到光标处中的至少一个调试动作,其中单步执行(Step over)指不进入到子函数的运行方式;跳进执行(Step into)指进入到子函数的运行方式;跳出执行(Step out)指从当前子函数跳出的运行方式;执行到光标处(Run to cursor)指运行到当前选择的行,这样本发明实施例提出的Java字节码调试器1就可以直接在Java字节码上按照通用的调试动作进行调试。

可选地,Java字节码调试方法的步骤S4和步骤S5中间还包括:Java字节码调试器1对虚拟机9中的存储器进行存储访问的步骤,如图4所示,该步骤中,通过将执行存储访问任务所需要的函数信息和Keil通道信息以DLL文件统一到虚拟机9代码体系,再由Java字节码调试器1对其进行调用来实现;其中,DLL文件由GNU makefile平台调用VC编译器和链接器,对实现存储访问任务所需要的文件进行编译和链接来生成;实现存储访问任务所需要的文件包括:Keil工程中定义的除.c或.h文件中定义的宏之外的其他宏的.mak文件、Keil工程中定义的所有包含路径的.mak文件、Keil工程中Java字节码调试器需要的.c文件的.mak文件、屏蔽Keil工程中有而VC环境不支持的关键字的.h文件、定义对虚拟机中的存储器进行寻址和存储访问的.c文件、定义计算Java数组或Java对象大小的.c文件和定义所有被Java字节码调试器调用的函数、全局变量或宏等的.c文件。如上所述,本发明实施例提出的Java字节码调试器1选取Keil工程中Java字节码调试器1实现调试功能所需要的文件,将Keil平台8作为传输通道,从而实现了对虚拟机9中存 储器的存储与访问。

具体地,Java字节码调试方法的步骤S6中的Java字节码调试器1对缓存模块3的访问和加载过程包括:当用户对系统缓存进行首次访问时,加载并生成所有的包对象;当用户对每个包缓存进行首次访问时,加载该包中类库的所有内容,包括所有类的类信息和所有方法的方法信息;当用户对每个类对象进行首次访问时,由类组件从类库获取并生成该类对象所属包内的所有类对象;当用户对每个方法对象进行首次访问时,由方法组件从类库获取并生成该方法对象所属包内的所有方法对象,本发明实施例通过上述方法实现了Java字节码调试器1对缓存模块3的快速访问和加载。

可选地,Java字节码调试方法还包括:用户根据调试返回的信息在Java字节码文件7中进行关键字搜索的步骤,以对导致程序运行异常的函数参数或局部变量等信息进行修改和确认,该步骤以包为单位进行关键字的搜索任务,当需要对某个包中的方法进行首次搜索时,先扫描整个Java字节码文件7,将Java字节码文件7中与该包相关的信息提取到一个缓存中,再从该缓存对该包进行搜索,搜索结果被显示在列表框(listbox)中,双击即可将光标定位到Java字节码文件7中相应的行,本发明实施例通过上述方法使得用户可以快速地在Java字节码文件7中进行关键字搜索,以对导致程序运行异常的函数参数或局部变量等信息进行修改和确认。

可选地,Java字节码调试方法还包括在Java字节码文件7和Java源代码文件之间进行双向定位的步骤。Java字节码文件7和Java源代码文件可以以视窗的形式并列显示,当用户选中任意一行Java字节码时,对照地,该行Java字节码对应的Java源代码所在的行也被选中;反之,当用户选中任意一行Java源代码时,对照地,该行Java源代码对应的Java字节码所在的行也被选中。

本发明提供的Java字节码调试方法应用于具有如上结构的Java字节码调试器1,用户预先创建了符号库模块2和缓存模块3,然后配置Keil通道8使其分别与Java字节码调试器1的调试模块4和虚拟机9建立通信连接,使 得Java字节码文件7可以在虚拟机9上运行并调试,调试时,用户直接在Java字节码上设置断点,将该断点同步到Keil通道8即可执行调试动作,调试结束后Keil通道8将运行到断点位置的虚拟机9的存储器中的Java栈整个提取出来对Java栈进行解析,进一步地对Java引用对象进行解析,然后通过解析结果对运行到当前断点的调试返回的Java字节码中的各种函数信息、变量信息及引用对象进行方便地查看。如上所述,一方面,本发明提出的Java字节码调试方法利用Keil平台8作为传输通道,使得Java字节码文件7可以在虚拟机9上运行,实现了基于Java字节码的调试功能;另一方面,本发明提出的Java字节码调试方法预先创建了符号库模块2和缓存模块3,对Java字节码文件7和Java源代码码文件中的符号信息和数据信息做了计算和缓存,使得栈解析模块5和引用解析模块6能够快速地解析出调试模块返回的调试结果,可见,本发明提出的Java字节码调试方法能够有效地提高软件工程师的调试效率。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

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