首页> 中国专利> Java语言程序与虚拟机程序共同调试的方法

Java语言程序与虚拟机程序共同调试的方法

摘要

本发明提供一种Java语言程序与虚拟机程序共同调试的方法,包括在一操作系统平台的Java语言调试集成模块中编写应用程序单元,并在C语言调试集成模块中编写虚拟机单元,在应用程序单元中设置多个主调函数模块,赋予每一主调函数模块以唯一的ID号,设定主调函数模块的参数以及异常处理机制,在虚拟机单元中设置与多个主调函数模块一一对应的多个被调函数模块;在该操作系统平台上建立应用程序单元与虚拟机单元的通信关系,并运行应用程序单元及虚拟机单元;对异常处理机制发现的任一主调函数模块存在的错误代码进行修改。本发明的调试方法让开发人员直观地调试Java语言编写的应用程序单元,提高调试效率。

著录项

  • 公开/公告号CN101430662A

    专利类型发明专利

  • 公开/公告日2009-05-13

    原文格式PDF

  • 申请/专利权人 东信和平智能卡股份有限公司;

    申请/专利号CN200810219963.5

  • 发明设计人 沈志成;施伟周;

    申请日2008-12-09

  • 分类号G06F11/36(20060101);

  • 代理机构44262 珠海智专专利商标代理有限公司;

  • 代理人张中;段淑华

  • 地址 519060 广东省珠海市南屏科技工业园屏工中路8号

  • 入库时间 2023-12-17 21:57:44

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2012-10-24

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F11/36 变更前: 变更后: 申请日:20081209

    专利权人的姓名或者名称、地址的变更

  • 2010-10-06

    授权

    授权

  • 2009-08-26

    实质审查的生效

    实质审查的生效

  • 2009-05-13

    公开

    公开

说明书

技术领域

本发明涉及一种Java语言程序的调试方法,尤其是基于Windows平台下Java语言程序与应用C语言编写的虚拟机程序共同调试的方法。

背景技术

Java语言作为一种成熟的编程语言,已经广泛应用到各种应用程序的编程中。如现有的电信智能卡大多使用Java语言编写应用程序,并将应用程序存储在智能卡中,应用这些应用程序实现各种功能,如存储电话号码、手机上网等等。

现有应用Java语言编程的电信智能卡中大多设有应用C语言或C++语言编写的虚拟机单元,用于支持并执行应用Java语言编写的应用程序单元。现有的Java语言编写的应用程序单元与应用C语言编写的虚拟机单元结构示意框图。

现有的电信智能卡中,包括有应用Java语言编写应用程序单元10,其中应用程序单元10包括有多条Java代码,每一Java代码被编译成相应的字节码,存储在电信智能卡的存储器中。同时,电信智能卡还包括由C语言编写的虚拟机单元20,在虚拟机单元20中设置有虚拟PC指针,虚拟PC指针指向当前执行的字节码。电信智能卡运行应用程序单元10时,虚拟PC指针指向当前指向的字节码,并逐一解析并执行该字节码。

电信智能卡的应用程序开发人在开发应用程序单元10时,需要在Windows操作系统平台下,应用Java语言调试集成模块,如eclipse等,编写Java语言的应用程序单元10,并且在C语言调试集成模块,如VC等,应用C语言或C++语言编写虚拟机单元20。由于应用Java语言编写的应用程序单元10与应用C语言编写的虚拟机单元20难免出现错误的Java代码,运行应用程序单元10及虚拟机单元20时会出现异常。因此,初次编写完毕的应用程序单元10与虚拟机单元20需要经过调试来发现并对错误的代码进行修改。

现有的应用程序单元10与虚拟机单元20调试时,首先在Windows操作系统平台的Java语言调试集成模块与C语言调试集成模块中分别运行应用程序单元10以及虚拟机单元20,此时虚拟机单元20的虚拟PC指针指向应用程序单元10的字节码,并逐一解析并执行这些字节码。当虚拟机单元20执行字节码时出现异常,虚拟机单元20将显示C语言程序中出现异常的代码,开发人员需要通过虚拟PC指针查找出现异常的字节码,开发人员即找出出现错漏的字节码。

但是,这种调试方法让调试人员查找出现异常的字节码,而并不显示出现错误的Java语言程序的代码,这要求开发人员对Java代码编译成的字节码非常熟悉,必须知道每一字节码与Java代码的对应关系。

若开发人员对字节码并不十分熟悉,则上述调试方法变得很不直观,开发人员需要通过字节码查找对应的Java代码,使调试效率降低,不利于对电信智能卡进行快速高效地开发。

