internal static Packets.ProfilerPacket Decode(_DBG.BitStream stream) { uint type = stream.ReadBits(Packets.Commands.Bits.CommandHeader); Tracing.PacketTrace("New Packet {0}", type); switch(type) { case Packets.Commands.c_Profiling_Timestamp: return new Packets.TimestampPacket(stream); case Packets.Commands.c_Profiling_Memory_Layout: return new Packets.MemoryLayoutPacket(stream); case Packets.Commands.c_Profiling_HeapDump_Start: return new Packets.HeapDumpStartPacket(stream); case Packets.Commands.c_Profiling_HeapDump_Stop: return new Packets.HeapDumpStopPacket(stream); case Packets.Commands.c_Profiling_HeapDump_Root: return new Packets.HeapDumpRootPacket(stream); case Packets.Commands.c_Profiling_HeapDump_Object: return new Packets.HeapDumpObjectPacket(stream); case Packets.Commands.c_Profiling_Calls_Call: return new Packets.CallPacket(stream); case Packets.Commands.c_Profiling_Calls_Return: return new Packets.ReturnPacket(stream); case Packets.Commands.c_Profiling_Calls_CtxSwitch: return new Packets.ContextSwitchPacket(stream); case Packets.Commands.c_Profiling_Allocs_Alloc: return new Packets.ObjectAllocationPacket(stream); case Packets.Commands.c_Profiling_Allocs_Relloc: return new Packets.ObjectRelocationPacket(stream); case Packets.Commands.c_Profiling_Allocs_Delete: return new Packets.ObjectDeletionPacket(stream); case Packets.Commands.c_Profiling_GarbageCollect_Begin: return new Packets.GarbageCollectionBeginPacket(stream); case Packets.Commands.c_Profiling_GarbageCollect_End: return new Packets.GarbageCollectionEndPacket(stream); case Packets.Commands.c_Profiling_HeapCompact_Begin: return new Packets.HeapCompactionBeginPacket(stream); case Packets.Commands.c_Profiling_HeapCompact_End: return new Packets.HeapCompactionEndPacket(stream); default: throw new ApplicationException("Unable to decode packet."); } }
public ObjectAllocationPacket(_DBG.BitStream stream) : base(Commands.c_Profiling_Allocs_Alloc) { m_address = ReadAndUnpackBits(stream); m_size = ReadAndUnpackBits(stream) * ProfilerSession.HeapBlockSize; m_dt = (_DBG.RuntimeDataType)stream.ReadBits(Commands.Bits.DataType); if (m_dt == _DBG.RuntimeDataType.DATATYPE_CLASS || m_dt == _DBG.RuntimeDataType.DATATYPE_VALUETYPE || m_dt == _DBG.RuntimeDataType.DATATYPE_SZARRAY) { m_type = ReadTypeDefIndex(stream); if (m_dt == _DBG.RuntimeDataType.DATATYPE_SZARRAY) { m_rank = (ushort)ReadAndUnpackBits(stream); } } else { m_type = (uint)m_dt; } }
public HeapDumpObjectPacket(_DBG.BitStream stream) : base(Commands.c_Profiling_HeapDump_Object) { m_address = ReadAndUnpackBits(stream); m_size = ReadAndUnpackBits(stream) * ProfilerSession.HeapBlockSize; m_dt = (_DBG.RuntimeDataType)stream.ReadBits(Commands.Bits.DataType); if (m_dt == _DBG.RuntimeDataType.DATATYPE_CLASS || m_dt == _DBG.RuntimeDataType.DATATYPE_VALUETYPE) { m_typedef = ReadTypeDefIndex(stream); } else if (m_dt == _DBG.RuntimeDataType.DATATYPE_SZARRAY) { m_arrayElementType = ReadTypeDefIndex(stream); m_arrayLevels = (ushort)ReadAndUnpackBits(stream); } m_refs = new List<uint>(); bool moreRefs; while (moreRefs = ReadBoolean(stream)) { m_refs.Add(ReadAndUnpackBits(stream)); } }
public HeapDumpRootPacket(_DBG.BitStream stream) : base(Commands.c_Profiling_HeapDump_Root) { m_address = ReadAndUnpackBits(stream); m_source = stream.ReadBits(Packets.Commands.Bits.RootTypes); switch(m_source) { case Packets.Commands.RootTypes.Root_Stack: m_method = ReadMethodDefIndex(stream); break; } Tracing.PacketTrace("root type:{0} at {1}", m_source, m_address); }
static protected bool ReadBoolean(_DBG.BitStream stream) { return (stream.ReadBits(1) == 1); }
static protected uint ReadAndUnpackBits(_DBG.BitStream stream) { const int SHIFT_PER_NIBBLE = 2; //2^2 = 4 bits per nibble uint nibbles = stream.ReadBits(Packets.Commands.Bits.NibbleCount) + 1; return stream.ReadBits((int)nibbles << SHIFT_PER_NIBBLE); }