JAVA总结学习笔记

学问大,知识多

基于远程怎么调试JAVA呢?

基于远程怎么调试JAVA呢?
JAVA的长途调试 基于Java Platform Debugger Architecture(JPDA:Java平台调试架构)。 JVM 自身支撑指定参数来让java顺序以调试形式启动。虚拟机运转在调试形式下,你只需去衔接他的响应的监听端口就可以了。

像tomcat等效劳器也都供应了指定调试参数的设置办法

典型的调试参数如下
-Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n

典型的衔接 调试端口的敕令如下,以jdk自带的敕令行调试 东西jdb为例。

衔接 192.29.24.62 的8888 端口
/build/java/jdk1.6.0_03/bin/jdb -attach 192.29.24.62:8888    

下面这句和上面采用attach参数的上面一句一样的结果。但是采用 -connect的指定了具体了,有时从windows的机械上去衔接上面
Linux的机械,上面阿谁不可,但是这句就可以。
/build/java/jdk1.6.0_03/bin/jdb -connect   com.sun.jdi.SocketAttach:port=8888,hostname=192.29.24.62

在 Eclipse 中也有长途调试 选项的了,“run” -》 “Open Debug Dialog” -》“Remote Java Application” 阿谁就是。
在选项里面选定详细的“项目” “代码目次”等,填好ip、端口,最终点下面的“ 调试 ”按钮就行了,启动后下断点,等等都和本机调试无异。留意的是本机的代码和在长途机上运转的代码应该是一致的

<img style=\"WIDTH: 580px; HEIGHT: 464px\" class=\"blogimg\" border=\"0\" src=\"http://hiphotos.baidu.com/widebright/pic/item/e122e9c4eb5214a68226ac06.jpg\" width=\"580\" height=\"464\" small=\"0\" />

----------------jdb 用法----------------
C:\\Program Files\\Java\\jdk1.6.0_03\\bin>jdb -help
用法:jdb <选项> <类> <参数>

个中选项包罗:
    -help             输出此音讯并退出
    -sourcepath <以 \";\" 分隔的目次>
                      在个中查找源文件的目次
    -attach <地址>
                      运用规范衔接器衔接到正在指定地址运转的 VM
    -listen <地址>
                      等候正在指定地址运转的 VM 运用规范衔接器进行衔接
    -listenany
                      等候正在恣意可用地址运转的 VM 运用规范衔接器进行衔接
    -launch
                      立刻启动 VM,而不等候 \'run\' 敕令
    -listconnectors   列出此 VM 中可用的衔接器
    -connect <衔接器称号>:<称号 1>=<值 1>,...
                      运用定名的衔接器和列出的参数值衔接到目的 VM
    -dbgtrace [标记] 输出用于调试 jdb 的信息
    -tclient          在 Hotspot(TM) Performance Engine(客户机)中运转使用顺序
    -tserver          在 Hotspot(TM) Performance Engine(效劳器)中运转使用顺序

转发给被调试历程的选项:
    -v -verbose[:class|gc|jni]
                      启用具体形式
    -D<称号>=<值> 设置系统属性
    -classpath <以 \";\" 分隔的目次>
                      列出要在个中查找类的目次
    -X<选项>        非规范目的 VM 选项

<类> 是要开端调试的类的称号
<参数> 是传递给 <类> 的 main() 办法的参数

要取得敕令协助,请在 jdb 提醒符下键入 \'help\'

C:\\Program Files\\Java\\jdk1.6.0_03\\bin>jdb
正在初始化 jdb...
> help
** 敕令列表 **
connectors                -- 列出此 VM 中可用的衔接

run [类 [参数]]        -- 开端执行使用顺序的主类

threads [线程组]     -- 列出线程
thread <线程 ID>        -- 设置默许线程
suspend [线程 ID]    -- 暂停线程(默许值为 all)
resume [线程 ID]     -- 恢复线程(默许值为 all)
where [<线程 ID> | all] -- 转储线程的仓库
wherei [<线程 ID> | all] -- 转储线程的仓库以及 pc
up [n 帧]             -- 向上挪动线程的仓库
down [n 帧]           -- 向下挪动线程的仓库
kill <线程 ID> <表达式>   -- 中止具有给定的异常对象
interrupt <线程 ID>     -- 中缀线程