现有的单独对Java语言程序调试方法中,大多设置异常处理机制,具体过程是:预先定义Java语言程序运行过程中可能出现的异常类型,并赋予异常ID号。Java语言程序运行过程中出现异常时,Java语言程序将异常抛出,并判断该异常属于哪一类型以及异常的ID号,Java语言程序通过异常的类型以及ID号将所抛出的异常捕获。这样,调试人员通过捕获的异常判断哪一Java代码出现异常,并对错误代码进行修改。

发明内容

针对上述问题,本发明主要目的是提供一种有效提高调试效率的Java语言程序与虚拟机程序共同调试方法;

本发明另一目的是提供一种便于开发人员直观地调试Java语言程序的Java语言程序与虚拟机程序共同调试方法。

为了实现上述的主要目的,本发明提供的Java语言程序与虚拟机程序共同调试的方法包括在一操作系统平台的Java语言调试集成模块中应用Java语言编写应用程序单元,在应用程序单元中设置多个主调函数模块,每一主调函数模块包含有多条Java代码,并赋予每一主调函数模块以唯一的ID号,设定每一主调函数模块的参数,并设定主调函数模块的异常处理机制;

在该操作系统平台的C语言调试集成模块中应用C语言编写虚拟机单元,在虚拟机单元中设置与多个主调函数模块一一对应的多个被调函数模块,该被调函数模块用于执行对应的主调函数模块的Java代码;

在该系统平台上建立应用程序单元与虚拟机单元的通信关系,并分别在Java语言调试集成模块与C语言调试集成模块中运行应用程序单元及虚拟机单元;

对异常处理机制发现的任一主调函数模块存在的错误代码进行修改,即通过异常处理机制发现出现异常的主调函数模块,并对出现异常的主调函数模块中所存在的错误代码进行修改。

由上述方案可见,虚拟机单元中设有多个用于执行应用程序单元主调函数模块的被调函数模块,应用程序单元运行时,虚拟机单元的被调函数模块逐一执行应用程序单元的主调函数模块,当被调函数模块运行出现异常时,应用程序单元可通过主调函数模块中的异常处理机制查找出现异常的主调函数模块,并在应用程序单元中对该主调函数模块中出现的错误代码进行修改。

当然,部分异常是开发人员编写应用程序单元时主动设置在主调函数模块中,即出现异常的主调函数模块并不一定存在错误代码,开发人员发现出现异常的主调函模块后,判断该主调函数模块是否存在错误代码,若存在错误代码,便对错误代码进行修改。

这样,由于应用程序单元并不编译成字节码执行,出现异常时开发人员无需通过字节码查找出现异常的Java代码,可直观地对主调函数模块中的Java代码进行修改,提高开发效率。

一个优选的方案是,应用程序单元运行时,其执行主调函数模块,将该主调函数模块的ID号以及参数传送至虚拟机单元,虚拟机单元根据接收到的主调函数模块ID号查找对应的被调函数模块,并将主调函数模块的参数传送给被调函数模块;

被调函数模块应用接收到的参数运行,并判断运行过程中是否出现异常,若出现异常,则将出现异常的信息传送至应用程序单元;

应用程序单元接收到出现异常的信息后,查找哪一主调函数模块出现异常。

由此可见,调试Java语言编写的应用程序时,虚拟机单元并不针对应用程序单元的字节码进行解析执行,而是直接应用被调函数模块执行每一主调函数模块,并在被调函数模块运行出现异常时将异常抛出,并且应用程序单元根据接收到的异常信息查找哪一主调函数模块出现异常。这样,开发人员可直观地查看哪一主调函数模块出现异常,可直接看到出现错误的Java代码或C代码,并对其进行修改,大大提高调试效率。

进一步的方案是,在虚拟机单元中设置被调函数模块后,对每一被调函数模块赋予唯一的ID号,并且每一被调函数模块的ID号与每一主调函数模块的ID号一一对应。

这样,应用程序单元运行时,虚拟机单元通过被调函数模块的ID号能更准确地找出与主调函数模块对应的被调函数模块,从而提高调试的可靠性。并且,设置被调函数模块的ID号也能方便开发人员对设置的被调函数模块进行管理与修改,给虚拟机单元的开发与调试带来便利。

附图说明

图1是现有应用程序单元与虚拟机单元的结构示意框图;

图2是本发明实施例中应用程序单元与虚拟机单元的结构示意框图;

图3是本发明实施例中主调函数模块与其对应的被调函数模块的部分代码图;

图4是本发明实施例的流程图。

以下结合附图及实施例对本发明作进一步说明。

具体实施方式

