From: Rodrigo Moya Date: Thu, 7 Sep 2017 20:16:13 +0000 (+0200) Subject: [Mono.Profiler.Log] Support MLPD version 13 X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;ds=sidebyside;h=05bd5d300445adabcbc56cc81de383590db37285;p=mono.git [Mono.Profiler.Log] Support MLPD version 13 The differences from v14 are small, and given it is the current "stable" MLPD version, it's worth supporting it. The differences are: * ImagePointer field not present in v13 Assembly*Event's * In MonitorEvent, LogMonitorEvent is not in a separate field, but included as a flag in the extType field. * SampleHitEvent's have a type field in v13, which was removed in v14, because only cycles samples are emitted. * MONO_GC_EVENT_{MARK,RECLAIM}_{START,END} were removed in v14 * SampleUnmanagedBinary's SegmentPointer is not based on ptr_base in v13 * In v13, HeapRootsEvent's Attributes is (wrongly) a byte, in v14 this was fixed and changed back to a uleb128 --- diff --git a/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogEnums.cs b/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogEnums.cs index 9772f224ff6..9fc47b470f0 100644 --- a/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogEnums.cs +++ b/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogEnums.cs @@ -173,6 +173,11 @@ namespace Mono.Profiler.Log { PreStartWorld = 8, PostStartWorld = 9, PostStartWorldUnlocked = 11, + // Following are v13 and older only + MarkBegin = 1, + MarkEnd = 2, + ReclaimBegin = 3, + ReclaimEnd = 4 } // mono/metadata/mono-gc.h : MonoGCHandleType diff --git a/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogProcessor.cs b/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogProcessor.cs index f6928f74505..5da4229538f 100644 --- a/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogProcessor.cs +++ b/mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogProcessor.cs @@ -230,13 +230,13 @@ namespace Mono.Profiler.Log { if (load) { ev = new AssemblyLoadEvent { AssemblyPointer = ReadPointer (), - ImagePointer = ReadPointer (), + ImagePointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : 0, Name = Reader.ReadCString (), }; } else if (unload) { ev = new AssemblyUnloadEvent { AssemblyPointer = ReadPointer (), - ImagePointer = ReadPointer (), + ImagePointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : 0, Name = Reader.ReadCString (), }; } else @@ -336,7 +336,7 @@ namespace Mono.Profiler.Log { Type = (LogExceptionClause) Reader.ReadByte (), Index = (long) Reader.ReadULeb128 (), MethodPointer = ReadMethod (), - ObjectPointer = ReadObject (), + ObjectPointer = StreamHeader.FormatVersion >= 14 ? ReadObject () : 0, }; break; default: @@ -344,11 +344,20 @@ namespace Mono.Profiler.Log { } break; case LogEventType.Monitor: + if (StreamHeader.FormatVersion < 14) { + if (extType.HasFlag (LogEventType.MonitorBacktrace)) { + extType = LogEventType.MonitorBacktrace; + } else { + extType = LogEventType.MonitorNoBacktrace; + } + } switch (extType) { case LogEventType.MonitorNoBacktrace: case LogEventType.MonitorBacktrace: ev = new MonitorEvent { - Event = (LogMonitorEvent) Reader.ReadByte (), + Event = StreamHeader.FormatVersion >= 14 ? + (LogMonitorEvent) Reader.ReadByte () : + (LogMonitorEvent) ((((byte) type & 0xf0) >> 4) & 0x3), ObjectPointer = ReadObject (), Backtrace = ReadBacktrace (extType == LogEventType.MonitorBacktrace), }; @@ -397,7 +406,7 @@ namespace Mono.Profiler.Log { for (var i = 0; i < list.Length; i++) { list [i] = new HeapRootsEvent.HeapRoot { ObjectPointer = ReadObject (), - Attributes = (LogHeapRootAttributes) Reader.ReadULeb128 (), + Attributes = StreamHeader.FormatVersion == 13 ? (LogHeapRootAttributes) Reader.ReadByte () : (LogHeapRootAttributes) Reader.ReadULeb128 (), ExtraInfo = (long) Reader.ReadULeb128 (), }; } @@ -414,9 +423,13 @@ namespace Mono.Profiler.Log { case LogEventType.Sample: switch (extType) { case LogEventType.SampleHit: + if (StreamHeader.FormatVersion < 14) { + // Read SampleType (always set to .Cycles) for versions < 14 + Reader.ReadByte (); + } ev = new SampleHitEvent { ThreadId = ReadPointer (), - UnmanagedBacktrace = ReadBacktrace (true, false), + UnmanagedBacktrace = ReadBacktrace (true, false), // FIXME: isn't this reversed? ManagedBacktrace = ReadBacktrace (true), }; break; @@ -429,7 +442,7 @@ namespace Mono.Profiler.Log { break; case LogEventType.SampleUnmanagedBinary: ev = new UnmanagedBinaryEvent { - SegmentPointer = ReadPointer (), + SegmentPointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : Reader.ReadSLeb128 (), SegmentOffset = (long) Reader.ReadULeb128 (), SegmentSize = (long) Reader.ReadULeb128 (), FileName = Reader.ReadCString (),