AppDebugger.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package net.ranides.demo.debugger;
  2. import com.sun.jdi.VMDisconnectedException;
  3. import com.sun.jdi.event.LocatableEvent;
  4. import com.sun.jdi.request.BreakpointRequest;
  5. import java.util.Optional;
  6. public class AppDebugger {
  7. private static final String EXAMPLE = "net.ranides.demo.debugger.AppObservable$ExampleObject@19";
  8. public static void main(String[] args) {
  9. try (var debugger = new SimpleDebugger()) {
  10. var example = debugger.connect("localhost", "5151").locate(EXAMPLE);
  11. System.out.println(" - debug session...");
  12. // EXAMPLE: short syntax: method call at "location"
  13. var valueE = (Double) example.call("methodNum", new Object[]{"3", "7", 3.0});
  14. System.out.printf(" - methodNum = '%s'%n", valueE);
  15. // EXAMPLE: short syntax: variable access at "location"
  16. var valueF = (Integer) example.variable("counter");
  17. System.out.printf(" - counter = '%s'%n", valueF);
  18. // EXAMPLE: short syntax: invoke method inside remote context
  19. var valueA = example.eval(context -> {
  20. var counter = (Integer) context.variable("counter");
  21. return (Integer) context.call("methodInt", new Object[]{6, counter});
  22. });
  23. System.out.printf(" - methodInt = '%s'%n", valueA);
  24. // EXAMPLE: manually create breakpoint & process debug events
  25. BreakpointRequest breakpoint = debugger.breakpoint(example);
  26. int[] result = {0};
  27. int[] repeat = {0};
  28. debugger.loop(context -> {
  29. if (!context.matches(example)) {
  30. System.out.printf(" * ignore event: %s%n", context.event());
  31. return Optional.empty();
  32. }
  33. Integer counter = (Integer) context.variable("counter");
  34. System.out.printf(" * counter = %d%n", counter);
  35. result[0] += counter;
  36. if (repeat[0]++ > 10) {
  37. breakpoint.setEnabled(false);
  38. context.stop();
  39. return Optional.of("calculated");
  40. }
  41. return Optional.empty();
  42. });
  43. System.out.printf(" - result = %d%n", result[0]);
  44. } catch (VMDisconnectedException e) {
  45. System.out.println("Virtual Machine is disconnected.");
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. } finally {
  49. System.out.println("Disconnected.");
  50. }
  51. }
  52. }