print <表达式>              -- 输出表达式的值
dump <表达式>               -- 输出一切对象信息
eval <表达式>               -- 核算表达式的值(与
set = <表达式>     -- 为字段/变量/数组元素
locals                    -- 输出当时仓库帧中的一切

classes                   -- 列出当时已知的类
class <类 ID>          -- 显示已定名类的具体信息
methods <类 ID>        -- 列出类的办法
fields <类 ID>         -- 列出类的字段

threadgroups              -- 列出线程组
threadgroup <称号>        -- 设置当时线程组

stop in <类 ID>.<办法>[(参数类型,...)]
                          -- 在办法中设置断点
stop at <类 ID>:<行> -- 在行中设置断点
clear <类 ID>.<办法>[(参数类型,...)]
                          -- 肃清办法中的断点
clear <类 ID>:<行>   -- 肃清行中的断点
clear                     -- 列出断点
catch [uncaught|caught|all] <类 ID>|<类形式>
                          -- 呈现指定的异常时中缀
ignore [uncaught|caught|all] <类 ID>|<类形式>
                          -- 关于指定的异常,作废
watch [access|all] <类 ID>.<字段名>
                          -- 看管对字段的拜访/修正
unwatch [access|all] <类 ID>.<字段名>
                          -- 中止看管对字段的拜访/
trace [go] methods [thread]
                          -- 跟踪办法的进入和退出。
                          -- 除非指定 \'go\',不然所
trace [go] method exit | exits [thread]
                          -- 跟踪当时办法的退出或所
                          -- 除非指定 \'go\',不然所
untrace [办法]         -- 中止跟踪办法的进入和/或退
step                      -- 执行当时行
step up                   -- 执行到当时办法返回其调
stepi                     -- 执行当时指令
next                      -- 跳过一行(跨过挪用)
cont                      -- 从断点处持续执行

list [line number|method] -- 输出源代码
use(或 sourcepath)[源文件途径]
                          -- 显示或更改源途径
exclude [<类形式>, ...|“无”]
                          -- 不申报指定类的步调或方
classpath                 -- 从目的 VM 输出类途径信

monitor <敕令>         -- 每次顺序中止时执行敕令
monitor                   -- 列出看管器
unmonitor <看管器号>      -- 删除某个看管器
read <文件名>           -- 读取并执行某个敕令文件

lock <表达式>               -- 输出对象的锁信息
threadlocks [线程 ID]   -- 输出线程的锁信息

pop                       -- 弹出整个仓库,且包括当
reenter                   -- 与 pop 效果一样,但重
redefine <类 ID> <类文件名>
                          -- 从新界说类代码

disablegc <表达式>          -- 制止对象的渣滓收受接管
enablegc <表达式>           -- 答应对象的渣滓收受接管

!!                        -- 反复执行最终一个敕令
<敕令>             -- 将敕令反复执行 n 次
# <敕令>               -- 抛弃(不执行)
help(或 ?)               -- 列出敕令
version                   -- 输出书本信息
exit(或 quit)            -- 退出调试器

<类 ID>: 带有软件包限制符的完好类名
<类形式>: 带有前导或后缀通配符 (*) 的类名
<线程 ID>: \'threads\' 敕令中所申报的线程号
<表达式>: Java(TM) 编程言语表达式。
支撑大大都经常见语法。

可以将启动敕令置于 \"jdb.ini\" 或 \".jdbrc\" 之中
(两者位于 user.home 或 user.dir 中)
>

==========参考文档=======================================


什么是JPDA
  Java Platform Debugger Architecture(JPDA:Java平台调试架构) 由Java虚拟机后端和调试平台前端构成
  1.Java虚拟机供应了Java调试的功用
  2.调试平台经过调试交互和谈向Java虚拟机恳求效劳以对在虚拟机中运转的顺序进行调试
  JPDA的构架
  JPDA经过两个接口和和谈来完成如上的阐明,辨别是JVMTI(Java虚拟机东西接口)、JDWP(Java调试连线和谈)和JDI(Java调试接口)。
  1.JVMTI界说了虚拟机应该供应的调试效劳,包罗调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和告诉(Notification譬如抵达某个断点时告诉客户端),该接口由虚拟机完成者供应完成,并连系在虚拟机中
2.JDWP界说调试效劳和调试器之间的通讯,包罗界说调试信息花样和调试恳求机制
3.JDI在言语的高条理上界说了调试者可以运用的调试接口以能便利地与长途的调试效劳进行交互,Java言语完成,调试器完成者可直接运用该接口拜访虚拟机调试效劳。

  运转方法
  当虚拟机的调试效劳运转时,虚拟机作为调试的效劳供应端,监听一个衔接,而调试器经过该衔接与虚拟机进行交互。当前,Windows平台的JVM供应了两种方法的衔接:共享内存和 Socket衔接,共享内存的效劳供应端和调试端只能位于统一台机,而Socket衔接则支撑分歧异机调试,即长途调试。

  虚拟机参数设置
  1.启用调试效劳
    -Xdebug 启用调试
    -Xrunjdwp:<sub-options> 加载JVM的JPDA参考完成库
  2.Xrunjdwp子参数(sub-options)装备
    Xrunjdwp子参数的装备花样如下
    -Xrunjdwp:[=],[=]...

  几个例子
  -Xrunjdwp:transport=dt_socket,server=y,address=8000
  在8000端口监听Socket衔接,挂起VM而且不加载运转主函数直到调试恳求抵达
  -Xrunjdwp:transport=dt_shmem,server=y,suspend=n
  选择一个可用的共享内存(由于没有指address)并监听该内存衔接,还加载运转主函数
  -Xrunjdwp:transport=dt_socket,address=myhost:8000
  衔接到myhost:8000供应的调试效劳(server=n,以调试客户端存在),挂起VM而且不加载运转主函数
  -Xrunjdwp:transport=dt_shmem,address=mysharedmemory
  经过共享内存的方法衔接到调试效劳,挂起VM而且不加载运转主函数
  -Xrunjdwp:transport=dt_socket,server=y,address=8000,
  onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
  等候java.io.IOException被抛出,然后挂起VM并监听8000端口衔接,在接到调试恳求后以敕令/usr/local/bin/debugstub dt_socket myhost:8000执行
  -Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\\bin\\debugstub.exe
  等候一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试恳求后以敕令d:\\bin\\debugstub.exe dt_shmem

执行,
是可用的共享内存

  启动tomcat
-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n

以上两行是tomcat5.5.12的catalina.bat文件中的一句,可以看出tomcat在JPDA方法下是怎样启动的,启动tomcat要用catalina jpda start来启动,不克不及用startup.bat启动,启动前设置好JPDA_TRANSPORT,JPDA_ADDRESS就OK了

-------------------------------------
Java长途调试
其实就是运用了JDK的JPDA,在启动效劳器(Jboss或许Tomcat等)的敕令行参数里面加上:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

以Eclipse作为调试东西的话,创立一个Remote Java Application,衔接参数填写准确的IP和端口(就是上面的8787)就行了

起首,JAVA本身支撑调试功用,并供应了一个简略的调试东西--JDB,相似于功用强壮的GDB,JDB也是一个字符界面的调试情况,并支撑设置断点,支撑线程线级的调试。
------------------------------------------------
JAVA的调试办法如下:
1。起首支撑JVM,并设置参数,使之任务在DEBUG形式下,参加参数:-Xdebug -Xrunjdwp,transport=dt_socket,server=y,address=5432,suspend=n,onthrow=java.io.IOException,launch=/sbin/echo
个中,-Xdebug是告诉JVM任务在DEBUG形式下,-Xrunjdwp是告诉JVM运用(java debug wire protocol)来运转调试情况。该参数还了一系列的调试选项:
transport指定了调试数据的传送方法,dt_socket是指用SOCKET形式,尚有dt_shmem指用共享内存方法,个中,dt_shmem只合用于Windows平台。
server参数是指能否支撑在server形式的VM中.
onthrow指明,当发生该类型的Exception时,JVM就会中缀下来,进行调式。该参数可选。
launch指明,当JVM被中缀下来时,执行的可执行顺序。该参数可选
suspend指明,能否在调试客户端树立起来后,再执行JVM。
onuncaught(=y或n)指明呈现uncaught exception 后,能否中缀JVM的执行.

2。启动调试东西。
最简略的调试东西就是上面提到的JDB,以上述调试用JVM为例,可以用下面的命运转启动JDB:
jdb -connect com.sun.jdi.SocketAttach:port=5432,hostname=192.168.11.213
别的,还有很多的可视化调试东西,如 eclipse,jsawt等等。Eclipses可用 ant debug来树立一个调试办法。

posted on 2012-01-27 07:32 李林 阅读(155) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: