public void TestFrame() { DebuggerTracer.EntityFrameTrace frame = new DebuggerTracer.EntityFrameTrace(); // _ _ 3 frame.PadAndInsert(stepOffset: 2, nodeId1: 3, nodeId2: 3); AssertNodeIds(frame, 0, 0, 3); // 1 _ 3 frame.SetNextStep(1, 1); AssertNodeIds(frame, 1, 0, 3); // 1 2 3 frame.SetNextStep(2, 2); AssertNodeIds(frame, 1, 2, 3); // 1 2 3 4 frame.SetNextStep(4, 4); AssertNodeIds(frame, 1, 2, 3, 4); // 1 2 3 4 _ _ 7 frame.PadAndInsert(2, 7, 7); AssertNodeIds(frame, 1, 2, 3, 4, 0, 0, 7); // 1 2 3 4 5 _ 7 frame.SetNextStep(5, 5); AssertNodeIds(frame, 1, 2, 3, 4, 5, 0, 7); // 1 2 3 4 5 6 7 frame.SetNextStep(6, 6); AssertNodeIds(frame, 1, 2, 3, 4, 5, 6, 7); }
static void AssertNodeIds(DebuggerTracer.EntityFrameTrace frame, params ulong[] ids) { Assert.That(frame.steps.Count, Is.EqualTo(ids.Length)); for (int i = 0; i < ids.Length; i++) { Assert.That(frame.steps[i].nodeId1, Is.EqualTo(ids[i])); } }
protected override void OnUpdate() { foreach (GraphStream graphStream in m_GraphStreams) { graphStream.CompleteInputDependencies(); DebuggerTracer.GraphTrace graphTrace = DebuggerTracer.GetGraphData(graphStream.GraphId, createIfAbsent: true); var reader = graphStream.AsReader(); var frame = Time.frameCount; DebuggerTracer.FrameData frameData = null; for (int i = 0; i < reader.ForEachCount; i++) { reader.BeginForEachIndex(i); DebuggerTracer.EntityFrameTrace entityData = null; while (reader.RemainingItemCount > 0) { if (frameData == null) { frameData = graphTrace.GetFrameData(frame, createIfAbsent: true); } var callFrame = reader.Read <DataType>(); ulong nodeId1, nodeId2; switch (callFrame) { case DataType.Entity: var e = ReadEntity(ref reader); entityData = frameData.GetEntityFrameTrace(e.Index, createIfAbsent: true); break; case DataType.Step: Assert.IsTrue(entityData != null); ReadStepRecord(ref reader, out nodeId1, out nodeId2, out var stepOffset, out var progress); entityData.SetLastCallFrame(nodeId1, nodeId2, stepOffset, progress); break; case DataType.Data: { Assert.IsTrue(entityData != null); ReadValueRecord(ref reader, out nodeId1, out nodeId2, out var value); entityData.RecordValue(value, nodeId1, nodeId2); break; } } } reader.EndForEachIndex(); } graphStream.Dispose(); } m_GraphStreams.Clear(); }
public void TestCircularBufferHasRightValues() { DebuggerTracer.GraphTrace recorder = new DebuggerTracer.GraphTrace(10); const int entityId = 0; for (int i = 0; i < 20; i++) { DebuggerTracer.FrameData frameData = recorder.GetFrameData(i, true); DebuggerTracer.EntityFrameTrace entityData = frameData.GetEntityFrameTrace(entityId, true); entityData.RecordValue(i, 0, 0); } for (int i = 0; i < 20; i++) { if (i < 10) { Assert.That(recorder.GetFrameData(i, false), Is.Null); } else { Assert.That(recorder.GetFrameData(i, false).GetEntityFrameTrace(entityId, false).values[0].Single().readableValue, Is.EqualTo(i.ToString())); } } }
public void TestCircularBufferIsWorking() { DebuggerTracer.EntityFrameTrace recorder = new DebuggerTracer.EntityFrameTrace(); Assert.That(recorder.values?.ContainsKey(1) ?? false, Is.False); recorder.Record("a", 1, 0); Check(1, "a"); Assert.That(recorder.values?.ContainsKey(2) ?? false, Is.False); recorder.Record("b", 2, 0); Check(2, "b"); Assert.That(recorder.values?.ContainsKey(3) ?? false, Is.False); recorder.Record("c", 3, 0); Check(3, "c"); void Check(ulong anodeId, object value) { var valueRecord = recorder.values.Last().Value.Last(); Assert.That(valueRecord.nodeId1, Is.EqualTo(anodeId)); Assert.That(valueRecord.readableValue, Is.EqualTo(value.ToString())); } }
public static TraceDump Deserialize(BinaryReader reader) { var version = reader.ReadInt16(); Assert.AreEqual(k_Version, version); var path = reader.ReadString(); var frameCount = reader.ReadInt32(); var frameData = new DebuggerTracer.FrameData[frameCount]; TraceDump graphData = new TraceDump(path, frameData); for (int i = 0; i < frameCount; i++) { frameData[i] = new DebuggerTracer.FrameData(reader.ReadInt32()); var entityCount = reader.ReadInt32(); var entityData = new Dictionary <DebuggerTracer.FrameData.EntityReference, DebuggerTracer.EntityFrameTrace>(entityCount); frameData[i].EntityFrameData = entityData; for (int j = 0; j < entityCount; j++) { DebuggerTracer.FrameData.EntityReference entityRef = new DebuggerTracer.FrameData.EntityReference { EntityIndex = reader.ReadInt32() }; var entityFrameTrace = new DebuggerTracer.EntityFrameTrace(); { entityFrameTrace.steps = new List <DebuggerTracer.EntityFrameTrace.NodeRecord>(reader.ReadInt32()); for (int k = 0; k < entityFrameTrace.steps.Capacity; k++) { entityFrameTrace.steps.Add(new DebuggerTracer.EntityFrameTrace.NodeRecord { nodeId1 = reader.ReadUInt64(), nodeId2 = reader.ReadUInt64(), progress = reader.ReadByte(), type = reader.ReadBoolean() ? DebuggerTracer.EntityFrameTrace.StepType.Exception : DebuggerTracer.EntityFrameTrace.StepType.None, }); } } { var valueCount = reader.ReadInt32(); entityFrameTrace.values = new Dictionary <int, List <DebuggerTracer.EntityFrameTrace.ValueRecord> >(valueCount); for (int k = 0; k < valueCount; k++) { var step = reader.ReadInt32(); List <DebuggerTracer.EntityFrameTrace.ValueRecord> values = new List <DebuggerTracer.EntityFrameTrace.ValueRecord>(reader.ReadInt32()); for (int l = 0; l < values.Capacity; l++) { values.Add(new DebuggerTracer.EntityFrameTrace.ValueRecord { nodeId1 = reader.ReadUInt64(), nodeId2 = reader.ReadUInt64(), readableValue = reader.ReadString(), }); } entityFrameTrace.values.Add(step, values); } } entityData.Add(entityRef, entityFrameTrace); } } return(graphData); }