用JDI调试Java应用程序

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值