CN102855186A - 一种Java卡调试信息的处理方法 - Google Patents

一种Java卡调试信息的处理方法 Download PDF

Info

Publication number
CN102855186A
CN102855186A CN2012102586526A CN201210258652A CN102855186A CN 102855186 A CN102855186 A CN 102855186A CN 2012102586526 A CN2012102586526 A CN 2012102586526A CN 201210258652 A CN201210258652 A CN 201210258652A CN 102855186 A CN102855186 A CN 102855186A
Authority
CN
China
Prior art keywords
instruction
event
data
bytecode
execution
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
Application number
CN2012102586526A
Other languages
English (en)
Other versions
CN102855186B (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.)
Feitian Technologies Co Ltd
Original Assignee
Feitian Technologies 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 Feitian Technologies Co Ltd filed Critical Feitian Technologies Co Ltd
Priority to CN201210258652.6A priority Critical patent/CN102855186B/zh
Publication of CN102855186A publication Critical patent/CN102855186A/zh
Application granted granted Critical
Publication of CN102855186B publication Critical patent/CN102855186B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明公开一种JAVA卡调试信息的处理方法,包括:获取指令并检测指令类型,如是未处理过的设置指令,如调节器是位置调节器则用特殊字节码替换在虚拟机上运行的Java卡程序中的与位置信息相符的原字节码,将原字节码写到事件列表中生成事件序列号;如是单步调节器,则设置单步调试信息,将事件写到事件列表中生成事件序列号;如是调试指令,则获取虚拟机上当前运行的Java卡程序的字节码并判断其是否为特殊字节码,是则从事件列表中查找对应的原字节码并用原字节码替换特殊字节码,获取返回数据,否则当判断事件列表中的单步调试标志置位时,根据获取的字节码获取返回数据。本发明使用方便、可实时监控和查看虚拟机调试过程。

Description

