CN106201893B - 一种Java字节码调试器及调试方法 - Google Patents

一种Java字节码调试器及调试方法 Download PDF

Info

Publication number
CN106201893B
CN106201893B CN201610579381.2A CN201610579381A CN106201893B CN 106201893 B CN106201893 B CN 106201893B CN 201610579381 A CN201610579381 A CN 201610579381A CN 106201893 B CN106201893 B CN 106201893B
Authority
CN
China
Prior art keywords
java
information
java bytecode
file
module
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
Application number
CN201610579381.2A
Other languages
English (en)
Other versions
CN106201893A (zh
Inventor
魏勇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hengbao Co Ltd
Original Assignee
Hengbao Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Hengbao Co Ltd filed Critical Hengbao Co Ltd
Priority to CN201610579381.2A priority Critical patent/CN106201893B/zh
Publication of CN106201893A publication Critical patent/CN106201893A/zh
Application granted granted Critical
Publication of CN106201893B publication Critical patent/CN106201893B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种Java字节码调试器和调试方法,涉及软件工程技术领域,用于提高Java软件工程师的调试效率,包括符号库模块、缓存模块、调试模块、栈解析模块和引用解析模块,其中符号库模块,用于从Java源代码文件中获取符号信息,并存放符号信息;缓存模块,用于从Java字节码文件中获取符号信息和数据信息,并缓存符号信息和数据信息;调试模块,用于通过Keil通道与虚拟机连接,使得Java字节码文件可在虚拟机上运行并调试;栈解析模块,用于接收运行到断点位置的虚拟机的存储器中的Java栈,并对Java栈进行解析;引用解析模块,用于接收运行到断点位置的虚拟机的存储器中的Java栈,并对Java栈进行解析。本发明用于对Java字节码进行调试。

Description

一种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)和方法缓存(methodcache)。示例性地,系统缓存的内容包括所有的包,每个包的内容又包含该包的name、ID、包引用和CP(类库)引用信息,类库的作用是指定类运行所依赖的其他类的路径。示例性地,包缓存的内容包括所有类库和静态变量,每个类库的内容又包含该包中所有类的类信息(Class Info)和所有方法的方法信息(Method Info),其中每个类的类信息又包含该类的全名称、类库索引(CP index)和是否是接口(interface)的标志信息,每个方法信息又包含该方法的全名称和类库索引信息;静态变量以包为单位进行组织,每个静态变量又包含该静态变量的名称、类型、长度(length)和位置(CS2)等信息。示例性地,类缓存的内容包括是否是接口的标志信息、类引用(class reference)、父类的类引用、类实例(classinstance)的字节码大小(in short,2bytes per unit)、类组件(Class component)在字节码(BC)文件7中的行号和所有的类实例的域值(fields)信息,其中类实例的域值信息又包含该类实例的名称、类型和在类实例中的位置信息(token),此外一个类中的类实例的域值信息中还包括了各级父类的类实例域值信息。示例性地,方法缓存的内容包括方法实现字节码在字节码文件7中的开始行号、方法的4个元数据信息(flags,maxStack,nargs和maxLocals)、方法的位置信息(CS3)、方法位置信息(BAddr)和方法的字节码大小(inbytes)等信息。
调试模块4,用于通过Keil通道8与虚拟机9连接,使得Java字节码文件7可在虚拟机9上运行并调试,其中,用户直接在Java字节码上设置断点,调试模块4将该断点同步到Keil通道8进行调试,调试结束后,调试模块4通过Keil通道8将运行到断点位置的虚拟机9的存储器中的Java栈提取出来发送到栈解析模块5。
如图1所示,Java字节码调试器与Keil通道之间采用TCP协议(TransmissionControl Protocol,传输控制协议)进行通信,TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义,在简化的计算机网络OSI(Open SystemInterconnection,开放式系统互联模型)中,它完成第四层传输层所指定的功能,在因特网协议族中,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)和方法缓存(methodcache)。示例性地,系统缓存的内容包括所有的包,每个包的内容又包含该包的name、ID、包引用和CP(类库)引用信息,类库的作用是指定类运行所依赖的其他类的路径。示例性地,包缓存的内容包括所有类库和静态变量,每个类库的内容又包含该包中所有类的类信息(Class Info)和所有方法的方法信息(Method Info),其中每个类的类信息又包含该类的全名称、类库索引(CP index)和是否是接口(interface)的标志信息,每个方法信息又包含该方法的全名称和类库索引信息;静态变量以包为单位进行组织,每个静态变量又包含该静态变量的名称、类型、长度(length)和位置(CS2)等信息。示例性地,类缓存的内容包括是否是接口的标志信息、类引用(class reference)、父类的类引用、类实例(classinstance)的字节码大小(in short,2bytes per unit)、类组件(Class component)在字节码(BC)文件7中的行号和所有的类实例的域值(fields)信息,其中类实例的域值信息又包含该类实例的名称、类型和在类实例中的位置信息(token),此外一个类中的类实例的域值信息中还包括了各级父类的类实例域值信息。示例性地,方法缓存的内容包括方法实现字节码在字节码文件7中的开始行号、方法的4个元数据信息(flags,maxStack,nargs和maxLocals)、方法的位置信息(CS3)、方法位置信息(BAddr)和方法的字节码大小(inbytes)等信息。本发明实施例中的缓存模块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字节码调试方法能够有效地提高软件工程师的调试效率。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (10)

