@Test // Abort is on program, not trace
	public void testAbortAddBookmarks() throws Throwable {
		createTarget1();
		Trace trace = getTrace(target1);
		traceManager.openTrace(trace);

		createProgramFromTrace(trace);
		intoProject(program);
		programManager.openProgram(program);

		addProgramTextBlock(program);
		MR text = addTargetTextRegion(target1);
		addTextMapping(target1, text, program);
		waitOn(mappingService.changesSettled());
		waitOn(breakpointService.changesSettled());

		try (Transaction tx = program.openTransaction("Will abort")) {
			addProgramBreakpoints(program);

			// Sanity
			assertLogicalBreakpointsForMappedBookmarks(trace);
			tx.abort();
		}
		waitForDomainObject(program);
		waitOn(breakpointService.changesSettled());

		assertTrue(breakpointService.getAllBreakpoints().isEmpty());
	}
NB. The target could still be mid transaction. If we open this transaction too soon, then
the breakpoint gets aborted as well.
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/AbstractDebuggerLogicalBreakpointServiceTest.java