一种Java卡调试信息的处理方法
技术领域
本发明涉及调试信息处理领域,尤其涉及一种Java卡调试信息的处理方法。
背景技术
Java卡是一种可以运行Java程序的智能卡,是Java技术和智能卡技术的结合。运行在Java卡上的Java卡程序称为Java卡Applet,它是源代码级调试平台的调试对象。经过近年来快速的发展,Java卡已经广泛地应用在各种领域,尤其是通信和金融领域。
在现有技术中,通常采用生成日志的方法来对Java卡程序进行调试。在启动虚拟机时传递一个参数,作为虚拟机开启日志记录的标记,在虚拟机运行的时候将Java卡程序中的特定调试符号如函数、调用栈等信息打印在日志中,采用实时打印或者写文件等形式查看日志。但是这种方法效率低、操作不方便,对于资源信息(如变量值等)无法进行实时监视,不具有针对性,特别是对于一般的应用开发者来说,查看这样的调试日志比较困难。
发明内容
鉴于现有技术的不足,本发明提供了一种Java卡调试信息的处理方法,其具有方便于上层应用开发者使用、可实时监控和查看的特点。
本发明提供的一种Java卡调试信息的处理方法,包括:
步骤A:获取指令并检测指令类型,如是设置指令,则执行步骤B,如是调试指令,则执行步骤E,如是其他,则根据指令进行操作;
步骤B:按照预设规定对所述设置指令进行解析得到包头和数据部分,对所述包头进行解析,从所述设置指令包头的解析结果中获取请求ID和请求标记,判断所述请求标记是否为预设值,是则执行步骤C,否则给发送装置返回提示信息;步骤C:从所述设置指令包头的解析结果中获取命令集和命令,如所述命令集为事件请求命令集且所述命令对应的事件类型为设置事件,从所述解析结果中获取调节器,如是位置调节器则根据位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换所述原字节码,将所述原字节码写到事件列表中生成事件序列号,顺序执行步骤D;如是单步调节器,则设置单步调试信息,将事件写到事件列表中生成事件序列号,顺序执行步骤D;如所述命令对应的事件类型为其他事件则根据设置指令进行操作;如所述命令集为其他命令集则根据设置指令进行操作;
步骤D:根据预设规则设置第一返回数据,并将所述第一返回数据返回给发送装置;
步骤E:获取虚拟机上当前运行的Java卡程序的字节码,判断所述读取的字节码是否为特殊字节码,是则执行步骤F,否则执行步骤G;
步骤F:根据所述获取的字节码从事件列表中查找对应的原字节码并用所述原字节码替换所述获取的字节码,从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤G:判断事件列表中的单步调试标志是否置位,是则步骤H,否则返回步骤E;
步骤H:根据所述获取的字节码从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤I:根据所述预设规则设置第二返回数据,并将所述第二返回数据返回给发送装置。
其中,所述步骤C和步骤E-步骤H分别替换为步骤C’和步骤E’-步骤H’;
步骤C’:从所述设置指令包头的解析结果中获取命令集和命令,如所述命令集为事件请求命令集且所述命令对应的事件类型为设置事件,从所述解析结果中获取调节器,如是位置调节器则根据位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换所述原字节码,将所述原字节码写到事件列表中生成事件序列号,顺序执行步骤D;如是单步调节器,则根据指令中的位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换所述原字节码,并从指令中获取单步调试信息,将单步事件写到事件列表中生成事件序列号,顺序执行步骤D;如所述命令对应的事件类型为其他事件则根据设置指令进行操作;如所述命令集为其他命令集则根据设置指令进行操作;
步骤E’:对调试指令进行解析并从解析结果中获取字节码,判断所述获取的字节码是否为特殊字节码,是则执行步骤F’,否则结束本次操作,等待虚拟机下发指令;
步骤F’:判断事件列表中的单步调试标志是否置位,是则步骤G’,否则返回步骤H’;
步骤G’:根据所述获取的字节码从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤H’:根据特殊字节码从事件列表中查找对应的原字节码并用所述原字节码替换所述特殊字节码,从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I。
其中,所述步骤C替换为步骤C”;
步骤C”:从所述设置指令包头的解析结果中获取命令集和命令,如所述命令集为事件请求命令集且所述命令对应的事件类型为设置事件,从所述解析结果中获取调节器,如是位置调节器则根据指令中的断点位置信息从调试数据中读取对应的原字节码并保存,用特殊字节码代替所述原字节码;将所述断点位置信息事件种类一起添加到断点列表中,在事件列表中添加出栈事件生成事件序列号;如是单步调节器,则设置单步调试信息,将事件写到事件列表中生成事件序列号;如所述命令对应的事件类型为其他事件则根据设置指令执行操作;如所述命令集为其他命令集则根据设置指令执行操作。
其中,所述步骤A中通过指令格式检测指令类型,具体包括:如所述指令的格式符合第一预设格式则为设置指令,如所述指令的格式符合APDU格式则为调试指令。
其中,所述步骤A中获取指令包括:从命令缓存中获取指令或接收所述发送装置发送的指令。
其中,在判断所述请求标记是否为预设值之前包括:
从所述设置指令包头的解析结果中获取指令长度,根据所述指令长度判断所述设置指令是否完整,如完整则判断所述设置指令是否为未处理指令,是则继续,否则结束,如不完整则结束。
其中,所述根据所述指令长度判断所述设置指令是否完整,具体为:
所述判断所述设置指令所占字节是否与所述指令长度相符,是则所述设置指令完整,否则所述设置指令不完整。
其中,所述判断所述请求标记是否为预设值,包括:判断所述获取的请求标记是否为0x00,是则执行步骤E,否则给发送装置返回提示信息。
其中,所述给发送装置返回提示信息,具体包括:从所述设置指令的请求标记之后读取两字节的数据,并将所述读取的数据返回给发送装置。
其中,所述步骤C具体包括:
步骤C1:从所述设置指令包头的解析结果中获取命令集和命令,并检测所述命令集的类型,如是事件请求命令集,则执行步骤C2,否则根据其他命令集进行操作;
步骤C2:判断所述命令对应的事件类型,如是清除单个断点事件,则执行步骤C3;如是清除所有断点事件,则执行步骤C5;如是设置事件,则执行步骤C8;
步骤C3:对所述设置指令的数据部分进行解析,从所述设置指令数据部分的解析结果中获取事件种类和事件请求ID,并根据所述事件种类和所述事件请求ID在事件列表中查找对应的事件,判断是否找到匹配的事件,是则执行步骤C4,否则给发送装置返回未找到匹配事件的信息;
步骤C4:结束当前操作清空所述响应缓存中的数据;
步骤C5:在所述事件列表中查找所有断点事件;
步骤C6:清空所述事件列表中的所有断点事件,并判断是否清空完成,是则执行步骤C7,否则给发送装置返回错误信息;
步骤C7:清空所述响应缓存中的数据并结束当前操作;
步骤C8:从所述设置指令数据部分的解析结果中获取事件种类和暂停政策;
步骤C9:从所述设置指令数据部分的解析结果中获取调节器个数,根据所述调节器个数分配事件处理需要的缓存;
步骤C10:判断所述调节器个数是否为0,是则给所述发送装置返回错误信息,否则执行步骤C11;
步骤C11:从所述设置指令数据部分的解析结果中获取调节器的种类,如是位置调节器,则进行设置断点操作;如是单步调节器,则进行设置单步操作;如是其他调节器,则进行其他调节器的操作;如不是调节器,则给发送装置返回错误信息。
其中,所述步骤C1中检测所述命令集的类型具体包括:判断所述获取的命令集的值是否为15,是则为事件请求命令集,否则为其他命令集。
其中,所述步骤C2具体包括:检测所述获取的命令所对应的值,如是01则事件类型为设置事件,如是02则事件类型为清除事件,如是03则事件类型为清除所有断点事件。
其中,所述步骤C11中判断调节器的种类,具体包括:
检测从所述设置指令数据部分的解析结果中的调解器个数之后获取的值,如是8则为位置调节器,如是12则为单步调节器,如获取的数据与预设值不符则不是调节器。
其中,所述步骤C11中的进行设置断点操作,包括:
步骤C12:从所述设置指令数据部分的的解析结果中获取断点位置信息并进行存储,所述断点位置信息包括引用类型标识、引用类型ID、函数ID和偏移信息;
步骤C13:根据所述引用类型标识、引用类型ID、函数ID和偏移信息在预先下载到所述虚拟机中的Java卡程序中查找对应的位置,读取所述对应位置的原字节码并保存,用特定字节码替换所述对应位置的原字节码;
步骤C14:将断点信息和所述事件种类一起添加到断点列表中,所述断点信息包括所述原字节码和断点位置信息;
步骤C15:将事件写入到事件列表中生成事件序列号,将所述事件序列号写入到所述响应缓存的第一预设位置。
其中,所述步骤C11中的进行设置单步操作,包括:
步骤C16:从所述设置指令数据部分的解析结果中获取虚拟机线程ID、应用程序的单步指令方式和单步调试方式;
步骤C17:判断所述单步指令方式是否为第一指令方式或所述单步调试方式是否为单步进入,是则执行步骤C21,否则执行步骤C18;
步骤C18:从所述设置指令数据部分的解析结果中获取当前运行的Java卡程序行对应的栈信息;
步骤C19:判断所述单步指令方式是否为第二指令方式,是则执行步骤C20,否则执行步骤C21;
步骤C20:从所述设置指令数据部分的解析结果中获取与所述栈信息对应的栈标号,顺序执行步骤C21;
步骤C21:判断所述单步调试方式是否为单步进入,是则执行步骤C22,否则执行步骤C24;
步骤C22:在所述事件列表中添加栈事件;
步骤C23:将事件列表中的单步调试标志置位;
步骤C24:判断所述设置单步操作的处理是否完成,是则执行步骤C25,否则给发送装置返回错误信息;
步骤C25:将所述获取的虚拟机线程ID、单步指令方式、单步调试方式存储于事件列表中,生成事件序列号并将所述事件序列号写入到响应缓存的第一预设位置。
其中,所述步骤C23具体为:将事件列表中的单步调试标志的通知模式设置为1。
其中,所述步骤D根据预设规定在响应缓存中设置第一返回数据,包括:
步骤D1:在所述响应缓存的第二预设位置写入与所述请求ID对应的响应ID和与所述请求标记匹配的响应标记;
步骤D2:在所述响应缓存的第三预设位置写入两个字节的状态码,并判断所述状态码是否为0,是则执行步骤D3,否则执行步骤D4;
步骤D3:在所述响应缓存的第四预设位置写入操作结果的实际数据长度,顺序执行步骤D5;
步骤D4:在所述响应缓存的第四预设位置写入返回的最小数据长度,顺序执行步骤D5;
步骤D5:判断所述响应缓存的第三预设位置上的数据长度是否大于0,是则将所述第一返回数据返回给发送装置,并清空所述响应缓存中的第一返回数据,否则直接清空所述响应缓存中的第一返回数据。
其中,所述步骤F具体包括:
步骤F1:根据所述获取的字节码从所述虚拟机上的调试数据中获取函数信息,根据所述函数信息从所述虚拟机上的调试数据中获取所述字节码的偏移信息;
步骤F2:根据所述函数信息和所述偏移信息在断点列表中查找对应的断点信息,如找到则执行步骤F3,如未找到则返回步骤E;
步骤F3:从所述断点信息中读取与所述特殊字节码对应的原字节码;
步骤F4:根据所述函数信息从所述虚拟机上的调试数据中获取类信息,根据所述类信息从所述虚拟机上的调试数据中获取类型标识,根据所述类型标识从所述虚拟机上的调试数据中读取相应的签名信息,根据所述签名信息从所述虚拟机上的调试数据中获取对应的返回数据;
步骤F5:用所述原字节码替换所述虚拟机上当前运行的Java卡程序中的所述特殊字节码。
其中,所述步骤F2具体包括:
在所述断点列表中的断点信息中查找是否有与所述函数信息和所述特殊字节码相对应的原字节码,是则执行步骤F3,否则给所述发送装置返回错误信息。
其中,所述步骤H具体包括:
根据所述读取的字节码从所述虚拟机上的调试数据中读取行信息,根据所述行信息从所述虚拟机上的调试数据中获取函数信息,根据所述函数信息从所述虚拟机上的调试数据中获取类信息,根据所述类信息从所述虚拟机上的调试数据中获取引用类型标识,根据所述引用类型标识从所述虚拟机上的调试数据中获取相应的签名信息,根据所述签名信息从所述虚拟机上的调试数据中获取对应的返回数据。
其中,所述步骤G具体包括:判断事件列表中的单步调试标志的通知模式是否为1,是则置位,否则未置位。
本发明与现有技术相比,具有以下优点:
本发明提供一种方便于上层应用开发者对Java卡进行调试的处理方法,通过对获取的指令进行解析并控制虚拟机执行解析结果,以达到调试Java卡程序的目的;且在调试过程中实时监视和查看虚拟机中的信息(如变量值、调用栈信息和内存使用等);本发明中的处理方法可集成到主流的Java集成开发环境中,使得开发Java卡应用变得更简单,只要熟悉目前主要的Java集成开发环境就能快速开发Java卡应用,可以使用集成开发环境中的单步调试,断点设置等功能。
附图说明
图1为本发明实施例一提供的一种Java卡调试信息的处理方法流程图;
图2为本发明实施例二提供的一种Java卡调试信息的处理方法流程图;
图3为图2中步骤108的实现过程流程图;
图4为图3中的调节器类型为单步调节器的处理过程流程图;
图5为本发明实施例四提供的当接收到调试指令时的处理过程流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例一提供一种Java卡调试信息的处理方法,如图1所示,包括:
步骤A:获取指令并检测指令类型,如是设置指令,则执行步骤B,如是调试指令,则执行步骤E,如是其他,则根据指令进行操作;
本实施例中,获取的指令可以为发送装置法送的指令或者是命令缓存中存储的指令;如获取的指令的格式符合第一预设格式则为设置指令,如所述指令的格式符合APDU格式则为调试指令;
步骤B1:按照预设规定对设置指令进行解析得到包头和数据部分,对包头进行解析,从设置指令包头的解析结果中获取请求ID和请求标记;
步骤B2:判断请求标记是否为预设值,是则执行步骤C,否则给发送装置返回提示信息;
具体的,在本实施例中,在判断请求标记是否为预设值之前包括:从设置指令包头的解析结果中获取指令长度,根据指令长度判断设置指令是否完整,如完整则判断设置指令是否为未处理指令,是则继续,否则结束,如不完整则结束;
本实施例中的预设值为0x00;返回提示信息为从设置指令的请求标记之后读取的两字节的数据;
步骤C1:从设置指令包头的解析结果中获取命令集和命令,检测命令集的类型和命令对应的事件类型,如命令集为事件请求命令集且命令对应的事件类型为设置事件,则执行步骤C2,如命令对应的事件类型为其他事件则根据设置指令进行操作;如命令集为其他命令集则根据设置指令进行操作;
步骤C2:从解析结果中获取调节器,并检测调节器的种类,如是位置调节器则执行步骤C3,如是单步调节器,则执行步骤C3;
本实施例中如获取的调节器是其他调节器,则进行相应操作,具体操作不在本专利的保护范围,故不详述,
步骤C3:根据位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换原字节码,将原字节码写到事件列表中生成事件序列号,执行步骤D;
步骤C4:设置单步调试信息,将事件写到事件列表中生成事件序列号,顺序执行步骤D;
步骤D:根据预设规则设置第一返回数据并将其返回给发送装置;
本实施例中,根据预设规则设置第一返回数据具体为:
步骤D1:在响应缓存的第二预设位置写入与请求ID对应的响应ID和与请求标记匹配的响应标记;
步骤D2:在响应缓存的第三预设位置写入两个字节的状态码,并判断状态码是否为0,是则执行步骤D3,否则执行步骤D4;
步骤D3:在响应缓存的第四预设位置写入操作结果的实际数据长度,顺序执行步骤D5;
步骤D4:在响应缓存的第四预设位置写入返回的最小数据长度,顺序执行步骤D5;
步骤D5:判断响应缓存的第三预设位置上的数据长度是否大于0,是则将第一返回数据返回给发送装置,并清空响应缓存中的第一返回数据,否则直接清空响应缓存中的第一返回数据;
步骤E:获取虚拟机上当前运行的Java卡程序的字节码,判断读取的字节码是否为特殊字节码,是则执行步骤F,否则执行步骤G;
步骤F:根据获取的字节码从事件列表中查找对应的原字节码并用原字节码替换获取的字节码,从虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤G:判断事件列表中的单步调试标志是否置位,是则步骤H,否则返回步骤E;
步骤H:根据获取的字节码从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤I:根据预设规则设置第二返回数据并将其返回给发送装置。
本实施例中的步骤C1-步骤C2和步骤E-步骤H可分别替换为步骤C’和步骤E’-步骤H’;
步骤C’:从设置指令包头的解析结果中获取命令集和命令,如命令集为事件请求命令集且命令对应的事件类型为设置事件,从解析结果中获取调节器,如是位置调节器则根据位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换原字节码,将原字节码写到事件列表中生成事件序列号;如是单步调节器,则根据指令中的位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换原字节码,并从指令中获取单步调试信息,将单步事件写到事件列表中生成事件序列号;如命令对应的事件类型为其他事件则根据设置指令执行操作;如命令集为其他命令集则根据设置指令执行操作;
步骤E’:对调试指令进行解析并从解析结果中获取字节码,判断所述获取的字节码是否为特殊字节码,是则执行步骤F’,否则结束本次操作,等待虚拟机下发指令;
步骤F’:判断事件列表中的单步调试标志是否置位,是则步骤G’,否则返回步骤H’;
步骤G’:根据获取的字节码从虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤H’:根据特殊字节码从事件列表中查找对应的原字节码并用原字节码替换特殊字节码,从虚拟机中的调试数据中获取返回数据,顺序执行步骤I。
本实施例中的步骤C1-步骤C2还可替换为步骤C”;
步骤C”:从设置指令包头的解析结果中获取命令集和命令,如命令集为事件请求命令集且命令对应的事件类型为设置事件,从解析结果中获取调节器,如是位置调节器则根据指令中的断点位置信息从调试数据中读取对应的原字节码并保存,用特殊字节码代替原字节码;将所述断点位置信息事件种类一起添加到断点列表中,在事件列表中添加出栈事件生成事件序列号;如是单步调节器,则设置单步调试信息,将事件写到事件列表中生成事件序列号;如命令对应的事件类型为其他事件则根据设置指令执行操作;如命令集为其他命令集则根据设置指令执行操作。
实施例二
本发明实施例二提供了一种Java卡调试信息的处理方法,如图2所示,包括:
步骤101:获取指令并检测指令类型,如是设置指令,则执行步骤102,如是调试指令,则进行调试处理,如是其他指令则执行相应操作;
如是设置指令时,在步骤101之前还包括:接收发送装置发送的设置指令并存储到命令缓存中,步骤101中获取指令为:从命令缓存中获取设置指令;
如是调试指令,则步骤101中获取指令为:接收第一模块发送的调试指令;
本实施例中检测指令的类型是通过检测指令的格式来实现的;其中,调试指令是APDU指令格式;设置指令符合第一预设格式,设置指令包括包头和数据部分,其中包头是固定格式,包括五个字节段:各字节段的长度分别为四个字节、四个字节、一个字节、一个字节、一个字节:
本实施例中,进行调试处理的具体实现过程在实施例三中详述;如检测到指令类型是其他指令,不在本发明的保护范围之内,故不进行详述;
步骤102:对设置指令进行解析,得到包头和数据部分,再对包头进行解析,从设置指令包头的解析结果中获取指令长度;
步骤103:根据指令长度判断设置指令是否完整,是则执行步骤104,否则结束操作;
本实施例中,步骤103具体为:判断设置指令所占字节否与指令长度相符,是则设置指令完整,否则设置指令不完整;
步骤104:从设置指令包头的解析结果中获取请求ID和请求标记;
本实施例中,请求ID和请求标记在设置指令包头的解析结果中的指令长度之后,分别占四字节和一字节;
步骤105:判断请求标记是否为预设值,是则执行步骤107,否执行步骤106;
在本实施例中的请求标记(Flags)的预设值为0x00;
步骤106:给发送装置返回提示信息,执行步骤115;
本实施例中步骤106包括:从设置指令的请求标记之后获取两个字节数据并返回给发送装置;
步骤107:从设置指令包头的解析结果中获取命令集和命令;
本实施例中的命令集和命令在设置指令包头的解析结果中的请求标记之后,各占一个字节;本实施例中有18个命令集,如方法命令集、事件请求命令集等;方法命令集中包括行号表、变量表、字节码、丢弃的函数、有签名的变量表等命令,事务请求命令集(0F)中包括设置断点、清除单个断点、清除所有断点等命令;
步骤108:根据命令集和命令进行相应操作,并将操作结果写入到响应缓存的第一预设位置;
本实施例中具体以事件请求命令集为例进行说明,参见图3和图4,其他命令集不在本专利保护范围内,故不进行详述;
步骤109:将响应ID和与响应标记分别写入到响应缓存中的第二预设位置;
本实施例中的响应ID和请求ID相同,均为四个字节;响应标记与请求标记相匹配,均为一个字节,具体值为0x80;
本实施例中的响应缓存中有包头和数据部分,其中包头包括第四预设位置、第二预设位置和第三预设位置,各个字节段的长度分别为四个字节、五个字节、两个字节;数据部分为第一预设位置;
步骤110:在响应缓存的第三预设位置写入两个字节状态码,并判断状态码是否为0x0000,是则执行步骤111,否则执行步骤112;
步骤111:在响应缓存的第四预设位置写入操作结果的实际数据长度,顺序执行步骤113;
步骤112:在响应缓存的第四预设位置写入返回的最小数据长度,顺序执行步骤113;
具体的,本实施例中返回的最小数据长度为11;
步骤113:判断响应缓存的第四预设位置上的数据长度是否大于0,是则执行步骤114,否则执行步骤115;
步骤114:将响应缓存的数据发送给发送装置,顺序执行步骤115;
步骤115:清空响应缓存中的数据;
本实施例中也可不清空响应缓存中数据而结束当前操作。
本实施例一的方法中,在接收到设置指令后首先对其进行解析,然后根据解析结果进行相应操作,操作完成后根据预设格式设置返回数据,简化人工设置调试信息的过程。
实施例三
本实施例三是对实施例二中步骤108的详细阐述,具体以事件请求命令集为例进行说明,如图3和图4所示,包括:
步骤201:检测获取的命令集的类型,如是事件请求命令集,则执行步骤202,否则根据获取的设置指令进行操作;
具体的,在本实施例中,判断获取的命令集的值是否为15,是则为事件请求命令集,否则为其他命令集,进行相应的操作,其他命令集(如方法命令集、获取虚拟机相关信息的虚拟机命令集、获取类型信息的类命令集、数组命令集、接口命令集、获取函数与变量信息的方法命令集、变量命令集、获取栈信息的栈帧命令集等)的操作不在本专利的保护范围之内,故不进行详述;
步骤202:判断获取的命令对应的事件类型,如是清除单个断点事件,则执行步骤203;如是清除所有断点事件,则执行步骤206;如是设置事件,则执行步骤209;
本实施例中,步骤202具体为:检测所述获取的命令所对应的值,如是01则为设置事件,如是02则为清除单个断点事件,如是03则为清除所有断点事件;
步骤203:对设置指令的数据部分进行解析,从设置指令数据部分的解析结果中获取事件种类和事件请求ID;
本实施例中的事件种类占一个字节,事件请求ID占四个字节;
步骤204:根据事件种类和事件请求ID在事件列表中查找对应的事件,并判断是否找到匹配的事件,是则执行步骤205,否则给发送装置返回未找到匹配事件的信息;
步骤205:结束当前操作并清空响应缓存中的数据;
本实施例中该步骤205中也可不用清空响应缓存中的数据直接结束操作;
步骤206:在事件列表中查找所有断点事件;
步骤207:清空所述事件列表中的所有断点事件的信息,并判断是否清空完成,是则执行步骤208,否则给发送装置返回错误信息;
步骤208:清空响应缓存中的数据并结束当前操作;
本实施例中该步骤208中可不清空响应缓存中的数据直接结束当前操作;
步骤209:从设置指令数据部分的解析结果中获取事件种类和暂停政策;
本实施例中,事件种类和暂停政策在所述设置指令数据部分的事件请求ID之后,且各占一个字节;暂停政策为00表示暂停所有线程,暂停政策为01表示暂停当前线程等;
步骤210:从设置指令数据部分的解析结果中获取调节器个数,并根据调节器个数分配事件处理需要的缓存;
本实施例中的调节器个数在设置指令数据部分的解析结果中的暂停政策之后,占四个字节;
步骤211:判断调节器个数是否为0,是则给发送装置返回错误信息,否则执行步骤212;
步骤212:从设置指令数据部分的解析结果中获取调节器的种类,如是位置调节器,则进行设置断点操作,执行步骤213;如是单步调节器,则进行设置单步操作,执行步骤216;如是其他调节器,则进行其他调节器的相应操作;如不是调节器,则给发送装置返回错误信息;
具体的,本实施例中,调节器的种类在设置指令数据部分的解析结果中的调解器个数之后,如获取的值为8则为位置调节器,如获取的值为12则为单步调节器;
其他调节器(如计数器调节器、依赖条件调节器、线程调节器、类型调节器、类型排除调节器、类型匹配调节器、异常调节器、变量调节器、对象实体调节器)的相应操作不在本专利保护范围之内,故不进行详述;
步骤213:从设置指令数据部分的解析结果中获取断点位置信息并进行存储,断点位置信息包括引用类型标识、引用类型ID、函数ID和偏移信息;
本实施例中,断点位置信息在设置指令数据部分的解析结果中的调节器种类之后,其中类型标识占一个字节、引用类型标识ID占四个字节、函数ID占四个字节、偏移信息占八个字节;
本实施例中的类型标识如为00则表示类;如为01则表示接口;如为02则表示数组;
步骤214:根据引用类型标识、引用类型ID、函数ID和偏移信息在预先下载到虚拟机中的Java卡程序中查找对应的位置,读取该位置的原字节码并保存,用特定字节码替换原字节码;
具体的,本实施例中的特定字节码为非java卡自身的字节码,如0xC2;
本实施例中的步骤214具体为:根据引用类型标识在Java卡程序中找到当前类型,根据引用类型ID在当前类型中找到具体的类(当前类型(或接口或者数组)中的第几个类(或接口或者数组)),再在找到的具体类(或接口或数组)里根据函数ID找到对应的当前函数,根据偏移信息在当前函数中找到原字节码;比如类型ID为00,类型ID为03,函数ID为04,偏移信息为08,则查找原字节码具体为:根据00找到类,根据03找到第三个类,根据04在第三个类中找到第四个函数,根据08在第四个函数中找到位于偏移8字节位置处的原字节码;
步骤215:将断点信息(包括原字节码和断点位置信息)和事件种类一起添加到断点列表中,将事件写入到事件列表中生成事件序列号,将该事件序列号写入到响应缓存的第一预设位置;
本实施例中的响应缓存的第一预设位置是数据部分;
步骤216:从设置指令数据部分的解析结果中获取虚拟机线程ID、Java卡程序的单步指令方式和单步调试方式;
在本实施例中,虚拟机线程ID、Java卡程序的单步指令方式和单步调试方式在设置指令数据部分的解析结果中的调节器种类之后;
本实施例中,虚拟机调用函数中还有被调用的函数;具体的,单步指令方式包括:第一单步指令方式(即控制Java虚拟机以一句代码为单元进行运行)和第二单步指令方法(即控制java虚拟机以一行代码为单元进行运行);单步调试方式包括单步进入(当虚拟机接收到单步进入命令时,本实施例的方法控制虚拟机进入被调用的函数内执行)、单步跳过(当虚拟机接收到单步跳过命令时,本实施例的方法控制虚拟机跳过被调用的函数继续执行调用函数)和单步跳出(当虚拟机接收到单步进出命令时,本实施例的方法控制虚拟机跳出被调用函数继续执行调用函数);
步骤217:判断单步指令方式是否为第一指令方式或单步调试方式是否为单步进入,是则执行步骤221,否则执行步骤218;
步骤218:从设置指令数据部分的解析结果中获取Java卡程序行对应的栈信息;
本实施例中,栈信息在设置指令数据部分的解析结果中的单步调试方式之后;虚拟机可通过栈信息将触发事件(单步触发或断点触发)反馈给发送装置;
步骤219:判断单步指令方式是否为第二指令方式,是则执行步骤220,否则执行步骤221;
步骤220:从设置指令数据部分的解析结果中获取与栈信息对应的栈标号;
本实施例中的栈标号在设置指令数据部分的解析结果中的栈信息之后;
步骤221:判断单步调试方式是否为单步进入,是则执行步骤222,否则执行步骤224;
步骤222:在事件列表中添加出栈事件;
本实施例中,出栈事件是虚拟机在触发事件结束后的事件处理过程;栈事件的内容包括调试器个数、暂停政策、虚拟机线程ID、调试器种类;
步骤223:将事件列表中的单步调试标志置位,顺序执行步骤224;
本实施例中,步骤223具体为:将事件列表中的单步调试标志的通知模式设置为1;
步骤224:判断设置单步操作的处理是否完成,是则执行步骤225,否则给发送装置返回错误信息;
步骤225:将获取的虚拟机线程ID、Java卡程序的单步指令方式、单步调试方式存储于事件列表中,生成事件序列号并将其写入到响应缓存的第一预设位置;
本实施例中相应缓存的第一预设位置是数据部分。
实施例四
本发明实施例四提供当接收到调试指令时的处理过程,包括:
步骤401:获取虚拟机上当前运行的Java卡程序的当前字节码;
本实施例中,当接收到调试指令后触发进行调试处理,获取虚拟机上当前运行的Java卡程序的当前字节码;
步骤402:判断获取的当前字节码是否为特殊字节码,是则执行步骤403,否则413;
当虚拟机运行到特殊字节码时,本实施例中的方法控制虚拟机暂停运行,直到接收到启动虚拟机运行的调试指令后再次运行,如单步指令等;
本实施例中,如当前字节码为特殊字节码且调试标识置位则为单步事件,如当前字节码为特殊字节码且调试标识未置位则为断点事件;
步骤403:根据获取的字节码从虚拟机上的调试数据中获取函数信息;
步骤404:根据函数信息从虚拟机上的调试数据中获取偏移信息;
本实施例中的偏移信息为当前运行代码在当前函数中的偏移值;
步骤405:根据获取的函数信息和偏移信息在事件列表中查找对应的断点信息,如找到则执行步骤406,如未找到则返回步骤401;
本实施例中的步骤405具体包括:在事件列表中的断点信息中查找是否有与获取的函数信息和特殊字节码相对应的原字节码,是则执行步骤406,否则结束;
步骤406:从事件列表的断点信息中读取对应的原字节码;
步骤407:根据函数信息从虚拟机上的调试数据中获取类信息;
本实施例中的类信息包括:类、接口、数组等;
步骤408:根据类信息从虚拟机上的调试数据中获取对应的类型标识;
步骤409:根据类型标识从虚拟机上的调试数据中获取签名信息;
本实施例中的签名信息包括:类型名称、访问修饰符等;
步骤410:根据签名信息从虚拟机上的调试数据中获取对应的返回数据;
本实施例中的函数信息、位置信息、类信息、类型标识、对应的数据等都预先发送给虚拟机进行存储的;
本实施例中获取的数据包括:一个字节的暂停政策、四个字节的当前返回数据中包含的已触发的事件个数、一个字节的事件类型、四个字节的事件请求ID、四个字节事件触发线程ID和位置信息,其中位置信息包括一个字节的类型标识、四个字节的引用类型ID、四个字节的函数ID和八个字节的偏移信息;
其中,如当前操作是单步调试过程中的单步进入触发,事件类型为0;如当前操作是单步调试的单步跳过触发,事件类型为1;如当前操作是断点触发时,事件类型为2;如当前操作时单步调试的单步跳出时,事件类型为3;
步骤411:按照预设格式设置第二返回数据,并将其发送给发送装置;
本实施例中的第二返回数据包括包头和数据部分,包头格式参照实施例一中的返回数据的包头格式,在此不再赘述,将获取的返回数据作为数据部分;
步骤412:用原字节码替换虚拟机上当前运行的Java卡程序的特殊字节码,执行步骤420;
本实施例中的发送装置可将接收的数据和信息显示出来,方便用户实时监测和查看。
步骤413:判断事件列表中的单步调试标志是否置位,是则执行步骤414,否则返回步骤401;
本实施例中,步骤413具体为:判断事件列表中的单步调试标志的通知模式是否为1;
本实施例中,当单步调试标志位置时,本实施例的方法控制虚拟机进行单步调试,包括单步进入、单步跳出和单步跳出;
步骤414:根据获取的字节码从虚拟机上的调试数据中获取行信息;
步骤415:根据行信息从虚拟机上的调试数据中获取函数信息,根据函数信息从虚拟机上的调试数据中获取的类信息;
本实施例中的类信息包括:类、接口、数组等;
步骤416:根据类信息从虚拟机上的调试数据中获取引用类型标识;
步骤417:根据引用类型标识从虚拟机上的调试数据中获取签名信息;
步骤418:根据签名信息从虚拟机上的调试数据中获取对应的返回数据;
步骤419:按照预设格式设置第二返回数据,并将其发送给发送装置,顺序执行步骤420;
本实施例中的返回数据格式可参照步骤411实现,在此不再赘述;
步骤420:等待接收调试指令,当接收到调试指令时,返回步骤401。
下面以具体的实例来说明本发明的实现过程,具体的以调试信息为断点信息的为例;
虚拟机接收到发送装置发送的设置指令为:00 00 00 23 00 0000 54 00 0F 01 02 01 00 00 00 01 07 01 00 0001 08 00 CB CE B8 00 00 00 00 00 00 00 07;
虚拟机对上述指令进行解析,解析结果为:
00 00 00 23表示指令长度,00 00 00 54表示请求ID,00表示请求标记,0F表示命令集,01表示命令,02表示事件种类中的中断类型,01表示暂停政策中的暂停当前线程,00 00 00 01表示调节器个数,07表示调节器种类中的位置调节器,01表示类型标识,00 0001 08表示引用类型标识ID,00 CB CE B8表示函数ID,00 0000 00 00 00 00 07表示偏移信息;
步骤114中虚拟机给发送装置返回的第一返回数据为:00 00 00 0F 00 00 00 54 80 00 00 00 00 00 12;
其中,00 00 00 0F表示返回的实际数据长度,00 00 00 54表示请求ID,80表示响应标记,00 00表示没有错误而写入的两个字节状态码,00 00 00 12表示生成的断点事件序列号;
实施例四中调试触发断点时在在步骤411中给发送装置返回的第二返回数据为:包头“00 00 00 2A 00 00 00 03 00 00 00”和数据信息“01 00 00 00 01 02 00 00 00 12 00 0001 04 01 00 00 01 08 00 CB CE B8 00 00 00 0000 00 00 07”;
其中,00 00 00 2A表示数据长度,00 00 00 03表示事件触发的标识(说明是第三次触发该事件),00表示响应标记,00 00表示没有错误而写入的两个状态码,01表示暂停政策中的暂停当前线程,00 00 00 01表示的是当前返回数据中包含的已触发的事件个数(当有多线程运行时,同一个断点可能被多个线程触发,就有多个事件被触发,本实施例中只有一个事件被触发),02表示中断事件,0000 00 12表示事件序列号,00 00 01 04表示事件触发线程ID,01表示类型标识,00 00 01 08表示引用类型标识,00 CB CE B8表示函数ID,00 00 00 00 00 00 00 07表示偏移信息。
在本发明实施例中,单步调节器的实现方式还有另一种方法,即实施例二中的步骤216-步骤225替换为216’-步骤219’,其他步骤的实现方式和实施例二相同,在此不再赘述;
步骤216’:从设置指令数据部分的解析结果中获取断点位置信息并进行存储,断点位置信息包括引用类型标识、引用类型ID、函数ID和偏移信息;
步骤217’:根据引用类型标识、引用类型ID、函数ID和偏移信息在预先下载到虚拟机中的Java卡程序中查找对应的位置,读取该位置的原字节码并保存,用特定字节码替换原字节码;
步骤218’:从设置指令数据部分的解析结果中获取虚拟机线程ID、Java卡程序的单步指令方式和单步调试方式;
步骤219’:将断点信息(包括原字节码和断点位置信息)和事件信息(包括事件种类、虚拟机线程ID、Java卡程序的单步指令方式和单步调试方式)一起添加到单步列表中,将事件写入到事件列表中生成事件序列号,将该事件序列号写入到响应缓存的第一预设位置,将单步标识置位。
相应的,在虚拟机进行调试时,虚拟机每读取一个字节码发送给处理装置并停止运行,处理装置接收到字节码后执行相应操作,即处理装置接收到调试指令的处理过程包括:
步骤401’:对调试指令进行解析,并从解析结果中获取字节码,判断获取的字节码是否为特殊字节码,是则执行步骤402’,否则结束,等待虚拟机下发指令;
步骤402’:判断解析结果中单步标识是否置位,是则执行步骤413’,否则执行步骤403’;
步骤402’具体为:判断事件列表中的单步调试标志的通知模式是否为1;
本实施例中,当单步调试标志位置时,本实施例的方法控制虚拟机进行单步调试,包括单步进入、单步跳出和单步跳出;
步骤403’:根据获取的字节码从虚拟机上的调试数据中获取函数信息;
步骤404’:根据函数信息从虚拟机上的调试数据中获取偏移信息;
本实施例中的偏移信息为当前运行代码在当前函数中的偏移值;
步骤405’:根据获取的函数信息和偏移信息在事件列表中查找对应的断点信息,如找到则执行步骤406’,如未找到则返回步骤401’;
本实施例中的步骤405’具体包括:在事件列表中的断点信息中查找是否有与获取的函数信息和特殊字节码相对应的原字节码,是则执行步骤406’,否则结束;
步骤406’:从事件列表的断点信息中读取对应的原字节码;
步骤407’:根据函数信息从虚拟机上的调试数据中获取类信息;
本实施例中的类信息包括:类、接口、数组等;
步骤408’:根据类信息从虚拟机上的调试数据中获取对应的类型标识;
步骤409’:根据类型标识从虚拟机上的调试数据中获取签名信息;
本实施例中的签名信息包括:类型名称、访问修饰符等;
步骤410’:根据签名信息从虚拟机上的调试数据中获取对应的返回数据;
本实施例中的函数信息、位置信息、类信息、类型标识、对应的数据等都是预先发送给虚拟机进行存储的;
本实施例中获取的数据包括:一个字节的暂停政策、四个字节的当前返回数据中包含的已触发的事件个数、一个字节的事件类型、四个字节的事件请求ID、四个字节事件触发线程ID和位置信息,其中位置信息包括一个字节的类型标识、四个字节的引用类型ID、四个字节的函数ID和八个字节的偏移信息;
其中,如当前操作是单步调试过程中的单步进入触发,事件类型为0;如当前操作是单步调试的单步跳过触发,事件类型为1;如当前操作是断点触发时,事件类型为2;如当前操作时单步调试的单步跳出时,事件类型为3;
步骤411’:按照预设格式设置第二返回数据,并将其发送给发送装置;
本实施例中的第二返回数据包括包头和数据部分,包头格式参照实施例一中的返回数据的包头格式,在此不再赘述,将获取的返回数据作为数据部分;
步骤412’:用原字节码替换虚拟机上当前运行的Java卡程序的特殊字节码,并给虚拟机返回单步提示信息;
本实施例中的发送装置可将接收的数据和信息显示出来,方便用户实时监测和查看;
步骤413’:根据获取的字节码从虚拟机上的调试数据中获取行信息;
步骤414’:根据行信息从虚拟机上的调试数据中获取函数信息,根据函数信息从虚拟机上的调试数据中获取的类信息;
本实施例中的类信息包括:类、接口、数组等;
步骤415’:根据类信息从虚拟机上的调试数据中获取引用类型标识;
步骤416’:根据引用类型标识从虚拟机上的调试数据中获取签名信息;
步骤417’:根据签名信息从虚拟机上的调试数据中获取对应的返回数据;
步骤418’:按照预设格式设置第二返回数据,并将其发送给发送装置;
步骤419’:用存储的原字节码代替虚拟机上当前运行的Java程序的特殊字节码,并给虚拟机返回单步提示信息;
虚拟机在接收到单步提示信息之后,如是断点调试,则虚拟机开始运行执行字节码;如是单步调试,则虚拟机开始运行执行字节码,进行单步调试。
在本发明实施例中,如处理装置设置在虚拟机中,则实施例二中的步骤213-步骤215相应的替换为s1-s3,其他步骤的实现方式和实施例二的步骤一样,在此不再赘述;
步骤s1:从设置指令数据部分的解析结果中获取Java卡程序行对应的栈信息和栈标号;
本实施例中,虚拟机可通过栈信息将触发事件(断点触发)反馈给发送装置;栈标号包括函数位置和偏移值;
步骤s2:根据栈标号在预先下载到虚拟机中的Java卡程序中查找对应的位置,读取该位置的原字节码并保存,用特殊字节码代替原字节码;
步骤s3:将断点信息(栈标号和原字节码)和事件种类一起添加到断点列表中,在事件列表中添加出栈事件生成事件序列号,将该事件序列号写入到响应缓存的第一预设位置。
相应的,在虚拟机进行调试时,虚拟机读取到字节码后先进行判断,如不是特殊字节码是则继续运行程序并读取下一个字节码;如是特殊字节码,则停止运行,进行调试操作,如单步标识置位,则执行单步调试操作,否则执行断点调试操作;即实施例三中的步骤401-步骤419所有操作都有虚拟机完成,分别替换为步骤401’’-步骤419’’:
步骤401’’:虚拟机读取当前运行的Java卡程序的字节码;
步骤402’’:虚拟机判断读取的字节码是否为特殊字节码,是则执行步骤403”,否则执行步骤413”;
步骤403’’:虚拟机根据获取的字节码从存储的调试数据中获取函数信息;
步骤404’’:虚拟机根据函数信息从存储的调试数据中获取偏移信息;
步骤405’’: 虚拟机根据获取的函数信息和偏移信息在事件列表中查找对应的断点信息,如找到则执行步骤406”,如未找到则返回步骤401”;
步骤406’’:虚拟机从事件列表的断点信息中读取对应的原字节码;
步骤407’’:虚拟机根据函数信息从存储的调试数据中获取类信息;
步骤408’’:虚拟机根据类信息从虚拟机上的调试数据中获取对应的类型标识;
步骤409’’:虚拟机根据类型标识从存储的调试数据中获取签名信息;
步骤410’’:虚拟机根据签名信息从存储的调试数据中获取对应的返回数据;
步骤411’’:虚拟机按照预设格式设置第二返回数据,并将其发送给发送装置;
步骤412’’:虚拟机用原字节码替换虚拟机上当前运行的Java卡程序的特殊字节码;
步骤413’’:判断事件列表中的单步调试标志是否置位,是则执行步骤414’’,否则返回步骤401’’;
步骤414’’:根据获取的字节码从预先下载存储的调试数据中获取行信息;
步骤415’’:根据行信息从调试数据中获取函数信息,根据函数信息从调试数据中获取的类信息;
本实施例中的类信息包括:类、接口、数组等;
步骤416’’:根据类信息从调试数据中获取引用类型标识;
步骤417’’:根据引用类型标识从调试数据中获取签名信息;
步骤418’’:根据签名信息从调试数据中获取对应的返回数据;
步骤419’’:按照预设格式设置第二返回数据,并将其发送给发送装置。
本实施例中,当单步调试标志置位,控制虚拟机进行单步进入调试时,获取虚拟机的栈个数为2(从java卡应用入口算),获取的栈顶位置为420;在虚拟机执行完该函数时即触发出栈事件,栈顶位置变成410(栈由10字节保存),栈个数变为 1。
本发明的处理装置可以和虚拟机分别单独设置进行工作,处理装置将接收到的设置指令进行处理并将结果返回给发送装置,处理装置在接收到调试指令时从虚拟机上获取当前执行的字节码进行判断处理,进而来控制虚拟机进行调试;或者处理装置也可以和虚拟机相互嵌套设置进行工作,处理装置将接收到的设置指令进行处理并将结果返回给发送装置,处理装置在接收到调试指令时从虚拟机上获取当前执行的字节码进行判断处理,进而来控制虚拟机进行调试;或者处理装置还可设置在虚拟机中进行工作,当虚拟机将接收到的设置指令进行处理并将结果返回给发送装置,虚拟机在接收到调试指令时获取当前执行的字节码进行判断处理,处理后进行调试操作。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (21)

