/// <summary> /// Deserializes an entire trace entry from the given binary reader. /// </summary> /// <typeparam name="T">Trace entry type.</typeparam> /// <param name="reader">Binary reader containing the trace data.</param> /// <returns></returns> public static TraceEntry DeserializeNextEntry(FastBinaryReader reader) { // Read depending on type TraceEntryTypes entryType = (TraceEntryTypes)reader.ReadByte(); switch (entryType) { case TraceEntryTypes.ImageMemoryAccess: return(Deserialize <Microwalk.TraceEntryTypes.ImageMemoryAccess>(reader)); case TraceEntryTypes.HeapMemoryAccess: return(Deserialize <Microwalk.TraceEntryTypes.HeapMemoryAccess>(reader)); case TraceEntryTypes.StackMemoryAccess: return(Deserialize <Microwalk.TraceEntryTypes.StackMemoryAccess>(reader)); case TraceEntryTypes.Allocation: return(Deserialize <Microwalk.TraceEntryTypes.Allocation>(reader)); case TraceEntryTypes.Free: return(Deserialize <Microwalk.TraceEntryTypes.Free>(reader)); case TraceEntryTypes.Branch: return(Deserialize <Microwalk.TraceEntryTypes.Branch>(reader)); default: throw new TraceFormatException($"Unknown trace entry type."); } }
/// <summary> /// Reads all entries from the trace file using deferred execution. /// </summary> /// <returns></returns> private IEnumerable <TraceEntry> ReadEntriesLazily() { // Read trace entries _traceFileReader.Position = _headerEndOffset; for (int i = 0; i < _traceEntryCount; ++i) { // Read depending on type TraceEntryTypes entryType = (TraceEntryTypes)_traceFileReader.ReadByte(); switch (entryType) { case TraceEntryTypes.Allocation: { AllocationEntry entry = new AllocationEntry(); entry.Size = _traceFileReader.ReadUInt32(); entry.Address = _traceFileReader.ReadUInt64(); yield return(entry); break; } case TraceEntryTypes.Free: { FreeEntry entry = new FreeEntry(); entry.Address = _traceFileReader.ReadUInt64(); yield return(entry); break; } case TraceEntryTypes.ImageMemoryRead: { ImageMemoryReadEntry entry = new ImageMemoryReadEntry(); entry.InstructionImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.InstructionImageName = _knownImages[entry.InstructionImageId]; entry.InstructionAddress = _traceFileReader.ReadUInt32(); entry.MemoryImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.MemoryImageName = _knownImages[entry.MemoryImageId]; entry.MemoryAddress = (uint)(_traceFileReader.ReadUInt32() & _alignmentOperand); yield return(entry); break; } case TraceEntryTypes.ImageMemoryWrite: { ImageMemoryWriteEntry entry = new ImageMemoryWriteEntry(); entry.InstructionImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.InstructionImageName = _knownImages[entry.InstructionImageId]; entry.InstructionAddress = _traceFileReader.ReadUInt32(); entry.MemoryImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.MemoryImageName = _knownImages[entry.MemoryImageId]; entry.MemoryAddress = (uint)(_traceFileReader.ReadUInt32() & _alignmentOperand); yield return(entry); break; } case TraceEntryTypes.AllocMemoryRead: { AllocMemoryReadEntry entry = new AllocMemoryReadEntry(); entry.ImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.ImageName = _knownImages[entry.ImageId]; entry.InstructionAddress = _traceFileReader.ReadUInt32(); entry.MemoryAddress = _traceFileReader.ReadUInt64() & _alignmentOperand; yield return(entry); break; } case TraceEntryTypes.AllocMemoryWrite: { AllocMemoryWriteEntry entry = new AllocMemoryWriteEntry(); entry.ImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.ImageName = _knownImages[entry.ImageId]; entry.InstructionAddress = _traceFileReader.ReadUInt32(); entry.MemoryAddress = _traceFileReader.ReadUInt64() & _alignmentOperand; yield return(entry); break; } case TraceEntryTypes.Branch: { BranchEntry entry = new BranchEntry(); entry.SourceImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.SourceImageName = _knownImages[entry.SourceImageId]; entry.SourceInstructionAddress = _traceFileReader.ReadUInt32(); entry.DestinationImageId = _imageIdLookup[_traceFileReader.ReadByte()]; entry.DestinationImageName = _knownImages[entry.DestinationImageId]; entry.DestinationInstructionAddress = _traceFileReader.ReadUInt32(); entry.Taken = _traceFileReader.ReadBoolean(); entry.BranchType = (BranchTypes)_traceFileReader.ReadByte(); yield return(entry); break; } } } }