具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
实施例一、DEBUG调试方法。下面结合图1对本实施例的方法进行说明。
图1中,S100、针对包含有至少一个调试关键点的程序而言,在该程序开始被执行时,获取该程序执行的参与主体的标识信息。
具体的,本实施例中的程序是指基于PHP的程序,如使用PHP开发的基于Web服务的应用程序等;且该程序中的调试关键点可以是利用现有的工具自动设置的调试关键点,如利用FIREPHP工具在程序中自动设置的调试关键点;当然,程序中的调试关键点也可以是程序开发人员根据实际需求而在程序中自行手工设置的调试关键点。
通常情况下,程序中的数据库操作、Memcache操作、网络调用等资源类操作通常都会被设置为需要产生DEBUG信息的调试关键点。
本实施例可以对程序的入口进行相应的改进,如在程序的入口处新增设置相应的程序代码,以便于在程序开始被执行时,新增设置的程序代码首先被执行。由于在程序中新增设置的程序代码的作用包括获取该程序执行的参与主体的标识信息;因此,在该程序开始被执行时,本实施例可以首先获取到程序执行的参与主体的标识信息。
本实施例中的程序执行的参与主体可以为执行该程序的服务器,也可以为:该程序当前所服务的用户;因此,本实施例中的程序执行的参与主体的标识信息可以为服务器的IP地址或者服务器ID,也可以为用户的IP地址或者用户的登录账号(即用户ID)等;该标识信息应能够唯一标识出程序执行的参与主体。
S110、判断上述获取到的参与主体的标识信息是否属于预先设定的参与主体标识集合;如果该参与主体的标识信息属于预先设定的参与主体标识集合,则到S120;如果该参与主体的标识信息不属于预先设定的参与主体标识集合,则到S130。
具体的,本实施例中的参与主体标识集合是预先设置的,如在Web开发过程中,可以将开发环境中运行该程序的服务器的IP地址或者服务器的ID预先设置在该参与主体标识集合中;再如,在程序正式上线后,如果接收到某用户上报的故障信息,则可以将该用户的IP地址或者用户的ID设置在该参与主体标识集合中。
该参与主体标识集合可以由运行该程序的服务器进行维护,且该参与主体标识集合可以设置于该程序内部,也可以独立于该程序而设置,如设置于数据库或者表中,这样,在上述判断过程中,会涉及到数据库或者表的查询访问操作。
该参与主体标识集合通常会包含有一个或者多个参与主体标识。本步骤中的判断获取到的参与主体的标识信息是否属于预先设定的参与主体标识集合是指参与主体的标识信息是否与参与主体标识集合中的某个参与主体标识匹配;也就是说,如果获取到的参与主体的标识信息与参与主体标识集合中的一个参与主体标识匹配,则表示该参与主体的标识信息属于预先设定的参与主体标识集合,否则,表示该参与主体的标识信息不属于预先设定的参与主体标识集合。
在该参与主体标识集合为空的情况下,上述获取到的参与主体的标识信息一定不属于该参与主体标识集合。
S120、将程序的调试开关的当前取值设置为第一值,然后,到S140。
具体的,该程序的调试开关可以为常量,如布尔型常量或者数值型常量等,在该调试开关的当前值被设置为第一值或者第二值后,在该程序的后续执行过程中,该调试开关的取值通常不会发生变化。另外,该程序的调试开关也可以表现为标志位等其他形式。
上述第一值可以为true,也可以为0或者其他预定数值等。
S130、将程序的调试开关的当前取值设置为第二值,然后,到S140。
具体的,第二值与上述第一值不相同,例如,第一值为true时,第二值为false;再如,第一值为0,第二值为1。另外,在Web开发过程中,该调试开关的缺省值可以设置为第一值,而在程序上线后,该调试开关的缺省值可以设置为第二值。
在本实施例中,第一值表示调试开关开启,第二值表示调试开关关闭。
另外,需要说明的是,上述S100至S130均应设置于程序的入口处,如在程序的入口处新增设置相应的程序代码以执行上述S100-S130的操作。
S140、在该程序执行到每一调试关键点时,均需要获取调试开关的当前取值。
具体的,在程序执行到一调试关键点时,该调试关键点处设置的调试信息均会被执行,且均会先获取调试开关(如上述布尔型常量)的当前取值。
S150、判断该调试开关的当前取值,如果该调试开关的当前取值为第一值,则到S160;如果调试开关的当前取值为第二值,则到S170。
S160、根据当前执行到的调试关键点处设置的调试信息产生相应的DEBUG信息,并继续执行该程序中的后续内容。
具体的,调试关键点处设置的调试信息包括DEBUG命令,该DEBUG命令用于产生关键点的日志(即该DEBUG命令用于打印关键点的日志),从而产生相应的DEBUG信息。本实施例中的通过执行DEBUG命令而产生相应的DEBUG信息的过程也可以称为打印DEBUG信息。
本实施例所产生的DEBUG信息可以包括:请求URL信息、POST信息、Cookie信息、程序执行debug信息、页面返回内容以及执行时间等等。
S170、不执行S160中记载的产生相应的DEBUG信息的操作,并继续执行该程序中的后续内容。
具体的,在调试开关的当前取值为第二值的情况下,表示该程序在本次运行过程中不需要进行调试,因此,应忽略当前执行的调试关键点处设置的调试信息中的DEBUG命令,而继续执行程序中的非调试部分的程序代码。
S180、将DEBUG信息传输至程序调试客户端。
具体的,本实施例中的DEBUG信息可以在产生后立即向程序调试客户端发送,也可以在该程序执行完成时,将所有的DEBUG信息一起向程序调试客户端发送。
在Web开发过程中,DEBUG信息被传输至程序调试客户端的一个具体的例子为:在基于一个关键点处的调试信息产生了DEBUG信息后,即刻产生一HTTP消息,并将当前产生的DEBUG信息以Json格式承载于当前产生的该HTTP消息的头域中,之后,将该HTTP消息传输至程序调试客户端。通常情况下,程序调试客户端可以设置于运行该程序的设备(如服务器)中。另外,本实施例也可以采用其他格式(如自定义格式)将DEBUG信息承载于HTTP消息的头域中,相应的,在DEBUG信息的呈现过程中,也应采用相应的方式对DEBUG信息进行解析并显示。
在远程调试过程中,DEBUG信息被传输至程序调试客户端的一个具体的例子为:利用ShutDown函数在程序中注册一DEBUG信息传输函数,该DEBUG信息传输函数主要用于以异步队列的方式将DEBUG信息传输至调试中心(如调试中心管理后台);通常情况下,该调试中心与运行该程序的设备(如服务器)为两台相互独立设置的物理设备。该程序在执行过程中,被执行到的关键点处设置的调试信息产生的DEBUG信息被暂时存储起来,在该程序执行完成或者该程序执行了退出(EXIT)操作时,上述注册的DEBUG信息传输函数被调用,这样,该DEBUG信息传输函数将上述暂时存储的所有DEBUG信息以异步队列的方式传输至调试中心,调试中心在接收到DEBUG信息之后,将该DEBUG信息以Json格式或者其他格式(如自定义格式)承载于HTTP消息的头域中,然后,调试中心将该HTTP消息传输至程序调试客户端,由程序调试客户端将DEBUG信息呈现给维护人员。通常情况下,该程序调试客户端设置于调试中心所在的物理设备中。
由上述实施例的描述可知,本实施例的DEBUG调试方法并不属于单步调试技术;由于程序在开始运行时,会根据程序执行的参与主体的标识信息设置调试开关开启或者关闭,且程序中的各调试关键点处设置的调试信息会根据调试开关的当前取值来决定是否执行DEBUG信息的打印处理,因此,在程序上线后无需删除程序中的调试信息,并且不会对上线后的程序的正常运行产生影响;通过对程序执行的参与主体的标识信息是否属于参与主体标识集合进行判断,不仅可以方便的实现Web开发模式的程序调试,而且,也可以方便的获知针对上报故障的用户的程序运行状态,从而可以非常方便的针对上报故障的用户实现远程程序调试;因此,无论是Web开发模式,还是远程程序调试模式,本实施例均可以实现问题的快速分析定位;另外,在Web开发模式下,由于本实施例的DEBUG信息可以以Json格式承载于HTTP消息的头域中传输至程序调试客户端,因此,不仅不会影响Web的开发效率,而且也不会破坏原有页面的BODY源代码结构,进而在存在AJAX请求时,不会出现数据结构错误的问题。
实施例二、Web开发过程中的DEBUG调试方法。下面结合图2对本实施例的方法进行说明。
在Web开发过程中,应预先在需要关注的关键点(如资源点)处设置调试信息,例如,在Memcache的increment操作处设置的调试信息可以如下所示:
其中,DAGGER_DEBUG为布尔型常量,主要用于控制后面的debug命令是否执行,即控制其后面设置的debug命令是否开启,DAGGER_DEBUG是本实施例中的调试开关。
在程序开始运行时,先获取当前服务器的IP地址,并判断该服务器的IP地址是否属于预先设定的服务器IP地址集合,之后,根据该判断的结果设置DAGGER_DEBUG的当前取值。由于本实施例是在Web开发环境中,因此,预先设定的服务器IP地址集合中设置有当前服务器的IP地址,从而当前服务器的IP地址一定属于预先设定的服务器IP地址集合,进而,DAGGER_DEBUG应被设置为表征调试开关开启的信息。
在用户访问相应的页面时,上述increment操作中设置的调试信息会产生相应的DEBUG信息,该DEBUG信息以基于Json格式的方式承载于HTTP消息的头域中,该HTTP消息传输至程序调试客户端,HTTP消息的头域中的DEBUG信息可以通过本地浏览器的控制台呈现给开发人员,如HTTP消息的头域中的DEBUG信息经Firephp工具解析后,开发人员可以从Firefox浏览器下方的firebug控制台看到相应的DEBUG信息。
上述increment操作中设置的调试信息产生的DEBUG信息的一个具体的例子可参见下述内容:
Mc_connect:127.0.0.1:11211;
Mc_set(dogger_abc),ttl(0):1
Mc_increment(dagger_abc):2
其中,mc_increment(dagger_abc):2是上述DEBUG命令输出的信息。
一个比较完整的DEBUG信息如图2所示。在图2中,数组部分是可以展开呈现的。开发人员通过阅读DEBUG信息可以充分了解程序中的各关键点的执行情况,从而可以对程序中的问题进行快速定位。
实施例三、远程程序调试过程中的DEBUG调试方法。下面结合图3对本实施例的方法进行说明。
在程序的入口处设置有用于打开远程程序调试的程序代码,该程序代码的一个具体的例子为:
也就是说,在用户ID为“303426817”或者为“254659189”时,该程序的远程程序调试功能被打开。上述用户ID也可以替换为用户IP地址等。
在程序开始运行时,应先获取用户ID(如从来自用户的HTTP消息中获取用户ID),并判断该用户ID是否属于预先设定的用户ID集合(即上述程序代码中的array()数组),之后,根据该判断的结果设置DAGGER_DEBUG的当前取值(如“true”or“false”)。由于本实施例是在远程程序调试环境中,因此,在接收到用户上报故障信息的情况下,应将该上报故障的用户的用户ID设置于array()数组中,从而上报故障的用户的用户ID一定会属于上述array()数组,进而,DAGGER_DEBUG应被设置为表征调试开关开启的信息,如true。
在本实施例中,由于该程序的远程程序调试功能被打开,因此,程序中各关键点处设置的调试信息均会产生DEBUG信息,这些DEBUG信息均被暂时存储起来,在程序执行完成时,所有被暂时存储的DEBUG信息以异步队列的方式被传输至调试中心,调试中心将其接收到DEBUG信息以Json格式承载于HTTP消息的头域中,然后,调试中心将HTTP消息传输至程序调试客户端。该程序调试客户端(如Firephp工具的客户端)在其调试信息按钮被维护人员点击时,本地浏览器的控制台为维护人员呈现DEBUG信息。本地浏览器的控制台为维护人员呈现的DEBUG信息的一个具体的例子如图3所示。
实施例四、DEBUG调试装置。下面结合图4对该装置进行详细说明。
图4中示出的装置主要包括:第一获取模块400、第一处理模块410、第二获取模块420以及第二处理模块430。
第一获取模块400主要适于在包含有至少一个调试关键点的程序开始被执行时,获取程序执行的参与主体的标识信息。
具体的,本实施例中的程序是指基于PHP的程序,如使用PHP开发的基于Web服务的应用程序等;且该程序中的调试关键点可以是利用现有的工具自动设置的调试关键点,如利用FIREPHP工具在程序中自动设置的调试关键点;当然,程序中的调试关键点也可以是程序开发人员根据实际需求而在程序中自行手工设置的调试关键点。
通常情况下,程序中的数据库操作、Memcache操作、网络调用等资源类操作通常都会被设置为需要产生DEBUG信息的调试关键点。
本实施例可以对程序的入口进行相应的改进,如在程序的入口处新增设置第一获取模块400,以便于在程序开始被执行时,新增设置的第一获取模块400首先被执行,获取到程序执行的参与主体的标识信息。
本实施例中的程序执行的参与主体可以为执行该程序的服务器,也可以为:该程序当前所服务的用户;因此,本实施例中的程序执行的参与主体的标识信息可以为服务器的IP地址或者服务器ID,也可以为用户的IP地址或者用户的登录账号(即用户ID)等;该标识信息应能够唯一标识出程序执行的参与主体。
第一处理模块410主要适于判断参与主体的标识信息是否属于预先设定的参与主体标识集合;如果属于预先设定的参与主体标识集合,则将程序的调试开关的当前取值设置为第一值,否则,将程序的调试开关的当前取值设置为第二值;其中,第一值表示调试开关开启,第二值表示调试开关关闭;
具体的,本实施例中的参与主体标识集合是预先设置的,如在Web开发过程中,可以将开发环境中运行该程序的服务器的IP地址或者服务器的ID预先设置在该参与主体标识集合中;再如,在程序正式上线后,如果接收到某用户上报的故障信息,则可以将该用户的IP地址或者用户的ID设置在该参与主体标识集合中。
该参与主体标识集合可以由运行该程序的服务器进行维护,且该参与主体标识集合可以设置于该程序内部,也可以独立于该程序而设置。
该参与主体标识集合通常会包含有一个或者多个参与主体标识。第一处理模块410判断获取到的参与主体的标识信息是否属于预先设定的参与主体标识集合是指参与主体的标识信息是否与参与主体标识集合中的某个参与主体标识匹配;也就是说,如果第一处理模块410判断出第一获取模块400获取到的参与主体的标识信息与参与主体标识集合中的一个参与主体标识匹配,则表示该参与主体的标识信息属于预先设定的参与主体标识集合,否则,表示该参与主体的标识信息不属于预先设定的参与主体标识集合。
在该参与主体标识集合为空的情况下,第一处理模块410判断出第一获取模块400获取到的参与主体的标识信息一定不属于该参与主体标识集合。
该程序的调试开关可以为常量,如布尔型常量或者数值型常量等,在第一处理模块410将该调试开关的当前值设置为第一值或者第二值后,在该程序的后续执行过程中,该调试开关的取值通常不会发生变化。另外,该程序的调试开关也可以表现为标志位等其他形式。
第二值与上述第一值不相同,如第一值为true时,第二值为false;再如,第一值为0,第二值为1。另外,在Web开发过程中,该调试开关的缺省值可以设置为第一值,而在程序上线后,该调试开关的缺省值可以设置为第二值。第一值表示调试开关开启,第二值表示调试开关关闭。
另外,需要说明的是,上述第一获取模块400和第一处理模块410均应设置于程序的入口处。
第二获取模块420主要适于在程序被执行到每一调试关键点时,均获取调试开关的当前取值。
具体的,第二获取模块420的数量可以为多个,且程序中的每个调试关键点处均会设置一第二获取模块420;这样,在程序每执行到一个调试关键点处时,该调试关键点处设置的第二获取模块420均会被执行,且均会先获取调试开关(如上述布尔型常量)的当前取值。
第二处理模块430主要适于判断调试开关的当前取值;如果调试开关的当前取值为第一值,则根据当前执行的调试关键点处设置的调试信息产生相应的DEBUG信息,继续执行该程序,且该DEBUG信息被传输至程序调试客户端;如果调试开关的当前取值为第二值,则不执行上述DEBUG信息的产生操作,并继续执行该程序。
具体的,调试关键点处设置的第二处理模块430中的调试信息包括DEBUG命令,该DEBUG命令用于产生关键点的日志(即该DEBUG命令用于打印关键点的日志),从而产生相应的DEBUG信息。
第二处理模块430产生的DEBUG信息可以包括:请求URL信息、POST信息、Cookie信息、程序执行debug信息、页面返回内容以及执行时间等等。
在调试开关的当前取值为第二值的情况下,表示该程序在本次运行过程中不需要进行调试,因此,应忽略当前执行的调试关键点处设置的第二处理模块430中的调试信息中的DEBUG命令,从而可以继续执行程序中的非调试部分的程序代码。
第二处理模块430可以在DEBUG信息产生后,立即向程序调试客户端发送,也可以在该程序执行完成时,将所有的DEBUG信息一起向程序调试客户端发送。
在Web开发过程中,第二处理模块430将DEBUG信息传输至程序调试客户端的一个具体的例子为:在基于一个关键点处的调试信息产生了DEBUG信息后,第二处理模块430即刻产生一HTTP消息,并将当前产生的DEBUG信息以Json格式承载于当前产生的该HTTP消息的头域中,之后,第二处理模块430将该HTTP消息传输至程序调试客户端。另外,第二处理模块430也可以采用其他格式(如自定义格式)将DEBUG信息承载于HTTP消息的头域中,相应的,在DEBUG信息的呈现过程中,也应采用相应的方式对DEBUG信息进行解析并显示。
在远程调试过程中,第二处理模块430将DEBUG信息传输至程序调试客户端的一个具体的例子为:利用ShutDown函数在程序中注册一DEBUG信息传输函数(该DEBUG信息传输函数属于第二处理模块430),该DEBUG信息传输函数主要用于以异步队列的方式将DEBUG信息传输至调试中心(如调试中心管理后台);通常情况下,该调试中心与运行该程序的设备(如服务器)为两台相互独立设置的物理设备。该程序在执行过程中,被执行到的关键点处设置的调试信息产生的DEBUG信息被第二处理模块430暂时存储起来,在该程序执行完成或者该程序执行了退出(EXIT)操作时,上述注册的DEBUG信息传输函数被调用,这样,该DEBUG信息传输函数将上述第二处理模块430暂时存储的所有DEBUG信息以异步队列的方式传输至调试中心,调试中心在接收到DEBUG信息之后,将该DEBUG信息以Json格式或者其他格式(如自定义格式)承载于HTTP消息的头域中,然后,调试中心将该HTTP消息传输至程序调试客户端,由程序调试客户端将DEBUG信息呈现给维护人员。
A1、一种DEBUG调试方法,其包括:
在包含有至少一个调试关键点的程序开始被执行时,获取程序执行的参与主体的标识信息;
判断所述参与主体的标识信息是否属于预先设定的参与主体标识集合;
如果属于预先设定的参与主体标识集合,则将所述程序的调试开关的当前取值设置为第一值,否则,将所述程序的调试开关的当前取值设置为第二值;其中,所述第一值表示调试开关开启,所述第二值表示调试开关关闭;
在所述程序被执行到每一调试关键点时,均获取调试开关的当前取值;
判断所述调试开关的当前取值;
如果为第一值,则根据当前执行的调试关键点处设置的调试信息产生相应的DEBUG信息,继续执行所述程序,且所述DEBUG信息被传输至程序调试客户端;如果为第二值,则不执行上述DEBUG信息的产生操作,并继续执行所述程序。
A2、如A1所述的方法,其中,所述程序执行的参与主体包括:执行所述程序的服务器或者所述程序当前所服务的用户。
A3、如A2所述的方法,其中,所述程序执行的参与主体的标识信息包括:服务器的IP地址、用户的IP地址或者用户的登录账号。
A4、如A1所述的方法,其中,所述程序的调试开关为常量。
A5、如A1所述的方法,其中,在Web开发过程中,所述DEBUG信息被传输至程序调试客户端包括:
将所述DEBUG信息承载于HTTP消息的头域中,并将所述HTTP消息传输至程序调试客户端。
A6、如A1所述的方法,其中,在远程调试过程中,所述DEBUG信息被传输至程序调试客户端包括:
将所述DEBUG信息以异步队列的方式传输至调试中心,且所述调试中心将接收到的DEBUG信息承载于HTTP消息的头域中,并将所述HTTP消息传输至程序调试客户端。
A7、如A5或A6所述的方法,其中,所述DEBUG信息以Json格式承载于HTTP消息的头域中。
A8、如A7所述的方法,其中,所述将所述DEBUG信息以异步队列的方式传输至调试中心包括:
在所述程序执行完成或者执行了退出操作时,调用通过ShutDown函数注册的DEBUG信息传输函数,所述DEBUG信息传输函数将所述DEBUG信息以异步队列的方式传输至调试中心。
A9、一种DEBUG调试装置,其包括:
第一获取模块,适于在包含有至少一个调试关键点的程序开始被执行时,获取程序执行的参与主体的标识信息;
第一处理模块,适于判断所述参与主体的标识信息是否属于预先设定的参与主体标识集合;如果属于预先设定的参与主体标识集合,则将所述程序的调试开关的当前取值设置为第一值,否则,将所述程序的调试开关的当前取值设置为第二值;其中,所述第一值表示调试开关开启,所述第二值表示调试开关关闭;
第二获取模块,适于在所述程序被执行到每一调试关键点时,均获取调试开关的当前取值;
第二处理模块,判断所述调试开关的当前取值;如果为第一值,则根据当前执行的调试关键点处设置的调试信息产生相应的DEBUG信息,继续执行所述程序,且所述DEBUG信息被传输至程序调试客户端;如果为第二值,则不执行上述DEBUG信息的产生操作,并继续执行所述程序。
A10、如A9所述的装置,其中,该程序执行的参与主体包括:执行所述程序的服务器或者所述程序当前所服务的用户。
A11、如A10所述的装置,其中,所述程序执行的参与主体的标识信息包括:服务器的IP地址、用户的IP地址或者用户的登录账号。
A12、如A9所述的装置,其中,所述程序的调试开关为常量。
A13、如A9所述的装置,其中,在Web开发过程中,所述DEBUG信息被传输至程序调试客户端包括:
第二处理模块将所述DEBUG信息承载于HTTP消息的头域中,并将所述HTTP消息传输至程序调试客户端。
A14、如A9所述的装置,其中,在远程调试过程中,所述DEBUG信息被传输至程序调试客户端包括:
第二处理模块将所述DEBUG信息以异步队列的方式传输至调试中心,且所述调试中心将接收到的DEBUG信息承载于HTTP消息的头域中,并将所述HTTP消息传输至程序调试客户端。
A15、如A13或A14所述的装置,其中,所述DEBUG信息以Json格式承载于HTTP消息的头域中。
A16、如A14所述的装置,其中,所述第二处理模块将所述DEBUG信息以异步队列的方式传输至调试中心包括:
在所述程序执行完成或者执行了退出操作时,第二处理模块调用通过ShutDown函数注册的DEBUG信息传输函数,所述DEBUG信息传输函数将所述DEBUG信息以异步队列的方式传输至调试中心。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的DEBUG调试装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(如计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是,上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二以及第三等的使用不表示任何顺序。可将这些单词解释为名称。