java 可以以调试模式启动,启动后可以使用 jdb 对程序进行调试。以调试模式启动,需要加入以下参数:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

一般如 tomcat, jboss, weblogic 等服务器中会使用 JAVA_OPTS 环境变量,如果要运行这类服务,可以设置该环境变量如下:

linux 下

export JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"

windows 下

set JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

maven 使用 MAVEN_OPTS 参数,设置跟上面的类同

以下是一个简单的服务器端代码,接收 UDP 请求

package mm;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UServer { public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8000);
while (true) {
DatagramPacket dataPackage = new DatagramPacket(new byte[100], 100);
socket.receive(dataPackage);
System.out.println("Receive from : "
+ dataPackage.getAddress().getHostName());
System.out.println("Data: [" + new String(dataPackage.getData()) + "]");
dataPackage.setData("abc你好".getBytes());
socket.send(dataPackage);
}
} }

通过以下命令运行该服务器:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n mm.UServer

通过以下命运运行 jdb,即可进行调试

[root@server test] # jdb -attach 192.168.1.79:8787 -sourcepath .
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> stop at mm.UServer:12
Set breakpoint mm.UServer:12
>
Breakpoint hit: "thread=main", mm.UServer.main(), line=12 bci=11
12 DatagramPacket dataPackage = new DatagramPacket(new byte[100], 100); main[1] next Step completed: "thread=main", mm.UServer.main(), line=13 bci=25
13 socket.receive(dataPackage); main[1] main[1] next
> next
Nothing suspended.
>
Step completed: "thread=main", mm.UServer.main(), line=14 bci=30
14 System.out.println("Receive from : " main[1] !!
next Step completed: "thread=main", mm.UServer.main(), line=15 bci=42
15 + dataPackage.getAddress().getHostName()); main[1] main[1] !!
next
>
Step completed: "thread=main", mm.UServer.main(), line=14 bci=55
14 System.out.println("Receive from : " main[1] !!
next
>
Step completed: "thread=main", mm.UServer.main(), line=16 bci=58
16 System.out.println("Data: [" + new String(dataPackage.getData()) + "]"); main[1] !!
next
>
Step completed: "thread=main", mm.UServer.main(), line=17 bci=95
17 dataPackage.setData("abc你好".getBytes()); main[1] !!
next
>
Step completed: "thread=main", mm.UServer.main(), line=18 bci=104
18 socket.send(dataPackage); main[1] !!
next
>
Step completed: "thread=main", mm.UServer.main(), line=11 bci=109
11 while (true) { main[1] !!
next
>
Step completed:
Breakpoint hit: "thread=main", mm.UServer.main(), line=12 bci=11
12 DatagramPacket dataPackage = new DatagramPacket(new byte[100], 100); main[1]

调试的主要命令有

  • stop at 在指定行设置断点
  • stop on 在指定的方法设置断点
  • next 单步执行到下一步
  • !! 重复最后一次命令

目前 eclipse 中已经集成了 jdb,可以在 eclipse 的 debug 选项中设置连接远程主机进行远程调试

远程调试Java程序的更多相关文章

  1. 服务器时间误差导致的google sign-in后台验证错误(远程调试java程序)

    https://developers.google.com/identity/sign-in/web/backend-auth import com.google.api.client.googlea ...

  2. Eclipse远程调试Java程序

    1. 在服务器上运行jar包时加入参数 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address= 2. 在Eclipse中操作 ...

  3. java远程调试(断点)程序/tomcat( eclipse远程调试Tomcat方法)

    tomcat远程调试: 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_soc ...

  4. eclipse远程debug Java程序

    使用Eclipse JPDA远程调试Java程序 本文将介绍使用Eclipse JPDA,在Eclipse的开发环境下对远程运行的Java程序进行调试操作. 请按以下步骤进行(本人已经在Eclipse ...

  5. 使用 Eclipse 远程调试 Java 应用程序

    Eclipse 中的远程调试特性 Eclipse 是一个图形化 Java 调试器前端.JDI 在 org.eclipse.jdt.debug 包中实现.本文不详细讨论 JDI 实现.参见 参考资料 获 ...

  6. 使用jvisualvm远程监控Java程序

    使用Java自带的jvisualvm调试Java程序,可以查看CPU.内存.线程等信息,还可以进行Dump,无疑是一个利器 由于客户端是Windows.服务端是Linux,并且是最小安装的Linux, ...

  7. 使用jvisualvm的jstatd方式远程监控Java程序

    使用Java自带的jvisualvm调试Java程序,可以查看CPU.内存.类及线程等信息,还可以进行Dump,无疑是一个利器 由于客户端是Windows.服务端是Linux,并且是最小安装的Linu ...

  8. Eclipse快速入门:远程调试Java应用

    Eclipse快速入门:远程调试Java应用 2012年03月27日00:00 it168网站原创 作者:皮丽华 编辑:皮丽华 我要评论(0) 标签: Eclipse , Java , Java框架, ...

  9. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

随机推荐

  1. struts2中如何使用主题theme

    一.什么是主题? 主题就是一种风格化标签,能够让所有UI标签能够产生同样的视觉效果而归集到一起的一组模板,即风格相近的模板被打包为一个主题 二.struts2提供的主题有哪些呢?struts2中如何修 ...

  2. SpringMVC 的RequestMapping

    Spring MVC之@RequestMapping 详解 2013-10-13 23:39 150698人阅读 评论(6) 收藏 举报  分类: Java 精华文章(161)    目录(?)[+] ...

  3. 两种状态显示处理. enum , Linq AsEnumerable

    1.ENUM protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { GridViewRow ro ...

  4. 和以往印象不同的Java

    Java编程概述 一个Java源文件至多有一个public类,但是可以有很多class的定义 public static void main (String args[]) public 代表公共的, ...

  5. node3

  6. Android adb常用指令

    Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理模拟器或设备 从模拟器或 ...

  7. VC++ Debugger Tips[转]

    本文摘自:http://blogs.msdn.com/b/vcblog/archive/2006/08/04/689026.aspx Hi, my name is Sergey Grankin and ...

  8. fcc

    function spinalCase(str) { if(str.split(/\W|_/).length==1){ for(var i=0;i<str.length;i++){ if(/[A ...

  9. Traceroute命令原理(转)

    Traceroute命令基本功能 该命令用于测试两个TCP/IP系统之间的网络层连通性和显示传输路径中每一跳地址,又称为路径跟踪,如果Traceroute命令测试成功,我们能够观察到从源主机到目的主机 ...

  10. protobuf坑1

    或者说特性吧,没仔细看protobuf代码,也许我还理解不够. 按照陈硕大牛的这篇帖子的介绍,“它包含了程序编译的时候所链接的全部 protobuf Message types” 实际开发过程中发现必 ...