`
fanrey
  • 浏览: 254976 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用JDI调试Java应用程序

    博客分类:
  • JDI
 
阅读更多
1. 为被调试的程序设置启动参数:
-Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n
作为server,打开8888监听,不挂起。

2.把tools.jar加到CLASSPATH里。note: 这个jar包含在JDK中,不在JRE中。

3. 用JDI获取每个类有多少实例:
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.sun.jdi.Bootstrap;
import com.sun.jdi.ObjectReference;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.ThreadReference;
import com.sun.jdi.VirtualMachine;
import com.sun.jdi.connect.AttachingConnector;
import com.sun.jdi.connect.Connector;


/**
* @author fanrey
*
*/
public class JDITest {

/**
* @param args
*/
public static void main(String[] args) {
String className = null;
if(args != null && args.length == 1){
className = args[0];
}else
className = "no.axxessit.il.axxrpc.AxxRpcPinger";
List connectors = Bootstrap.virtualMachineManager().allConnectors();
Connector conn = null;
VirtualMachine vm = null;
Iterator iter = connectors.iterator();
while (iter.hasNext()) {
Connector connector = (Connector)iter.next();
if (connector.name().equals("com.sun.jdi.SocketAttach")) {
conn =  connector;
}
}
Map arguments=conn.defaultArguments();
for (Iterator itr=arguments.keySet().iterator(); itr.hasNext();)
{
Connector.Argument argument=(Connector.Argument)
arguments.get(itr.next());
}
Connector.Argument host=(Connector.Argument) arguments.get("hostname");
Connector.Argument port=(Connector.Argument) arguments.get("port");
host.setValue("localhost");
port.setValue("8888");

AttachingConnector attacher=(AttachingConnector) conn;
try {
vm=attacher.attach(arguments);
}
catch (Exception e) {
e.printStackTrace();
}
List<ReferenceType> classList = vm.classesByName(className);
//        System.out.println(classList.size());
//        List<ReferenceType> classList = vm.allClasses();
for(ReferenceType type : classList){
List<ObjectReference> ors = type.instances(0);
System.out.println(type + " instance number: " + ors.size());
}
List<ThreadReference> ts = vm.allThreads();
System.out.println("Thread number: "+ts.size());
}

}

运行结果:
class no.axxessit.il.axxrpc.AxxRpcPinger (loaded by instance of sun.misc.Launcher$AppClassLoader(id=3)) instance number: 1
Thread number: 63
分享到:
评论

相关推荐

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

    本篇文章将深入探讨如何使用Eclipse进行远程调试Java应用程序。 首先,确保你已经安装了Eclipse的最新版本,例如Ganymede(V3.4)。Ganymede引入了套接字监听连接器,使得远程调试变得更加灵活。在创建启动配置时,...

    java js引擎调试js代码

    总结,调试Java中的JavaScript代码可以通过多种方式实现,包括使用JShell、JDI、JSDT插件以及模拟Node.js调试。选择哪种方法取决于你的具体需求、使用的开发工具以及项目的复杂程度。熟练掌握这些技巧,将极大地提高...

    jdivisitor:Java库,用于使用Java调试接口(JDI)和访问者设计模式来构建自定义调试器应用程序

    JDIVisitor JDIVisitor是一个Java库,用于使用Java调试接口(JDI)和访问者设计模式来构建自定义调试器应用程序。 它从的项目中汲取了灵感。 但是,JDIVisitor避开了jdiscript的类似脚本的设计,而改用了更具Java...

    Java调试体系及协议

    Java调试体系及协议是开发和优化Java应用程序的关键组成部分。它为开发者提供了深入理解代码执行流程、定位和修复问题的能力。本文将深入探讨Java Platform Debugger Architecture (JPDA),这是Java调试的基础,以及...

    JPDA----java调试体系

    通过 JPDA,开发人员可以根据特定需求,扩展定制 Java 调试应用程序,开发出吸引开发人员使用的调试工具。 ### 丰富的 API JPDA 提供了丰富的 API,提供了许多实用的功能,例如,监控当前 Java 虚拟机的状态,设置...

    学习调试java源码学习调试java源码

    JDI是Java虚拟机工具接口的一部分,提供了调试API,而JDB则是一个命令行工具,可以用来远程或本地调试Java应用。 1. **设置断点**:在源码中设置断点是调试的第一步。你可以使用IDE(如Eclipse、IntelliJ IDEA或...

    sa-jdi.jar.zip

    JDI是Java虚拟机工具接口(Java Virtual Machine Tool Interface, JVMTI)的一部分,它允许开发者编写工具来调试、监视和分析运行时的Java应用。 在Java中,JDI主要用于远程调试,它提供了丰富的API,可以用来创建...

    一种基于芯片仿真VCD波形格式的Java程序自动调试方法.pdf

    使用JDI技术是实现Java程序自动调试的关键。JDI是一个Java平台调试架构,它提供了一套丰富的API来远程控制和监控Java虚拟机(JVM)。通过JDI,开发者可以编写脚本来自动地启动、停止和控制程序的执行,同时获取程序...

    深入Java调试体系(JPDA-JDWP)

    JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。 JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),...

    JAVAECLIPSE下配置WINDCHILL远程调试WINDCHILL学习笔记.pdf

    远程调试是指在一个主机上调试运行在另一台机器上的应用程序的技术。这对于分布式系统的开发尤其有用,因为它允许开发者在不同的环境中调试代码,确保应用能够正确地在目标环境中运行。 #### 二、配置步骤 ##### 1...

    java 19下载,版本 19.0.1, windows各版本

    4. **Java调试接口**(JDI)和**Java调试工具**(jdb):用于调试Java应用程序,查找并修复代码中的问题。 5. **Java性能分析器**(JFR)和**Java Mission Control**(JMC):这些工具帮助开发者监控和分析应用程序...

    Windows Java SE Development Kit 11.0.15.1 x64 Installer

    总之,Java SE Development Kit 11.0.15.1 x64 Installer为Windows用户提供了一个强大的开发环境,包含了编写、编译、运行和调试Java应用程序所需的所有工具。随着版本的不断迭代,开发者可以期待更多的性能提升和新...

    JDB调试安卓应用程序测试应用

    本文将详细介绍如何使用JDB来调试Android应用程序,并结合提供的"JDBTest"示例,探讨其实际应用。 首先,了解JDB的基本用法。JDB可以通过adb(Android Debug Bridge)与设备或模拟器进行通信。要启动JDB调试,你...

    windchill远程调试详细介绍

    Windchill 远程调试是指在 Windchill 开发环境中,使用 Java 平台调试器(JPDA)来调试远程服务器上的 Java 应用程序。JPDA(Java Platform Debugger Architecture)是 Java 平台上的调试器定义的标准体系结构,它...

    java程序开发工具集的使用共1页.pdf.zip

    Java程序开发工具集,通常指的是Java Development Kit (JDK),它是Java编程语言的核心组件,包含了编译器、调试器、JVM(Java虚拟机)以及各种实用工具。本资料"java程序开发工具集的使用共1页.pdf.zip"可能是关于...

    java 远程调试一个朋友推荐

    Java远程调试是指在开发过程中,开发人员能够通过网络连接到远程机器上运行的Java应用程序进行调试的过程。这种方式可以有效解决由于部署环境差异导致的问题定位困难,尤其是在分布式系统和微服务架构中,远程调试更...

Global site tag (gtag.js) - Google Analytics