/// <returns></returns>
protected bool TryParseAddress(string addressInHexa, out ulong address)
{
- if (addressInHexa == null)
+ if (string.IsNullOrWhiteSpace(addressInHexa))
{
address = 0;
return false;
addressInHexa = addressInHexa.TrimStart('0');
+ int index = addressInHexa.IndexOf('`');
+ if (index >= 0 && index < addressInHexa.Length - 1)
+ {
+ // Remove up to one instance of ` since that's what WinDbg adds to its x64 addresses.
+ addressInHexa = addressInHexa.Substring(0, index) + addressInHexa.Substring(index + 1);
+ }
+
return ulong.TryParse(addressInHexa, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out address);
}
FilteredHeap.GCHeap = GCHeap;
}
- if (!string.IsNullOrWhiteSpace(Segment))
+ if (TryParseAddress(Segment, out ulong segment))
{
- FilteredHeap.FilterBySegmentHex(Segment);
+ FilteredHeap.FilterBySegmentHex(segment);
+ }
+ else if (!string.IsNullOrWhiteSpace(Segment))
+ {
+ throw new DiagnosticsException($"Failed to parse segment '{Segment}'.");
}
if (MemoryRange is not null && MemoryRange.Length > 0)
HeapWithFilters.GCHeap = GCHeap;
}
- if (!string.IsNullOrWhiteSpace(Segment))
+ if (TryParseAddress(Segment, out ulong segment))
{
- HeapWithFilters.FilterBySegmentHex(Segment);
+ HeapWithFilters.FilterBySegmentHex(segment);
+ }
+ else if (!string.IsNullOrWhiteSpace(Segment))
+ {
+ throw new DiagnosticsException($"Failed to parse segment '{Segment}'.");
}
if (MemoryRange is not null)
SortSubHeaps = (heap) => heap.OrderBy(heap => heap.Index);
}
- public void FilterBySegmentHex(string segmentStr)
+ public void FilterBySegmentHex(ulong segment)
{
- if (!ulong.TryParse(segmentStr, NumberStyles.HexNumber, null, out ulong segment))
- {
- throw new ArgumentException($"Invalid segment address: {segmentStr}");
- }
-
- if (ThrowIfNoMatchingGCRegions && !_heap.Segments.Any(seg => seg.Address == segment || seg.CommittedMemory.Contains(segment)))
- {
- throw new ArgumentException($"No segments match address: {segment:x}");
- }
-
- Segment = segment;
+ Segment = segment != 0 ? segment : null;
}
public void FilterByStringMemoryRange(string[] memoryRange, string commandName)
filteredHeap.GCHeap = GCHeap;
}
- if (!string.IsNullOrWhiteSpace(Segment))
+ if (TryParseAddress(Segment, out ulong segment))
{
- filteredHeap.FilterBySegmentHex(Segment);
+ filteredHeap.FilterBySegmentHex(segment);
+ }
+ else if (!string.IsNullOrWhiteSpace(Segment))
+ {
+ throw new DiagnosticsException($"Failed to parse segment '{Segment}'.");
}
if (MemoryRange is not null)