package org.intrace.sandbox;
import java.util.List;
import java.util.Map;
import com.sun.jdi.Bootstrap;
import com.sun.jdi.Field;
import com.sun.jdi.IncompatibleThreadStateException;
import com.sun.jdi.LocalVariable;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.StackFrame;
import com.sun.jdi.ThreadReference;
import com.sun.jdi.VirtualMachine;
import com.sun.jdi.VirtualMachineManager;
import com.sun.jdi.connect.AttachingConnector;
import com.sun.jdi.connect.Connector.Argument;
public class DebugTest
{
private static final String field = "Foo";
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
int ii = 10;
threadID(Thread.currentThread().getId());
System.out.println(ii);
System.out.println(field);
}
private static void threadID(long id)
{
Thread dbg = new Thread(new Debugger(Thread.currentThread().getId(),
Thread.currentThread().getName()));
dbg.start();
try
{
dbg.join();
}
catch (InterruptedException e)
{
// Throw away
e.printStackTrace();
}
}
public static class Debugger implements Runnable
{
private final String name;
private final long id;
public Debugger(long id, String name)
{
this.id = id;
this.name = name;
}
@Override
public void run()
{
VirtualMachineManager vmm = Bootstrap.virtualMachineManager();
List<AttachingConnector> connectors = vmm.attachingConnectors();
for (AttachingConnector connector : connectors)
{
if (connector.name().contains("SocketAttach"))
{
try
{
Map<String, Argument> args = connector.defaultArguments();
args.get("hostname").setValue("localhost");
args.get("port").setValue("8000");
VirtualMachine vm = connector.attach(args);
useVM(vm);
vm.dispose();
}
catch (Exception e)
{
e.printStackTrace();
}
break;
}
}
}
private void useVM(VirtualMachine vm)
{
List<ThreadReference> threads = vm.allThreads();
for (ThreadReference thread : threads)
{
if (name.equals(thread.name()))
{
thread.suspend();
try
{
int ii = 0;
for (StackFrame frame : thread.frames())
{
if (matchingFrame(frame))
{
StackFrame callingFrame = thread.frame(ii + 1);
useFrame(callingFrame);
}
ii++;
}
thread.resume();
}
catch (IncompatibleThreadStateException e)
{
e.printStackTrace();
}
}
}
}
private boolean matchingFrame(StackFrame frame)
{
if ("threadID".equals(frame.location().method().name()) &&
(frame.getArgumentValues().size() == 1) &&
(frame.getArgumentValues().get(0).toString().equals(Long.toString(id))))
{
return true;
}
else
{
return false;
}
}
private void useFrame(StackFrame frame)
{
try
{
System.out.println("Fields:");
ReferenceType type = frame.location().declaringType();
for (Field field : type.fields())
{
System.out.println(field.name() + " => " + type.getValue(field));
}
System.out.println("\nLocal Variables:");
for (LocalVariable variable : frame.visibleVariables())
{
if (!variable.isArgument())
{
System.out.println(variable.name() + " => " + frame.getValue(variable));
}
}
System.out.println("\nDone\n");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}