From 56c7eec4176911782f2ef9a5e5c31928254ced35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 19:52:50 +0000 Subject: [PATCH 1/2] Initial plan From 400e27eb58eccdddd77b06e6cddeb049e4ab266a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 19:58:53 +0000 Subject: [PATCH 2/2] Fix fixed array payload offset bug in RegisteredTraceEventParser When processing ETW events with fixed-count array fields (e.g. from TraceLoggingUInt32FixedArray / TraceLoggingFloat32FixedArray), the PayloadFetch.Size was being set to the element count instead of the total byte size. This caused OffsetOfNextField to advance by only `fixedCount` bytes instead of `fixedCount * elementSize` bytes, corrupting the offsets of all subsequent fields. Fix: use FixedCountArrayPayloadFetch (which correctly computes size = elementCount * element.Size) instead of ArrayPayloadFetch when fixedCount != 0, matching the pattern already used in EventPipeMetadata.cs. Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com> --- src/TraceEvent/RegisteredTraceEventParser.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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.