1.一种Java字节码调试器,其特征在于,包括符号库模块、缓存模块、调试模块、栈解析模块和引用解析模块,其中:
符号库模块,用于从Java源代码文件中获取符号信息,并存放符号信息;
缓存模块,用于从Java字节码文件中获取符号信息和数据信息,并缓存符号信息和数据信息;
调试模块,用于通过Keil通道与虚拟机连接,使得Java字节码文件可在虚拟机上运行并调试,其中,用户直接在Java字节码上设置断点,调试模块将该断点同步到Keil通道进行调试,调试结束后,调试模块通过Keil通道将运行到断点位置的虚拟机的存储器中的Java栈提取出来发送到栈解析模块;
栈解析模块,用于接收运行到断点位置的虚拟机的存储器中的Java栈,并对Java栈进行解析,其中,解析结果包括执行到断点位置时应用程序对应的Java函数的调用关系、函数参数信息、函数局部变量值和地址信息中的至少一个;
引用解析模块,用于对执行到断点位置时Java字节码对应的Java引用进行解析,其中,如果Java引用指向一个Java对象,根据Java对象的存储方式和规则进行解析,解析出这个Java对象所属的Java类别及其对应的状态、拥有者和域值中的至少一个;如果Java引用指向一个数组,则解析出这个数组元素的类型和所有元素的值。
2.如权利要求1所述的一种Java字节码调试器,其特征在于,还包括静态变量解析模块,用于对Java字节码中的静态变量进行解析,并允许开发者在任意时刻选择任意一个静态变量进行解析和查看。
3.一种Java字节码调试方法,其特征在于,包括:
步骤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字节码中的函数信息、变量信息及引用对象进行查看。
4.如权利要求3所述的Java字节码调试方法,其特征在于,步骤S1中以方法为单位对从Java源代码文件中获取的符号信息进行组织,生成符号文件来创建字符库模块;其中,符号文件的文件名与Java字节码文件中的方法全名相对应,符号文件的文件名依次包括包名、类名、方法名、参数编码和返回值编码;符号文件的内容包括方法的源代码起始行号、方法体的起始行号、方法体的终止行号、所有函数的参数信息和所有函数的局部变量信息。
5.如权利要求3所述的Java字节码调试方法,其特征在于,步骤S2采用四级缓存的方式对从Java字节码文件中提取符号信息和数据值进行缓存,四级缓存从上到下依次为系统缓存、包缓存、类缓存和方法缓存。
6.如权利要求3所述的Java字节码调试方法,其特征在于,步骤S4中的调试动作包括单步执行、跳进执行、跳出执行和执行到光标处中的至少一个。
7.如权利要求3所述的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文件。
8.如权利要求5所述的Java字节码调试方法,其特征在于,步骤S6中对缓存模块的访问和加载过程包括:
当用户对系统缓存进行首次访问时,加载并生成所有的包对象;
当用户对每个包缓存进行首次访问时,加载该包中类库的所有内容,包括所有类的类信息和所有方法的方法信息;
当用户对每个类对象进行首次访问时,由类组件从类库获取并生成该类对象所属包内的所有类对象;
当用户对每个方法对象进行首次访问时,由方法组件从类库获取并生成该方法对象所属包内的所有方法对象。
9.如权利要求3所述的Java字节码调试方法,其特征在于,还包括:用户根据调试返回的信息在Java字节码文件中进行关键字搜索的步骤,以对导致程序运行异常的函数参数或局部变量等信息进行修改和确认,该步骤以包为单位进行关键字的搜索任务,当需要对某个包中的方法进行首次搜索时,先扫描整个Java字节码文件,将Java字节码文件中与该包相关的信息提取到一个缓存中,再从该缓存对该包进行搜索,搜索结果被显示在列表框中,双击即可将光标定位到Java字节码文件中相应的行。
10.如权利要求3或9所述的Java字节码调试方法,其特征在于,还包括:在Java字节码文件和Java源代码文件之间进行双向定位的步骤。
CN201610579381.2A 2016-07-21 2016-07-21 一种Java字节码调试器及调试方法 Active CN106201893B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610579381.2A CN106201893B (zh) 2016-07-21 2016-07-21 一种Java字节码调试器及调试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610579381.2A CN106201893B (zh) 2016-07-21 2016-07-21 一种Java字节码调试器及调试方法

