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
PreStartWorld = 8,
PostStartWorld = 9,
PostStartWorldUnlocked = 11,
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
}
// mono/metadata/mono-gc.h : MonoGCHandleType
if (load) {
ev = new AssemblyLoadEvent {
AssemblyPointer = ReadPointer (),
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 (),
Name = Reader.ReadCString (),
};
} else if (unload) {
ev = new AssemblyUnloadEvent {
AssemblyPointer = ReadPointer (),
- ImagePointer = ReadPointer (),
+ ImagePointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : 0,
Name = Reader.ReadCString (),
};
} else
Name = Reader.ReadCString (),
};
} else
Type = (LogExceptionClause) Reader.ReadByte (),
Index = (long) Reader.ReadULeb128 (),
MethodPointer = ReadMethod (),
Type = (LogExceptionClause) Reader.ReadByte (),
Index = (long) Reader.ReadULeb128 (),
MethodPointer = ReadMethod (),
- ObjectPointer = ReadObject (),
+ ObjectPointer = StreamHeader.FormatVersion >= 14 ? ReadObject () : 0,
}
break;
case LogEventType.Monitor:
}
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 {
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),
};
ObjectPointer = ReadObject (),
Backtrace = ReadBacktrace (extType == LogEventType.MonitorBacktrace),
};
for (var i = 0; i < list.Length; i++) {
list [i] = new HeapRootsEvent.HeapRoot {
ObjectPointer = ReadObject (),
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 (),
};
}
ExtraInfo = (long) Reader.ReadULeb128 (),
};
}
case LogEventType.Sample:
switch (extType) {
case LogEventType.SampleHit:
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 (),
ev = new SampleHitEvent {
ThreadId = ReadPointer (),
- UnmanagedBacktrace = ReadBacktrace (true, false),
+ UnmanagedBacktrace = ReadBacktrace (true, false), // FIXME: isn't this reversed?
ManagedBacktrace = ReadBacktrace (true),
};
break;
ManagedBacktrace = ReadBacktrace (true),
};
break;
break;
case LogEventType.SampleUnmanagedBinary:
ev = new UnmanagedBinaryEvent {
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 (),
SegmentOffset = (long) Reader.ReadULeb128 (),
SegmentSize = (long) Reader.ReadULeb128 (),
FileName = Reader.ReadCString (),