1.一种JAVA卡调试信息的处理方法,其特征在于,包括:
步骤A:获取指令并检测指令类型,如是设置指令,则执行步骤B,如是调试指令,则执行步骤E,如是其他,则根据指令进行操作;
步骤B:按照预设规定对所述设置指令进行解析得到包头和数据部分,对所述包头进行解析,从所述设置指令包头的解析结果中获取请求ID和请求标记,判断所述请求标记是否为预设值,是则执行步骤C,否则给发送装置返回提示信息;步骤C:从所述设置指令包头的解析结果中获取命令集和命令,如所述命令集为事件请求命令集且所述命令对应的事件类型为设置事件,从所述解析结果中获取调节器,如是位置调节器则根据位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换所述原字节码,将所述原字节码写到事件列表中生成事件序列号,顺序执行步骤D;如是单步调节器,则设置单步调试信息,将事件写到事件列表中生成事件序列号,顺序执行步骤D;如所述命令对应的事件类型为其他事件则根据设置指令进行操作;如所述命令集为其他命令集则根据设置指令进行操作;
步骤D:根据预设规则设置第一返回数据,并将所述第一返回数据返回给发送装置;
步骤E:获取虚拟机上当前运行的Java卡程序的字节码,判断所述读取的字节码是否为特殊字节码,是则执行步骤F,否则执行步骤G;
步骤F:根据所述获取的字节码从事件列表中查找对应的原字节码并用所述原字节码替换所述获取的字节码,从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤G:判断事件列表中的单步调试标志是否置位,是则步骤H,否则返回步骤E;
步骤H:根据所述获取的字节码从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤I:根据所述预设规则设置第二返回数据,并将所述第二返回数据返回给发送装置。
2.如权利要求1所述的方法,其特征在于,所述步骤C和步骤E-步骤H分别替换为步骤C’和步骤E’-步骤H’;
步骤C’:从所述设置指令包头的解析结果中获取命令集和命令,如所述命令集为事件请求命令集且所述命令对应的事件类型为设置事件,从所述解析结果中获取调节器,如是位置调节器则根据位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换所述原字节码,将所述原字节码写到事件列表中生成事件序列号,顺序执行步骤D;如是单步调节器,则根据指令中的位置信息在虚拟机上运行的Java卡程序中查找原字节码,并用特殊字节码替换所述原字节码,并从指令中获取单步调试信息,将单步事件写到事件列表中生成事件序列号,顺序执行步骤D;如所述命令对应的事件类型为其他事件则根据设置指令进行操作;如所述命令集为其他命令集则根据设置指令进行操作;
步骤E’:对调试指令进行解析并从解析结果中获取字节码,判断所述获取的字节码是否为特殊字节码,是则执行步骤F’,否则结束本次操作,等待虚拟机下发指令;
步骤F’:判断事件列表中的单步调试标志是否置位,是则步骤G’,否则返回步骤H’;
步骤G’:根据所述获取的字节码从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I;
步骤H’:根据特殊字节码从事件列表中查找对应的原字节码并用所述原字节码替换所述特殊字节码,从所述虚拟机中的调试数据中获取返回数据,顺序执行步骤I。
3.如权利要求1所述的方法,其特征在于,所述步骤C替换为步骤C”;
步骤C”:从所述设置指令包头的解析结果中获取命令集和命令,如所述命令集为事件请求命令集且所述命令对应的事件类型为设置事件,从所述解析结果中获取调节器,如是位置调节器则根据指令中的断点位置信息从调试数据中读取对应的原字节码并保存,用特殊字节码代替所述原字节码;将所述断点位置信息事件种类一起添加到断点列表中,在事件列表中添加出栈事件生成事件序列号;如是单步调节器,则设置单步调试信息,将事件写到事件列表中生成事件序列号;如所述命令对应的事件类型为其他事件则根据设置指令执行操作;如所述命令集为其他命令集则根据设置指令执行操作。
4.如权利要求1-3任意一项所述的方法,其特征在于,所述步骤A中通过指令格式检测指令类型,具体包括:如所述指令的格式符合第一预设格式则为设置指令,如所述指令的格式符合APDU格式则为调试指令。
5.如权利要求1-3任意一项所述的方法,其特征在于,所述步骤A中获取指令包括:从命令缓存中获取指令或接收所述发送装置发送的指令。
6.如权利要求1-3任意一项所述的方法,其特征在于,在判断所述请求标记是否为预设值之前包括:
从所述设置指令包头的解析结果中获取指令长度,根据所述指令长度判断所述设置指令是否完整,如完整则判断所述设置指令是否为未处理指令,是则继续,否则结束,如不完整则结束。
7.如权利要求6所述的方法,其特征在于,所述根据所述指令长度判断所述设置指令是否完整,具体为:
所述判断所述设置指令所占字节是否与所述指令长度相符,是则所述设置指令完整,否则所述设置指令不完整。
8.如权利要求7所述的方法,其特征在于,所述判断所述请求标记是否为预设值,包括:判断所述获取的请求标记是否为0x00,是则执行步骤E,否则给发送装置返回提示信息。
9.如权利要求7所述的方法,其特征在于,所述给发送装置返回提示信息,具体包括:从所述设置指令的请求标记之后读取两字节的数据,并将所述读取的数据返回给发送装置。
10.如权利要求9所述的方法,其特征在于,所述步骤C具体包括:
步骤C1:从所述设置指令包头的解析结果中获取命令集和命令,并检测所述命令集的类型,如是事件请求命令集,则执行步骤C2,否则根据其他命令集进行操作;
步骤C2:判断所述命令对应的事件类型,如是清除单个断点事件,则执行步骤C3;如是清除所有断点事件,则执行步骤C5;如是设置事件,则执行步骤C8;
步骤C3:对所述设置指令的数据部分进行解析,从所述设置指令数据部分的解析结果中获取事件种类和事件请求ID,并根据所述事件种类和所述事件请求ID在事件列表中查找对应的事件,判断是否找到匹配的事件,是则执行步骤C4,否则给发送装置返回未找到匹配事件的信息;
步骤C4:结束当前操作清空所述响应缓存中的数据;
步骤C5:在所述事件列表中查找所有断点事件;
步骤C6:清空所述事件列表中的所有断点事件,并判断是否清空完成,是则执行步骤C7,否则给发送装置返回错误信息;
步骤C7:清空所述响应缓存中的数据并结束当前操作;
步骤C8:从所述设置指令数据部分的解析结果中获取事件种类和暂停政策;
步骤C9:从所述设置指令数据部分的解析结果中获取调节器个数,根据所述调节器个数分配事件处理需要的缓存;
步骤C10:判断所述调节器个数是否为0,是则给所述发送装置返回错误信息,否则执行步骤C11;
步骤C11:从所述设置指令数据部分的解析结果中获取调节器的种类,如是位置调节器,则进行设置断点操作;如是单步调节器,则进行设置单步操作;如是其他调节器,则进行其他调节器的操作;如不是调节器,则给发送装置返回错误信息。
11.如权利要求10所述的方法,其特征在于,所述步骤C1中检测所述命令集的类型具体包括:判断所述获取的命令集的值是否为15,是则为事件请求命令集,否则为其他命令集。
12.如权利要求10所述的方法,其特征在于,所述步骤C2具体包括:检测所述获取的命令所对应的值,如是01则事件类型为设置事件,如是02则事件类型为清除事件,如是03则事件类型为清除所有断点事件。
13.如权利要求10所述的方法,其特征在于,所述步骤C11中判断调节器的种类,具体包括:
检测从所述设置指令数据部分的解析结果中的调解器个数之后获取的值,如是8则为位置调节器,如是12则为单步调节器,如获取的数据与预设值不符则不是调节器。
14.如权利要求10所述的方法,其特征在于,所述步骤C11中的进行设置断点操作,包括:
步骤C12:从所述设置指令数据部分的的解析结果中获取断点位置信息并进行存储,所述断点位置信息包括引用类型标识、引用类型ID、函数ID和偏移信息;
步骤C13:根据所述引用类型标识、引用类型ID、函数ID和偏移信息在预先下载到所述虚拟机中的Java卡程序中查找对应的位置,读取所述对应位置的原字节码并保存,用特定字节码替换所述对应位置的原字节码;
步骤C14:将断点信息和所述事件种类一起添加到断点列表中,所述断点信息包括所述原字节码和断点位置信息;
步骤C15:将事件写入到事件列表中生成事件序列号,将所述事件序列号写入到所述响应缓存的第一预设位置。
15.如权利要求14所述的方法,其特征在于,所述步骤C11中的进行设置单步操作,包括:
步骤C16:从所述设置指令数据部分的解析结果中获取虚拟机线程ID、应用程序的单步指令方式和单步调试方式;
步骤C17:判断所述单步指令方式是否为第一指令方式或所述单步调试方式是否为单步进入,是则执行步骤C21,否则执行步骤C18;
步骤C18:从所述设置指令数据部分的解析结果中获取当前运行的Java卡程序行对应的栈信息;
步骤C19:判断所述单步指令方式是否为第二指令方式,是则执行步骤C20,否则执行步骤C21;
步骤C20:从所述设置指令数据部分的解析结果中获取与所述栈信息对应的栈标号,顺序执行步骤C21;
步骤C21:判断所述单步调试方式是否为单步进入,是则执行步骤C22,否则执行步骤C24;
步骤C22:在所述事件列表中添加栈事件;
步骤C23:将事件列表中的单步调试标志置位;
步骤C24:判断所述设置单步操作的处理是否完成,是则执行步骤C25,否则给发送装置返回错误信息;
步骤C25:将所述获取的虚拟机线程ID、单步指令方式、单步调试方式存储于事件列表中,生成事件序列号并将所述事件序列号写入到响应缓存的第一预设位置。
16.如权利要求15所述的方法,其特征在于,所述步骤C23具体为:将事件列表中的单步调试标志的通知模式设置为1。
17.如权利要求15所述的方法,其特征在于,所述步骤D根据预设规定在响应缓存中设置第一返回数据,包括:
步骤D1:在所述响应缓存的第二预设位置写入与所述请求ID对应的响应ID和与所述请求标记匹配的响应标记;
步骤D2:在所述响应缓存的第三预设位置写入两个字节的状态码,并判断所述状态码是否为0,是则执行步骤D3,否则执行步骤D4;
步骤D3:在所述响应缓存的第四预设位置写入操作结果的实际数据长度,顺序执行步骤D5;
步骤D4:在所述响应缓存的第四预设位置写入返回的最小数据长度,顺序执行步骤D5;
步骤D5:判断所述响应缓存的第三预设位置上的数据长度是否大于0,是则将所述第一返回数据返回给发送装置,并清空所述响应缓存中的第一返回数据,否则直接清空所述响应缓存中的第一返回数据。
18.如权利要求16所述的方法,其特征在于,所述步骤F具体包括:
步骤F1:根据所述获取的字节码从所述虚拟机上的调试数据中获取函数信息,根据所述函数信息从所述虚拟机上的调试数据中获取所述字节码的偏移信息;
步骤F2:根据所述函数信息和所述偏移信息在断点列表中查找对应的断点信息,如找到则执行步骤F3,如未找到则返回步骤E;
步骤F3:从所述断点信息中读取与所述特殊字节码对应的原字节码;
步骤F4:根据所述函数信息从所述虚拟机上的调试数据中获取类信息,根据所述类信息从所述虚拟机上的调试数据中获取类型标识,根据所述类型标识从所述虚拟机上的调试数据中读取相应的签名信息,根据所述签名信息从所述虚拟机上的调试数据中获取对应的返回数据;
步骤F5:用所述原字节码替换所述虚拟机上当前运行的Java卡程序中的所述特殊字节码。
19.如权利要求18所述的方法,其特征在于,所述步骤F2具体包括:
在所述断点列表中的断点信息中查找是否有与所述函数信息和所述特殊字节码相对应的原字节码,是则执行步骤F3,否则给所述发送装置返回错误信息。
20.如权利要求17所述的方法,其特征在于,所述步骤H具体包括:
根据所述读取的字节码从所述虚拟机上的调试数据中读取行信息,根据所述行信息从所述虚拟机上的调试数据中获取函数信息,根据所述函数信息从所述虚拟机上的调试数据中获取类信息,根据所述类信息从所述虚拟机上的调试数据中获取引用类型标识,根据所述引用类型标识从所述虚拟机上的调试数据中获取相应的签名信息,根据所述签名信息从所述虚拟机上的调试数据中获取对应的返回数据。
21.如权利要求1所述的方法,其特征在于,所述步骤G具体包括:判断事件列表中的单步调试标志的通知模式是否为1,是则置位,否则未置位。
CN201210258652.6A 2012-07-24 2012-07-24 一种Java卡调试信息的处理方法 Active CN102855186B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210258652.6A CN102855186B (zh) 2012-07-24 2012-07-24 一种Java卡调试信息的处理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210258652.6A CN102855186B (zh) 2012-07-24 2012-07-24 一种Java卡调试信息的处理方法

