`

java 远程调试备忘

 
阅读更多
远程调试java程序

http://hi.baidu.com/widebright/blog/item/fb4c3b12e81ad455f819b825.html

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的机器,上面那个不行,不过这句就可以。详细见sun文档http://doc.javanb.com/javasdk-docs-1-5-0/guide/jpda/conninv.html#JDB
/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、端口,最后点下面的“ 调试 ”按钮就行了,启动后下断点,等等都和本机调试无异。注意的是本机的代码和在远程机上运行的代码应该是一致的。

----------------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 <lvalue> = <表达式>     -- 为字段/变量/数组元素
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> <命令>             -- 将命令重复执行 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:<name1>[=<value1>],<name2>[=<value2>]...

  几个例子
  -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 <address>执行,<address>是可用的共享内存

  启动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来建立一个调试方法。
分享到:
评论

相关推荐

    Java日历及备忘录

    Java日历及备忘录程序是一个实用的桌面应用程序,它模仿了Windows操作系统中的日历功能,并添加了备忘录管理特性。这个程序的核心是利用Java编程语言实现的,旨在帮助用户方便地查看日期并设置提醒,提高个人或工作...

    java实现备忘时钟

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个备忘时钟应用程序。这个项目非常适合初学者,因为它涵盖了基础的Java编程概念,如时间处理、事件监听和用户界面设计。我们将逐步解析实现这样一个功能所需的...

    日历备忘录Java源码

    在本项目中,"日历备忘录Java源码" 提供了一套完整的日历应用程序的源代码,主要由四个核心文件组成:NotePad.java、CalendarPad.java、Month.java 和 Year.java。这些文件分别代表了备忘录、日历、月份和年份的功能...

    用JAVA编写的备忘录

    用JAVA编写的备忘录, 可以记录下你每天做的事情,可以查看你以前做的事情,很有帮助

    Java设计模式-备忘录

    **Java设计模式——备忘录模式详解** 备忘录模式是一种行为设计模式,它允许对象在不破坏封装性的前提下捕获并存储其内部状态,以便稍后恢复到该状态。这种模式常用于在游戏中保存进度、撤销/重做操作、以及在复杂...

    备忘录JAVA代码

    【标题】"备忘录JAVA代码"涉及到的核心知识点主要集中在Java编程语言以及备忘...通过实现这样的备忘录应用,开发者可以锻炼到实际项目开发中的诸多方面,从需求分析到代码实现,再到测试和调试,整个过程都能得到锻炼。

    java开发备忘录

    Java开发备忘录是程序员在进行Java编程时的重要参考资料,它涵盖了从基础知识到高级特性的全方位内容。以下是一些关键的Java开发知识点,基于提供的信息,我们无法获取具体子文件的详细内容,所以将根据Java的常规...

    java+Mysql开发的备忘录系统

    在本项目中,我们讨论的是一个使用Java编程语言与MySQL数据库进行开发的备忘录系统。这个系统的主要目标是提供一套便捷的工具,让用户能够轻松地管理他们的日常事务,包括创建、编辑、查找和删除备忘录。同时,系统...

    Java反射备忘录

    在“Java反射备忘录”中,我们可能探讨了以下核心概念: 1. 反射机制的基本概念:Java反射提供了一种在运行时分析类和对象的能力,使得程序能够动态地创建对象、调用方法、访问和修改字段值,即使这些信息在编译时...

    调试备忘录-SWD协议解析 - 洛神殇 - 博客园1

    SWD,全称为Serial Wire Debug Port,是ARM CoreSight调试架构中的一种低引脚数的调试接口,与JTAG Debug Port并存,是用于芯片调试和编程的重要方式。相较于JTAG,SWD仅需三根线(SWDIO、SWDCLK和GND)就能实现数据...

    PDA.rar_PDA_java PDA_备忘录_日志备忘

    【标题】"PDA.rar_PDA_java PDA_备忘录_日志备忘" 提供了一个关于使用Java编程语言开发的个人数字助理(PDA)应用的信息。这个PDA软件具备日志记录、电话簿管理和备忘录功能,旨在帮助用户在日常生活或工作中进行...

    Java 综合案例 可编辑备忘录的日历程序 学生系统

    在本Java综合案例中,我们关注的是两个主要的软件组件:一个可编辑的备忘录日历程序和一个学生管理系统。这两个系统都是基于Java编程语言实现的,它们展示了Java在实际应用中的强大功能和灵活性。 首先,让我们深入...

    JavaD图形备忘Java多媒体PPT教案学习.pptx

    JavaD图形备忘Java多媒体PPT教案学习.pptx

    java课设--个人备忘录管理系统

    在本项目中,"java课设--个人备忘录管理系统"是一个基于Java编程语言实现的课程设计项目,旨在提供一个方便用户记录、管理和检索个人备忘录的应用程序。这个系统通常包括用户界面、数据存储、备忘录的增删改查等功能...

    java设计模式-备忘录模式源代码

    在Java中,备忘录模式通常包括三个关键角色:原始对象(Originator)、备忘录(Memento)和管理者(Caretaker)。原始对象是需要保存状态的对象,它创建并存储在备忘录中的状态。备忘录负责存储原始对象的状态,而...

    java 备忘录

    Java备忘录系统是一个使用Java编程语言开发的应用程序,它旨在提供一个用户友好的界面,让用户可以方便地创建、编辑和管理个人的备忘事项。这个系统的核心功能可能包括添加新备忘、删除旧备忘、修改现有备忘以及搜索...

    java备忘录

    Java备忘录是一款基于Java开发的应用程序,它利用MySQL数据库来存储和管理用户的数据。这个程序的构建展示了Java与数据库集成的基本原理,是学习和理解Java后端开发的一个良好实践案例。 首先,Java作为一门多用途...

    备忘录日程管理java代码

    本项目名为"备忘录日程管理java代码",它是一个基于Java的软件,主要功能集中在帮助用户进行备忘录记录和日程管理。下面我们将深入探讨这个项目涉及到的关键知识点。 1. **Java基础**: - **面向对象编程**:Java...

    swing javadb 备忘录 记事本 临时记事

    一个自己写的备忘录程序,可以用标题和内容的形式记录一些信息,可以按照标题、记录日期、信息类型查询,导出excel数据。另外提供到期提示和闹钟功能。使用javadb嵌入式数据库,swing外观。提供Eclipse工程源代码和...

    java通讯及备忘功能源码

    在Java编程语言中,开发一个通讯录和备忘录管理应用程序涉及到多个核心概念和技术。以下是对这个项目的一些关键知识点的详细解释: 1. **面向对象编程(OOP)**:Java是面向对象的语言,所以通讯录和备忘录管理器会...

Global site tag (gtag.js) - Google Analytics