如何在执行前设置断点

时间:2016-02-15 23:26:33

标签: jdi

我想在应用程序开始运行之前在应用程序中设置一个断点,这样我就可以确保应用程序在启动时没有通过断点。

要设置断点,您需要执行以下操作:

EventRequestManager reqMan = vm.eventRequestManager();
BreakpointRequest bpReq = reqMan.createBreakpointRequest(locationForBreakpoint);
bpReq.enable();

为了获得断点的位置,您可以执行以下操作:

Method method = location.method();
List<Location> locations = method.locationsOfLine(55);
Location locationForBreakpoint = locations.get(0);

为了获得一个方法,您可以执行以下操作:

classType.concreteMethodByName(methodNname, String signature)

然而,为了获得该classType,您似乎需要一个似乎需要运行JVM的ObjectReference。

有没有办法在应用程序JVM运行之前设置断点,以确保在应用程序启动期间不传递断点?

1 个答案:

答案 0 :(得分:1)

首先,使用LaunchingConnector启动目标程序,以取回目标虚拟机。

em.find(...)

(根据您的需要更改环境值,但请记住使用VirtualMachineManager vmm = Bootstrap.virtualMachineManager(); LaunchingConnector lc = vmm.launchingConnectors().get(0); // Equivalently, can call: // LaunchingConnector lc = vmm.defaultConnector(); Map<String, Connector.Argument> env = lc.defaultArguments(); env.get("main").setValue("p.DebugDummy"); env.get("suspend").setValue("true"); env.get("home").setValue("C:/Program Files/Java/jdk1.7.0_51"); VirtualMachine vm = lc.launch(env); 启动目标VM) 使用此VM可以使用ClassPrepareEvent拦截ClassPrepareRequest

suspended=true

创建ClassPrepareRequest r = reqMan.createClassPrepareRequest(); r.addClassFilter("myclasses.SampleClass"); r.enable(); 处理程序

ClassPrepareEvent

然后通过调用vm.resume()恢复目标VM以运行程序。 我希望这能解决你的问题。