@Test
	public void testGetAt() throws CodeUnitInsertionException {
		try (Transaction tx = b.startTransaction()) {
			assertUndefinedFunc(v -> v.getAt(0, b.addr(0x4000)));
			TraceData d4000 =
				b.addData(0, b.addr(0x4000), IntegerDataType.dataType, b.buf(1, 2, 3, 4));
			d4000.setEndSnap(9);
			assertDataFunc(d4000, v -> v.getAt(0, b.addr(0x4000)));
			assertDataFunc(d4000, v -> v.getAt(9, b.addr(0x4000)));
			assertUndefinedFunc(v -> v.getAt(10, b.addr(0x4000)));
			assertAllNullFunc(v -> v.getAt(0, b.addr(0x4001)));
			assertAllNullFunc(v -> v.getAt(0, b.addr(0x4002)));
			assertAllNullFunc(v -> v.getAt(0, b.addr(0x4003)));
			assertUndefinedFunc(v -> v.getAt(0, b.addr(0x4004)));
			assertAllNullFunc(v -> v.getAt(9, b.addr(0x4001)));
			assertAllNullFunc(v -> v.getAt(9, b.addr(0x4002)));
			assertAllNullFunc(v -> v.getAt(9, b.addr(0x4003)));
			assertUndefinedFunc(v -> v.getAt(9, b.addr(0x4004)));

			TraceInstruction i4005 = b.addInstruction(0, b.addr(0x4005), b.host, b.buf(0xf4, 0));
			i4005.setEndSnap(5);
			assertUndefinedFunc(v -> v.getAt(0, b.addr(0x4004)));
			assertInstructionFunc(i4005, v -> v.getAt(0, b.addr(0x4005)));
			assertInstructionFunc(i4005, v -> v.getAt(5, b.addr(0x4005)));
			assertUndefinedFunc(v -> v.getAt(6, b.addr(0x4005)));
			assertAllNullFunc(v -> v.getAt(0, b.addr(0x4006)));
			assertAllNullFunc(v -> v.getAt(5, b.addr(0x4006)));
			assertUndefinedFunc(v -> v.getAt(0, b.addr(0x4007)));
		}
	}
This test is interesting because the pointer type def causes an update to the data type
settings <em>while the unit is still being created</em>. This will invalidate the trace's
caches. All of them, including the defined data units, which can become the cause of many
timing issues.
Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/listing/DBTraceCodeManagerTest.java