`
fanrey
  • 浏览: 252193 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    深入Java调试体系 第1部分,JPDA体系概览

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

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

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

    深入Java调试体系,第2部分:JVMTI和Agent实现

    本文内容包括:Java程序的诊断和调试JVMTI的简介Agent的工作过程JVMTI的环境和错误处理JVMTI基本功能一个简单Agent实现结语下载参考资料JPDA(JavaPlatformDebuggerArchitecture)是Java平台调试体系结构的缩写。...

    深入Java调试体系:第1部分,JPDA体系概览

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

    JDT a opensoure java trace tool

    利用JDI的接口,在不修改现有程序代码的情况,可以跟踪java Thread中的method 调用及exception的工具,使用方式很简单,先使用以下方式启动要跟踪调试的JAVA 应用 * java -classpath %JAVA_HOME%/lib/tools.jar;. -...

    深入Java调试体系,第3部分:JDWP协议及实现

    本文内容包括:JDWP协议介绍协议分析Packet的结构JDWP传输接口(JavaDebugWireProtocolTransportInterface)JDWP的命令实现机制JDWP的事件处理机制结语参考资料JPDA(...,开发人员可以方便灵活的搭建Java调试应用程序...

    积分兑换系统java源码-android-ssl-bypass:即使使用固定,也可以绕过Android上的SSL验证的黑盒工具

    JDI API () 的可编写脚本的 JDWP 调试器。 该工具的架构是基于插件的,以便能够在运行时加载调试代码。 插件目前可以用 Java 或 Jython 编写。 这些调试器插件可以创建断点事件并将自己注册为这些断点的处理程序。 ...

    Jassda-开源

    Jassda是一个框架,该框架在运行时使用Java调试接口(JDI)从Java应用程序中提取方法调用的序列。 Jassda提供了按顺序操作的两个模块:记录器和跟踪检查器

Global site tag (gtag.js) - Google Analytics