本发明的调试方法是在Windows操作系统平台下对应用Java语言编写的应用程序单元10与应用C语言或C++语言编写的虚拟机单元20进行调试。进行调试前,需要在Windows操作系统平台下,分别在Java语言调试集成模块,如eclipse编写好的应用程序单元10,并在C语言调试集成模块,如VC中编写虚拟机单元20,应用程序单元10以及虚拟机单元20结构框图如图2所示。

应用Java语言编写应用程序单元10时,在应用程序单元10中设置多个主调函数模块,如图中的主调函数模块11、12、13以及14,并且赋予每一主调函数模块以唯一的ID号,如主调函数模块11的ID号为0x00fa。每一主调函数模块中均包含有若干Java语言编写的代码,这样,Java代码便与主调函数模块建立一一对应关系。

同时,设置主调函数模块时,还设置该主调函数模块的参数,例如设置主调函数模块11时,设定其包含的参数,包括变量以及主调函数模块11所应用的各种对象等。

并且,主调函数模块中设置异常处理机制,如图3中的主调函数模块11中包含有“getNativeException()”的Java代码,用于捕获异常并对捕获的异常进行处理。

编写应用程序单元10的同时,开发人员在Windows操作系统平台下,应用C语言或C++语言编写用于支持并执行应用程序单元10的虚拟机单元20。虚拟机单元20中设有多个被调函数模块,如图2所示的,虚拟机单元20包含有被调函数模块21、22、23以及24,并且每一被调函数模块与每一主调函数模块对应,例如被调函数模块21与主调函数模块11对应,调函数模块22与主调函数模块12对应等。每一被调函数模块均用于解析并执行其对应的主调函数模块中的Java代码,即被调函数模块21用于执行主调函数模块11中的Java代码。

设置被调函数模块的同时,赋予每一被调函数模块以唯一的ID号,被调函数模块的ID号与其对应的主调函数模块的ID号一一对应。优选的,可以设置被调函数模块的ID号与其对应的主调函数的ID号相同,例如被调函数模块21的ID号为0x00fa,即与主调函数模块11的ID号一致。

当然,被调函数模块的ID号也可以是对应主调函数的ID号经过一定的规则运算获得,只要确保每一被调函数模块的ID号唯一确定,并且与对应的主调函数模块ID号一一对应即可。

虚拟机单元20还可以设有参数存储模块25,用于存储应用程序单元10运行时传送到虚拟机单元20的主调函数模块的参数,包括当前运行主调函数模块的变量以及各种对象等。当被调函数模块运行时,虚拟机单元20将存储在参数存储模块25中的参数传送给被调函数模块,被调函数模块应用这些参数运行,并判断运行过程中是否出现异常。

开发人员编写完毕应用程序单元10以及虚拟机单元20后,建立应用程序单元10与虚拟机单元20之间的通信关系。本实施例中,应用程序单元10与虚拟机单元20之间是通过Windows操作系统平台下的TLP224通讯协议进行数据的收发。

例如,应用程序单元10与虚拟机单元20之间的通讯是通过Java语言调试集成模块eclipse与C语言调试集成模块VC之间应用TLP224协议实现的,其中TLP224通讯协议是基于socket通讯方式进行数据传输。当然,实际应用时,还可以使用其他的通信协议进行通信,这并不影响本发明的实施。

建立通讯关系后,开发人员在Windows操作系统平台下对应用程序单元10以及虚拟机单元20进行调试,调试流程如图4所示。

调试时,开发人员分别在Java语言调试集成模块eclipse与C语言调试集成模块VC运行应用程序单元10以及虚拟机单元20,即执行步骤S1。运行应用程序单元10时,虚拟机单元20将解析并执行应用程序单元中的Java代码。当然,本实施例中,Java代码的执行是通过虚拟机单元20中的被调函数模块逐一执行对应主调函数模块中的Java代码实现的。

应用程序单元10执行主调函数模块时,将主调函数模块的ID号传送至虚拟机单元20中。例如,运行如图3中所示的主调函数模块11时,首先应用“callNativeMethod(helloNative)”代码调用对应的被调函数模块,并将主调函数模块11的ID号,即0x00fa传送至虚拟机单元20,也就是执行步骤S2。虚拟机单元20接收到该ID号后,执行步骤S3,查找与该ID号相对应的被调函数模块。

本实施例中,被调函数模块21的ID号也为0x00fa,且被调函数模块21为与主调函数模块11对应的被调函数模块,因此虚拟机单元20通过被调函数模块21的ID号辨别出与主调函数模块11向对应的被调函数模块为被调函数模块21。当然,若被调函数模块21的ID号与主调函数模块11不一致,而是与主调函数模块21的ID号形成一定的对应关系,虚拟机单元20也应该通过对应关系查找出与主调函数模块11向对应的被调函数模块21。

