diff --git a/src/TraceEvent/SourceConverters/NettraceUniversalConverter.cs b/src/TraceEvent/SourceConverters/NettraceUniversalConverter.cs index 3bbb40a2c..f6f686f7e 100644 --- a/src/TraceEvent/SourceConverters/NettraceUniversalConverter.cs +++ b/src/TraceEvent/SourceConverters/NettraceUniversalConverter.cs @@ -12,7 +12,7 @@ internal sealed class NettraceUniversalConverter private const string DotnetJittedCodeMappingName = "/memfd:doublemapper"; private List _dynamicSymbols = new List(); - private Dictionary _mappingIdToProcesses = new Dictionary(); + private Dictionary> _mappingIdToProcesses = new Dictionary>(); private Dictionary _mappingMetadata = new Dictionary(); internal NettraceUniversalConverter() @@ -46,7 +46,12 @@ public void BeforeProcess(TraceLog traceLog, TraceEventDispatcher source) universalSystemParser.ProcessMapping += delegate (ProcessMappingTraceData data) { TraceProcess process = traceLog.Processes.GetOrCreateProcess(data.ProcessID, data.TimeStampQPC); - _mappingIdToProcesses[data.Id] = process; + if (!_mappingIdToProcesses.TryGetValue(data.Id, out HashSet processes)) + { + processes = new HashSet(); + _mappingIdToProcesses[data.Id] = processes; + } + processes.Add(process); if (!string.IsNullOrEmpty(data.FileName) && data.FileName.StartsWith(DotnetJittedCodeMappingName, StringComparison.Ordinal)) { @@ -80,9 +85,12 @@ public void AfterProcess(TraceLog traceLog) { foreach (var universalProcessSymbol in _dynamicSymbols) { - if (_mappingIdToProcesses.TryGetValue(universalProcessSymbol.MappingId, out TraceProcess process)) + if (_mappingIdToProcesses.TryGetValue(universalProcessSymbol.MappingId, out HashSet processes)) { - traceLog.CodeAddresses.AddUniversalDynamicSymbol(universalProcessSymbol, process); + foreach (TraceProcess process in processes) + { + traceLog.CodeAddresses.AddUniversalDynamicSymbol(universalProcessSymbol, process); + } } } }