Publications (2)

Publication Number Publication Date
CN106201893A CN106201893A (zh) 2016-12-07
CN106201893B true CN106201893B (zh) 2018-11-06

Family

ID=57492252

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610579381.2A Active CN106201893B (zh) 2016-07-21 2016-07-21 一种Java字节码调试器及调试方法

Country Status (1)

Country Link
CN (1) CN106201893B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109684027B (zh) * 2017-10-18 2020-11-24 北京京东尚科信息技术有限公司 动态跟踪Java虚拟机运行的方法和装置
CN109885486A (zh) * 2019-01-23 2019-06-14 鑫涌算力信息科技(上海)有限公司 系统调试装置及方法
US10783082B2 (en) 2019-08-30 2020-09-22 Alibaba Group Holding Limited Deploying a smart contract
CN110675256B (zh) * 2019-08-30 2020-08-21 阿里巴巴集团控股有限公司 部署和执行智能合约的方法及装置
CN111061508B (zh) * 2019-12-12 2022-05-20 恒宝股份有限公司 一种Java卡及其性能优化方法
CN111752845A (zh) * 2020-06-30 2020-10-09 江苏恒宝智能系统技术有限公司 一种调试工具及其调试方法和系统
CN112256570B (zh) * 2020-10-19 2023-08-11 网易(杭州)网络有限公司 远程调试方法、装置、设备及存储介质
CN113836046B (zh) * 2021-11-29 2022-02-15 武汉天喻信息产业股份有限公司 Mcu上虚拟机应用程序调试方法及系统
CN114327403A (zh) * 2021-12-24 2022-04-12 杭州趣链科技有限公司 智能合约的开发方法、装置及电子设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102855186A (zh) * 2012-07-24 2013-01-02 飞天诚信科技股份有限公司 一种Java卡调试信息的处理方法
CN103019941A (zh) * 2012-12-28 2013-04-03 大唐微电子技术有限公司 程序调试方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8104085B2 (en) * 2003-06-27 2012-01-24 Oracle America, Inc. Hybrid system implementing distinct and co-existing application execution environments and methods for implementing the same

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102855186A (zh) * 2012-07-24 2013-01-02 飞天诚信科技股份有限公司 一种Java卡调试信息的处理方法
CN103019941A (zh) * 2012-12-28 2013-04-03 大唐微电子技术有限公司 程序调试方法和装置

Also Published As

Publication number Publication date
CN106201893A (zh) 2016-12-07

Similar Documents

Publication Publication Date Title
CN106201893B (zh) 一种Java字节码调试器及调试方法
US10209968B2 (en) Application compiling
US8615750B1 (en) Optimizing application compiling
CN106021257A (zh) 一种支持在线编程的爬虫抓取数据方法、装置及系统
CN113157274B (zh) 基于微前端的软件开发方法、装置、电子设备及存储介质
CN111831538A (zh) 调试方法、装置以及存储介质
CN113064593B (zh) 移动app动态化的方法、装置、计算机设备及存储介质
CN113419969B (zh) 基于浏览器插件的界面自动化成功率保障方法
CN110032363A (zh) 一种用于机器人编程的数据结构构造方法及系统
CN103473431B (zh) 一种轻量级的在线调试php程序的方法
CN112328219A (zh) 业务访问处理方法、装置、系统和计算机设备
CN115686511A (zh) 基于跨平台语言的跨平台软件开发方法及装置
CN104731598B (zh) 一种基于Webkit内核提供网页浏览的方法及装置
CN117762407A (zh) 页面渲染方法、装置、设备、存储介质及计算机程序产品
CN104423932B (zh) Javascript中调用二进制组件的方法
Pérez et al. Facing interaction-rich rias: The orchestration model
CN111309402B (zh) 数据监测及针对应用程序的处理方法、装置及设备
US6182093B1 (en) Management of multimedia information across a plurality of HTML containers
CN110209973A (zh) 一种网页游戏加载方法及装置
CN101882190B (zh) 字节码中间表示程序的分模块形式化验证方法
US11023214B2 (en) System and method for eliminating runtime out-of-bounds errors and exceptions
CN113867728A (zh) 一种应用于第三代的现代Web前端的融合式的界面响应数据、基于组件的开发框架
CN117435175B (zh) 一种三维gis可视化引擎封装方法及系统
CN114625660B (zh) 调试方法及装置
Sipos Drupal 9 Module Development: Get up and running with building powerful Drupal modules and applications

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant