Search in sources :

Example 76 with DebuggerSession

use of com.oracle.truffle.api.debug.DebuggerSession in project graal by oracle.

the class SuspensionFilterTest method testSuspendAfterInitialization.

@Test
public void testSuspendAfterInitialization() {
    Source initSource = Source.newBuilder(InstrumentationTestLanguage.ID, "STATEMENT(EXPRESSION)", "<init>").buildLiteral();
    InstrumentationTestLanguage.envConfig = Collections.singletonMap("initSource", initSource);
    final Source source = testSource("ROOT(\n" + "  STATEMENT(CONSTANT(42))\n" + ")\n");
    SuspensionFilter suspensionFilter = SuspensionFilter.newBuilder().ignoreLanguageContextInitialization(true).build();
    try (DebuggerSession session = startSession()) {
        session.setSteppingFilter(suspensionFilter);
        session.suspendNextExecution();
        startEval(source);
        expectSuspended((SuspendedEvent event) -> {
            checkState(event, 2, true, "STATEMENT(CONSTANT(42))").prepareContinue();
            Assert.assertTrue(event.isLanguageContextInitialized());
        });
        expectDone();
    }
}
Also used : DebuggerSession(com.oracle.truffle.api.debug.DebuggerSession) SuspendedEvent(com.oracle.truffle.api.debug.SuspendedEvent) SuspensionFilter(com.oracle.truffle.api.debug.SuspensionFilter) Source(org.graalvm.polyglot.Source) Test(org.junit.Test)

Example 77 with DebuggerSession

use of com.oracle.truffle.api.debug.DebuggerSession in project graal by oracle.

the class SuspensionFilterTest method testInternalStepping.

@Test
public void testInternalStepping() throws Exception {
    final Source internSource = Source.newBuilder(InstrumentationTestLanguage.ID, "ROOT(\n" + "  DEFINE(intern, \n" + "    STATEMENT(EXPRESSION),\n" + "    STATEMENT(CONSTANT(42))\n" + "  ),\n" + "  CALL(intern)\n" + ")\n", "intern").internal(true).build();
    final Source source = testSource("ROOT(\n" + "  STATEMENT(CALL(intern)),\n" + "  STATEMENT(CONSTANT(1)),\n" + "  STATEMENT(CALL(intern))\n" + ")\n");
    SuspensionFilter suspensionFilter = SuspensionFilter.newBuilder().includeInternal(false).build();
    try (DebuggerSession session = startSession()) {
        session.setSteppingFilter(suspensionFilter);
        session.suspendNextExecution();
        startEval(internSource);
        // does not stop in internal source
        expectDone();
        startEval(source);
        expectSuspended((SuspendedEvent event) -> {
            checkState(event, 2, true, "STATEMENT(CALL(intern))");
            event.prepareStepInto(1);
        });
        // Step into does not go into the internal source:
        expectSuspended((SuspendedEvent event) -> {
            checkState(event, 3, true, "STATEMENT(CONSTANT(1))");
            Breakpoint bp = Breakpoint.newBuilder(getSourceImpl(internSource)).lineIs(3).build();
            session.install(bp);
            event.prepareContinue();
        });
        // Breakpoint stops there:
        expectSuspended((SuspendedEvent event) -> {
            checkState(event, 3, true, "STATEMENT(EXPRESSION)");
            event.prepareContinue();
        });
        expectDone();
    }
}
Also used : Breakpoint(com.oracle.truffle.api.debug.Breakpoint) DebuggerSession(com.oracle.truffle.api.debug.DebuggerSession) SuspendedEvent(com.oracle.truffle.api.debug.SuspendedEvent) SuspensionFilter(com.oracle.truffle.api.debug.SuspensionFilter) Source(org.graalvm.polyglot.Source) Test(org.junit.Test)

Example 78 with DebuggerSession

use of com.oracle.truffle.api.debug.DebuggerSession in project graal by oracle.

the class SuspensionFilterTest method testInitializationFilterChange.

@Test
public void testInitializationFilterChange() {
    // Set to skip the initialization, but put two breakpoints there.
    // Verify that step just skips the code to the next breakpoint.
    // After second breakpoint is hit, change the filter to allow stepping
    // in the initialization code.
    String initCode = "ROOT(\n" + "  DEFINE(initFoo, \n" + // Skipped by suspensionFilter
    "    STATEMENT(EXPRESSION),\n" + // l. 4 Breakpoint
    "    STATEMENT(EXPRESSION),\n" + // Skipped by suspensionFilter
    "    STATEMENT(CONSTANT(2)),\n" + // l. 6 Breakpoint, filter changed
    "    STATEMENT(EXPRESSION),\n" + "    LOOP(2,\n" + // l. 8 Step stops here
    "      STATEMENT(CONSTANT(1)))\n" + "  ), \n" + "  STATEMENT(CALL(initFoo))\n" + ")\n";
    Source initSource = Source.newBuilder(InstrumentationTestLanguage.ID, initCode, "<init>").buildLiteral();
    InstrumentationTestLanguage.envConfig = Collections.singletonMap("initSource", initSource);
    final Source source = testSource("ROOT(\n" + "  STATEMENT(CONSTANT(42))\n" + ")\n");
    SuspensionFilter.Builder filterBuilder = SuspensionFilter.newBuilder().ignoreLanguageContextInitialization(true);
    SuspensionFilter suspensionFilter = filterBuilder.build();
    try (DebuggerSession session = startSession()) {
        session.setSteppingFilter(suspensionFilter);
        session.suspendNextExecution();
        Breakpoint bp4 = Breakpoint.newBuilder(getSourceImpl(initSource)).lineIs(4).build();
        Breakpoint bp6 = Breakpoint.newBuilder(getSourceImpl(initSource)).lineIs(6).build();
        session.install(bp4);
        session.install(bp6);
        startEval(source);
        expectSuspended((SuspendedEvent event) -> {
            checkState(event, 4, true, "STATEMENT(EXPRESSION)");
            Assert.assertFalse(event.isLanguageContextInitialized());
            Assert.assertTrue(event.getBreakpoints().contains(bp4));
            event.prepareStepOver(1);
        });
        expectSuspended((SuspendedEvent event) -> {
            checkState(event, 6, true, "STATEMENT(EXPRESSION)");
            Assert.assertFalse(event.isLanguageContextInitialized());
            Assert.assertTrue(event.getBreakpoints().contains(bp6));
            filterBuilder.ignoreLanguageContextInitialization(false);
            session.setSteppingFilter(filterBuilder.build());
            event.prepareStepOver(1);
        });
        expectSuspended((SuspendedEvent event) -> {
            Assert.assertFalse(event.isLanguageContextInitialized());
            checkState(event, 8, true, "STATEMENT(CONSTANT(1))").prepareContinue();
        });
        expectDone();
    }
}
Also used : Breakpoint(com.oracle.truffle.api.debug.Breakpoint) DebuggerSession(com.oracle.truffle.api.debug.DebuggerSession) SuspendedEvent(com.oracle.truffle.api.debug.SuspendedEvent) SuspensionFilter(com.oracle.truffle.api.debug.SuspensionFilter) Source(org.graalvm.polyglot.Source) Test(org.junit.Test)

Example 79 with DebuggerSession

use of com.oracle.truffle.api.debug.DebuggerSession in project graal by oracle.

the class ConcurrentDebuggingTest method testConcurrentBreakpoints.

