예제 #1
0
        /// <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.");
            }
        }
예제 #2
0
        /// <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;
                }
                }
            }
        }