Publications (2)

Publication Number Publication Date
CN102855186A true CN102855186A (zh) 2013-01-02
CN102855186B CN102855186B (zh) 2014-10-29

Family

ID=47401789

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210258652.6A Active CN102855186B (zh) 2012-07-24 2012-07-24 一种Java卡调试信息的处理方法

Country Status (1)

Country Link
CN (1) CN102855186B (zh)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104331657A (zh) * 2014-09-29 2015-02-04 飞天诚信科技股份有限公司 一种支持数据签名的java卡实现方法
CN105955886A (zh) * 2016-04-23 2016-09-21 珠海保税区星汉智能卡股份有限公司 一种基于解释型语言的异常断点调试方法
CN106201893A (zh) * 2016-07-21 2016-12-07 恒宝股份有限公司 一种Java字节码调试器及调试方法
CN109582526A (zh) * 2017-09-28 2019-04-05 北京国双科技有限公司 一种数据获取方法及装置
CN110096442A (zh) * 2019-04-25 2019-08-06 深圳市码上趣学科技有限公司 代码调试方法、用户设备、存储介质及装置
CN111083123A (zh) * 2019-11-29 2020-04-28 北京和德宇航技术有限公司 一种设备故障处理方法、装置、设备和存储介质
CN111752845A (zh) * 2020-06-30 2020-10-09 江苏恒宝智能系统技术有限公司 一种调试工具及其调试方法和系统
CN112073356A (zh) * 2019-06-10 2020-12-11 海信视像科技股份有限公司 一种数据传输方法及显示设备
CN113836046A (zh) * 2021-11-29 2021-12-24 武汉天喻信息产业股份有限公司 Mcu上虚拟机应用程序调试方法及系统
CN115048317A (zh) * 2022-08-16 2022-09-13 北京智芯半导体科技有限公司 测试方法、测试系统和计算机可读存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1271896A (zh) * 1999-04-23 2000-11-01 太阳微系统有限公司 调试优化代码的方法和设备
US20020019976A1 (en) * 1998-12-08 2002-02-14 Patel Mukesh K. Java hardware accelerator using thread manager
JP2011107752A (ja) * 2009-11-12 2011-06-02 Ntt Docomo Inc 情報処理装置、通信システムおよびプログラム

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020019976A1 (en) * 1998-12-08 2002-02-14 Patel Mukesh K. Java hardware accelerator using thread manager
CN1271896A (zh) * 1999-04-23 2000-11-01 太阳微系统有限公司 调试优化代码的方法和设备
JP2011107752A (ja) * 2009-11-12 2011-06-02 Ntt Docomo Inc 情報処理装置、通信システムおよびプログラム

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104331657B (zh) * 2014-09-29 2017-03-22 飞天诚信科技股份有限公司 一种支持数据签名的java卡实现方法
CN104331657A (zh) * 2014-09-29 2015-02-04 飞天诚信科技股份有限公司 一种支持数据签名的java卡实现方法
CN105955886A (zh) * 2016-04-23 2016-09-21 珠海保税区星汉智能卡股份有限公司 一种基于解释型语言的异常断点调试方法
CN106201893A (zh) * 2016-07-21 2016-12-07 恒宝股份有限公司 一种Java字节码调试器及调试方法
CN106201893B (zh) * 2016-07-21 2018-11-06 恒宝股份有限公司 一种Java字节码调试器及调试方法
CN109582526A (zh) * 2017-09-28 2019-04-05 北京国双科技有限公司 一种数据获取方法及装置
CN110096442A (zh) * 2019-04-25 2019-08-06 深圳市码上趣学科技有限公司 代码调试方法、用户设备、存储介质及装置
CN112073356B (zh) * 2019-06-10 2022-07-19 海信视像科技股份有限公司 一种数据传输方法及显示设备
CN112073356A (zh) * 2019-06-10 2020-12-11 海信视像科技股份有限公司 一种数据传输方法及显示设备
CN111083123A (zh) * 2019-11-29 2020-04-28 北京和德宇航技术有限公司 一种设备故障处理方法、装置、设备和存储介质
CN111083123B (zh) * 2019-11-29 2020-11-27 北京和德宇航技术有限公司 一种设备故障处理方法、装置、电子设备和存储介质
CN111752845A (zh) * 2020-06-30 2020-10-09 江苏恒宝智能系统技术有限公司 一种调试工具及其调试方法和系统
CN113836046B (zh) * 2021-11-29 2022-02-15 武汉天喻信息产业股份有限公司 Mcu上虚拟机应用程序调试方法及系统
CN113836046A (zh) * 2021-11-29 2021-12-24 武汉天喻信息产业股份有限公司 Mcu上虚拟机应用程序调试方法及系统
CN115048317A (zh) * 2022-08-16 2022-09-13 北京智芯半导体科技有限公司 测试方法、测试系统和计算机可读存储介质
CN115048317B (zh) * 2022-08-16 2022-11-29 北京智芯半导体科技有限公司 测试方法、测试系统和计算机可读存储介质