@Test
public void testConcurrentBreakpoints() {
    int numThreads = 100;
    String code = "ROOT(DEFINE(foo,\n" + "  STATEMENT\n" + "),\n" + "LOOP(" + numThreads + ", SPAWN(foo)),\n" + "JOIN())";
    final Source source = Source.create(InstrumentationTestLanguage.ID, code);
    Breakpoint breakpoint = Breakpoint.newBuilder(source.getURI()).lineIs(2).build();
    Context context = Context.newBuilder().allowCreateThread(true).build();
    Debugger debugger = context.getEngine().getInstruments().get("debugger").lookup(Debugger.class);
    AtomicInteger hits = new AtomicInteger(0);
    try (DebuggerSession session = debugger.startSession((SuspendedEvent event) -> {
        assertEquals(1, event.getBreakpoints().size());
        assertEquals(breakpoint, event.getBreakpoints().get(0));
        hits.incrementAndGet();
    })) {
        session.install(breakpoint);
        context.eval(source);
    }
    assertEquals(numThreads, hits.get());
}
Also used : Context(org.graalvm.polyglot.Context) Debugger(com.oracle.truffle.api.debug.Debugger) Breakpoint(com.oracle.truffle.api.debug.Breakpoint) DebuggerSession(com.oracle.truffle.api.debug.DebuggerSession) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) SuspendedEvent(com.oracle.truffle.api.debug.SuspendedEvent) Breakpoint(com.oracle.truffle.api.debug.Breakpoint) Source(org.graalvm.polyglot.Source) Test(org.junit.Test)

Example 80 with DebuggerSession

use of com.oracle.truffle.api.debug.DebuggerSession in project graal by oracle.

the class DebugScopeTest method testArguments.

@Test
public void testArguments() {
    final Source source = testSource("DEFINE(function, ROOT(\n" + "  STATEMENT()\n" + "))\n");
    Context context = Context.create();
    context.eval(source);
    Value functionValue = context.getBindings(InstrumentationTestLanguage.ID).getMember("function");
    assertNotNull(functionValue);
    Debugger debugger = context.getEngine().getInstruments().get("debugger").lookup(Debugger.class);
    boolean[] suspended = new boolean[] { false };
    DebuggerSession session = debugger.startSession((SuspendedEvent event) -> {
        assertFalse(suspended[0]);
        Iterable<DebugValue> arguments = event.getTopStackFrame().getScope().getArguments();
        assertNotNull(arguments);
        Iterator<DebugValue> iterator = arguments.iterator();
        assertTrue(iterator.hasNext());
        DebugValue arg = iterator.next();
        assertEquals("0", arg.getName());
        assertEquals("true", arg.as(String.class));
        assertTrue(iterator.hasNext());
        arg = iterator.next();
        assertEquals("1", arg.getName());
        assertEquals("10", arg.as(String.class));
        assertFalse(iterator.hasNext());
        event.prepareContinue();
        suspended[0] = true;
    });
    session.suspendNextExecution();
    functionValue.execute(true, 10);
    session.close();
    assertTrue(suspended[0]);
}
Also used : Context(org.graalvm.polyglot.Context) Debugger(com.oracle.truffle.api.debug.Debugger) DebuggerSession(com.oracle.truffle.api.debug.DebuggerSession) DebugValue(com.oracle.truffle.api.debug.DebugValue) SuspendedEvent(com.oracle.truffle.api.debug.SuspendedEvent) Value(org.graalvm.polyglot.Value) DebugValue(com.oracle.truffle.api.debug.DebugValue) Source(org.graalvm.polyglot.Source) Test(org.junit.Test)

Aggregations

DebuggerSession (com.oracle.truffle.api.debug.DebuggerSession)110 Source (org.graalvm.polyglot.Source)103 Test (org.junit.Test)102 SuspendedEvent (com.oracle.truffle.api.debug.SuspendedEvent)97 Breakpoint (com.oracle.truffle.api.debug.Breakpoint)49 DebugStackFrame (com.oracle.truffle.api.debug.DebugStackFrame)20 DebugValue (com.oracle.truffle.api.debug.DebugValue)16 Debugger (com.oracle.truffle.api.debug.Debugger)14 Context (org.graalvm.polyglot.Context)11 SourceSection (com.oracle.truffle.api.source.SourceSection)8 SuspensionFilter (com.oracle.truffle.api.debug.SuspensionFilter)7 DebugContext (com.oracle.truffle.api.debug.DebugContext)6 SuspendedCallback (com.oracle.truffle.api.debug.SuspendedCallback)6 DebugScope (com.oracle.truffle.api.debug.DebugScope)5 Engine (org.graalvm.polyglot.Engine)5 HashMap (java.util.HashMap)3 Value (org.graalvm.polyglot.Value)3 ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2