虚拟机单元20查找出主调函数模块11对应的被调函数模块21后,执行步骤S4,判断被调函数模块21运行过程中需要使用的参数信息,并将这些参数信息传送到应用程序单元10。

应用程序单元10接收到这些参数信息后,将主调函数模块中的参数传送至虚拟机单元20的参数存储模块25中。例如图3中,主调函数模块11应用“sendParaStart()”等代码将参数传送至虚拟机单元20中。参数存储模块25将接收到的参数传送到被调函数模块21,被调函数模块21应用这些参数运行,即执行步骤S5。

被调函数模块21运行过程中,执行步骤S6,判断运行是否出现异常,若被调函数模块21运行时出现异常,则表示主调函数模块11中的Java代码可能存在错误,虚拟机单元20执行步骤S7,将出现异常的信息,包括异常的类型以及异常的ID号传送至应用程序单元10。

若被调函数模块21运行时没有出现异常,表示主调函数模块11的Java代码正确,虚拟机单元20执行步骤S8,将被调函数模块21运行的结果传送至应用程序单元10。

应用程序单元10接收到虚拟机单元20返回的数据后,执行步骤S9,判断上传的数据是出现异常的信息还是被调函数模块正常运行所获得的运行结果,也就是进行异常过滤。

如前所述的,若被调函数模块21运行时出现异常,应用程序单元10接收到的是异常类型以及异常的ID号信息,应用程序单元10即判断被调函数模块运行出现异常,执行步骤S10。若被调函数模块21运行没有出现异常,则虚拟机单元20向应用程序单元10返回的是被调函数模块21的运行结果。当然,一部分被调函数模块正常运行时没有返回运行结果时,则不向应用程序单元10返回运行结果。应用程序单元10接收到被调函数模块21的运行结果,即判断被调函数模块21运行正常,执行步骤S12。

步骤S10中,应用程序单元10判断异常的类型以及异常的ID号,并将异常抛出,即将异常重做一遍。然后,主调函数模块11应用异常处理机制将该抛出的异常捕获,即执行步骤S11。由于每一异常均有一ID号,异常处理机制通过异常的类型以及ID号判断应用程序单元10抛出的异常是否为主调函数模块11所对应的异常,从而实现应用程序单元10查找哪一主调函数模块出现异常。

主调函数模块运行时可能出现异常的类型预先存储在应用程序单元10中,并建立一个异常表。当主调函数模块运行出现异常时,应用程序单元10通过查找异常表来判断主调函数模块出现的异常属于哪一类型的异常以及判断异常的ID号,并将该异常抛出。

主调函数模块11捕获对应的异常后,开发人员即可在Windows操作系统平台下直观地看到哪一主调函数模块出现异常,并判断主调函数模块是否存在错误代码,并对错误的Java代码进行修改。

最后,应用程序单元10执行步骤S12,判断应用程序单元10是否运行结束,若没有运行结束,则返回执行步骤S2,运行下一主调函数模块,直至应用程序单元10运行结束。

由上述方案可见,调试过程中,若应用程序单元10中有Java代码不正确,开发人员即可直观地看到出现异常的主调函数模块,并判断哪一Java代码出现错漏,能在Java语言编写的应用程序单元10中直接发现问题,让开发人员直观的对应用程序单元10进行调试,不需要通过字节码判断出错的Java代码,提高调试效率。

当然,上述实施例仅是本发明优选的实施方式,实际应用时,本发明还可以有更多的变化,例如,当应用程序单元向虚拟机单元发送的主调函数模块的参数为一组数组时,可预先在参数存储模块中分配一段空间,该段空间为一数据栈,利用该段空间接收并创建数组对象并将数组存储到数据栈中。当被调函数模块运行需要调用数组时,将数组从数据栈中读取相应参数。

并且,调试过程中,应用程序单元可以将主调函数模块的ID号以及参数一并发送至虚拟机单元,或者虚拟机单元只有在被调函数模块运行出现异常是返回被调函数模块信息,而在被调函数模块运行正常时不返回任何信息等;又或者在Linux操作系统平台下编写并调试应用程序单元以及虚拟机单元,这些改变也同样可以实现本发明的目的。

当然,本发明的调试方法不仅可应用于对电信智能卡的Java语言程序进行调试,还可以对其他领域中的Java语言程序以及C语言程序共同调试的场合中。

最后,需要强调的是,本发明不限于上述实施方式,诸如被调函数模块ID号与主调函数模块ID对应规则的改变、建立应用程序单元与虚拟机单元通信关系的通信协议的改变、虚拟机单元编写语言的改变等微小变化也应该包括在本发明的保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号