public void WriteSizeTrack(SizeTracker tracker) { var streamPos = _stream.Position; int length = (int)((streamPos + _position) - tracker); if ((int)tracker <= streamPos) { _trackBytes[0] = (byte)length; _trackBytes[1] = (byte)(length >> 8); _trackBytes[2] = (byte)(length >> 16); _trackBytes[3] = (byte)(length >> 24); _stream.Position = (long)tracker - 4; _stream.Write(_trackBytes, 0, 4); _stream.Position = streamPos; } else { var offset = (int)(tracker - streamPos); _buffer[offset - 4] = (byte)length; _buffer[offset - 3] = (byte)(length >> 8); _buffer[offset - 2] = (byte)(length >> 16); _buffer[offset - 1] = (byte)(length >> 24); } }
public override void Write(Utf8JsonWriter writer, ITypeData value, JsonSerializerOptions options) { // We basically want to verbosely write out our this typeref, everything else should use the simple type ref converter. // Everything else in this type should also just be serialized normally. writer.WriteStartObject(); writer.WritePropertyName(nameof(value.This)); WriteThis(writer, value.This, options); // Write each of the other properties explicitly by converting writer.WritePropertyName(nameof(value.Attributes)); JsonSerializer.Serialize(writer, value.Attributes, options); writer.WritePropertyName(nameof(value.ImplementingInterfaces)); JsonSerializer.Serialize(writer, value.ImplementingInterfaces, options); writer.WritePropertyName(nameof(value.InstanceFields)); JsonSerializer.Serialize(writer, value.InstanceFields, options); writer.WritePropertyName(nameof(value.Layout)); JsonSerializer.Serialize(writer, value.Layout, options); writer.WritePropertyName(nameof(value.Methods)); JsonSerializer.Serialize(writer, value.Methods, options); writer.WritePropertyName(nameof(value.NestedTypes)); JsonSerializer.Serialize(writer, value.NestedTypes, options); writer.WritePropertyName(nameof(value.Parent)); JsonSerializer.Serialize(writer, value.Parent, options); writer.WritePropertyName(nameof(value.Properties)); JsonSerializer.Serialize(writer, value.Properties, options); writer.WritePropertyName(nameof(value.Specifiers)); JsonSerializer.Serialize(writer, value.Specifiers, options); writer.WritePropertyName(nameof(value.StaticFields)); JsonSerializer.Serialize(writer, value.StaticFields, options); writer.WritePropertyName(nameof(value.Type)); JsonSerializer.Serialize(writer, value.Type, options); writer.WritePropertyName(nameof(value.TypeDefIndex)); JsonSerializer.Serialize(writer, value.TypeDefIndex, options); writer.WriteNumber("Size", SizeTracker.GetSize(types, value)); writer.WriteEndObject(); }
public static HeapAllocationSizes[] GetProcessHeapSizes(string dmpDir) { if (HeapDiagnostics && dmpDir != null) { SizeTracker.NextDump(); TRACK_SIZES.ForEach(t => t.OpenDumpFile(dmpDir)); } var count = GetProcessHeaps(0, null); var buffer = new IntPtr[count]; GetProcessHeaps(count, buffer); var sizes = new HeapAllocationSizes[count]; for (int i = 0; i < count; i++) { var committedSizes = HeapDiagnostics ? new Dictionary <long, int>() : null; var stringCounts = HeapDiagnostics ? new Dictionary <string, int>() : null; var h = buffer[i]; HeapLock(h); var e = new PROCESS_HEAP_ENTRY(); while (HeapWalk(h, ref e)) { if ((e.wFlags & PROCESS_HEAP_ENTRY_WFLAGS.PROCESS_HEAP_ENTRY_BUSY) != 0) { sizes[i].Committed += e.cbData + e.cbOverhead; if (committedSizes != null) { // Update count if (!committedSizes.ContainsKey(e.cbData)) { committedSizes[e.cbData] = 0; } committedSizes[e.cbData]++; } if (stringCounts != null) { // Find string(s) var byteData = new byte[e.cbData]; IntPtr pData = e.lpData; Marshal.Copy(pData, byteData, 0, byteData.Length); TRACK_SIZES.ForEach(t => t.DumpUnseenSize(pData, byteData)); foreach (var byteString in FindStrings(byteData)) { if (!stringCounts.ContainsKey(byteString)) { stringCounts[byteString] = 0; } stringCounts[byteString]++; } } } else if ((e.wFlags & PROCESS_HEAP_ENTRY_WFLAGS.PROCESS_HEAP_UNCOMMITTED_RANGE) != 0) { sizes[i].Reserved += e.cbData + e.cbOverhead; } else { sizes[i].Unknown += e.cbData + e.cbOverhead; } } HeapUnlock(h); if (committedSizes != null) { sizes[i].CommittedSizes = committedSizes.OrderByDescending(p => p.Value).ToList(); } if (stringCounts != null) { sizes[i].StringCounts = stringCounts.OrderByDescending(p => p.Value).ToList(); } } if (HeapDiagnostics) { TRACK_SIZES.ForEach(t => t.CloseDumpFile()); } return(sizes); }