diff --git a/src/TraceEvent/RegisteredTraceEventParser.cs b/src/TraceEvent/RegisteredTraceEventParser.cs index a971d4c4f..060d4bbf3 100644 --- a/src/TraceEvent/RegisteredTraceEventParser.cs +++ b/src/TraceEvent/RegisteredTraceEventParser.cs @@ -1046,7 +1046,17 @@ private DynamicTraceEventData.PayloadFetchClassInfo ParseFields(int startField, else { Debug.WriteLine(" Field is an array of size " + ((fixedCount != 0) ? fixedCount.ToString() : "VARIABLE") + " of type " + ((propertyFetch.Type ?? typeof(void))) + " at offset " + arrayFieldOffset.ToString("x")); - propertyFetch = DynamicTraceEventData.PayloadFetch.ArrayPayloadFetch(arrayFieldOffset, propertyFetch, arraySize, fixedCount, projectCharArrayAsString:false); + if (fixedCount != 0) + { + // Use FixedCountArrayPayloadFetch so that Size is set to the total byte size + // (fixedCount * element.Size) rather than just the element count, ensuring that + // subsequent field offsets are computed correctly. + propertyFetch = DynamicTraceEventData.PayloadFetch.FixedCountArrayPayloadFetch(arrayFieldOffset, propertyFetch, fixedCount, projectCharArrayAsString:false); + } + else + { + propertyFetch = DynamicTraceEventData.PayloadFetch.ArrayPayloadFetch(arrayFieldOffset, propertyFetch, arraySize, 0, projectCharArrayAsString:false); + } } fieldOffset = ushort.MaxValue; // Indicate that the next offset must be computed at run time.