Also Published As

Publication number Publication date
CN102855186B (zh) 2014-10-29

Similar Documents

Publication Publication Date Title
CN102855186B (zh) 一种Java卡调试信息的处理方法
CN101403983B (zh) 基于虚拟机的多核处理器的资源监控方法及系统
US8505025B2 (en) Method and apparatus for recording web application process
EP1172729B1 (en) Apparatus and method for cataloguing symbolic data for use in performance analysis of computer programs
CN110362483B (zh) 性能数据采集方法、装置、设备及存储介质
CN107800757B (zh) 用户行为记录方法及装置
WO2000045257B1 (en) Executing programs for a first computer architecture on a computer of a second architecture
JP2009516239A (ja) コンピュータアプリケーションの追跡及びモニタリングを行う汎用のマルチインスタンスメソッド及びgui検出システム
US20080244332A1 (en) Machine instruction level race condition detection
CN103577310A (zh) 记录软件调试日志的方法以及装置
EP3230869A1 (en) Separating test verifications from test executions
CN112765032A (zh) 程序调试方法、装置、设备及存储介质
US7502967B1 (en) Identifying an object in a data file that causes an error in an application
CN111245742B (zh) 数据的缓冲方法、装置、计算机和可读存储介质
CN108829575B (zh) 测试案例推荐方法、电子装置及可读存储介质
CN110688245A (zh) 信息获取方法、装置、存储介质及设备
US10795667B2 (en) Facilitating data type detection using existing code
CN116451271A (zh) 一种应用软件的隐私政策自动提取方法
JP2014041390A (ja) 設計・開発支援システム
CN101650688B (zh) 一种访问vm_io地址空间的方法和用户态调试器
CN105243022B (zh) 主机应用软件系统的性能数据分析方法及装置
US7934067B2 (en) Data update history storage apparatus and data update history storage method
CN110096281A (zh) 代码解析方法、解析服务器、存储介质及装置
CN110889104B (zh) 一种Android系统设备的数据采集方法和装置
US20140032752A1 (en) Computer, resource usage calculation method, and resource usage calculation program

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant