Skip to content

chore: sync fork with microsoft/perfview main - #3

Merged
jamescrosswell merged 151 commits into
mainfrom
sync/upstream-main
Aug 11, 2026
Merged

chore: sync fork with microsoft/perfview main#3
jamescrosswell merged 151 commits into
mainfrom
sync/upstream-main

Conversation

@jamescrosswell

Copy link
Copy Markdown
Collaborator

Syncs this fork's main with microsoft/perfview main (151 commits).

This fork carries no commits of its owngit rev-list --count upstream/main..origin/main
returns 0 — so this is a content-level fast-forward. A true fast-forward push was not possible
(the org ruleset requires changes go through a pull request, and it has no bypass actors), so
this PR is the mechanism. It should be merged with "Create a merge commit"; squash would
collapse 151 upstream commits into one and rebase would rewrite their SHAs.

Why now

Unblocks getsentry/sentry-dotnet#5469 — a profiling memory leak whose fix has to land in
TraceEvent. sentry-dotnet's submodule pin (e343a0cf) is ~219 commits behind, and the
submodule URL points at this fork, so the new head has to exist here before it can be pinned.

Verification already done against this content

Built and tested from sentry-dotnet with the submodule pointed at upstream head:

Copilot AI and others added 30 commits June 11, 2025 14:34
…g at the hr instead of causing an NRE which masks the exception. (microsoft#2177)
…sibility (microsoft#2239)

* Initial plan for issue

* Add AutomationProperties.Name to Process selection DataGrid for accessibility

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Update name casing.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
…ontrast (microsoft#2235)

* Initial plan for issue

* Add focus indicators for hyperlinks in dark theme

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Fix high contrast dark mode styling for menu, dropdown and filter

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Revert failed high contrast changes and fix light theme menu colors

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Revert theme changes and fix menu bar high contrast support

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Update the background for the filter text in the main window.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
Show all scans even when the filter driver events aren't present.  This
is especially useful when looking at traces generated by
New-MpPerformanceRecording.
…icrosoft#2230)

* Initial plan for issue

* Implement IDisposable for WebBrowserWindow to fix WebView2 crash

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Add disposal safety checks for async WebView2 initialization

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Simplify disposal pattern as requested - remove IDisposable interface

Co-authored-by: marklio <529657+marklio@users.noreply.github.com>

* Use CanGoBack and CanGoForward properties instead of duplicating disposal checks

Co-authored-by: cincuranet <4540597+cincuranet@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: marklio <529657+marklio@users.noreply.github.com>
Co-authored-by: cincuranet <4540597+cincuranet@users.noreply.github.com>
With this, PerfView will be able to create native AOT gcdumps. It activates the same codepaths we had for Project N, so it will also properly decode type names.

The changes to DotNetHeapDumpGraphReader match dotnet/diagnostics#5506.
…te (microsoft#2237)

* Initial plan for issue

* Fix NVDA theme selection accessibility by adding IsCheckable="True" to theme MenuItems

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Add IsCheckable="True" to Authentication menu items for accessibility

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
…om EventPipeEventSource (microsoft#2232)

* Initial plan for issue

* Add EventPipe support to PredefinedDynamicTraceEventParser

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Update UniversalEventsTraceEventParser to inherit from PredefinedDynamicTraceEventParser

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Update cpu and cswitch events to use registered dynamic events

Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>

* Fix parser implementation.

* Handle the case when events don't match any known template in
PredefinedDynamicTraceEventParser.  Ensure we don't spend lots of time
decoding metadata over and over.

* Fix implementation to work with instances of TraceLog. Metadata is
pulled from the serialized dynamic event information.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
…oft#2247)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
…icrosoft#2257)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
…no selected nodes (microsoft#2254)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: mconnew <8648390+mconnew@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
…ntifier isn't specified (microsoft#2249)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
…stead of memfd:doublemapper (microsoft#2269)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
Without this the menu and filter are white on white in dark mode.
Add missing info about LabelList ID 0 being the empty list
- Update manifest to opt into PMV2 scaling (eliminates blurring on high DPI)
- Tweak dark mode scroll bars to be more visible
- Update to C# 11
- Update most packages to latest (updating Azure packages cause runtime failures)
- Add Packages.props to the solution folder for simplicity
- Hook various XAML files to pick up the theme
- Set the WebView2 control preferred color scheme to match
- Remove outdated Internet Explorer related <meta> tag
- Change html sources to indicate that they support light and dark themes
- Generate html with theme specific code

I generally used two root entries `:root[data-theme="light"]` as it enables doing things like letting you flip the theme with a button (say to print). I didn't put that in this PR as I'm not super clear on the value.

For future reference, here is how you would do that:

```html
  <style>
@media print {
  .no-print {
    display: none !important;
  }
  </style>

<button type="button" class="no-print" onclick="toggleTheme()">🌗 Toggle Theme</button>

  <script>
    // Simple theme toggle script: switches the data-theme attribute on <html>
    function toggleTheme() {
      const root = document.documentElement;
      const newTheme = root.getAttribute('data-theme') === 'light' ? 'dark' : 'light';
      root.setAttribute('data-theme', newTheme);
    }
  </script>
```

I gave up on updating the Azure packages as they cause PerfView to fail at runtime. Would require a bit more time.
… command line argument for PerfView and HeapDump (microsoft#2278)

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
Theming isn't easy for the system message box and requires using undocumented APIs. To get theming, including a simple themed message box that roughly follows the existing layout.

Move the project to the standard SDK which enables using source generators. The existing SDK was a hack for building before WPF and WinForms were officially released on .NET Core.

Push the C# version to 12 for collections expressions, default parameters for lambdas, etc.

Add CsWin32 for PInvoke source generation. Add PInvokes for getting the modern shell icons for the new dialog. System.Drawing has the new Icons in .NET, but we're still targetting 4.6.2. (Note that some PInvokes have to still be manually defined because we're targetting AnyCPU. Some headers in Windows are defined with nonstandard packing, which makes the SDK generate metadata that is platform specific. For safety they don't generate any of these and they must be manually evaluated. The manual ones I added come from System.Drawing. If we targetted specific architectures this wouldn't be necessary.)

If we're able to move to .NET Core in the future we can get more explicit, coherent theming support through WPF or MAUI.
… all threads (microsoft#2284)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: brianrob <6210322+brianrob@users.noreply.github.com>
Co-authored-by: Brian Robbins <brianrob@microsoft.com>
… perf text file parser (microsoft#2286)

* Handle some parsing edge cases and add support for disk IO events

* Fix issues with previous change

* Add support for wakeup events

* Add support for old event format as well

* Add perfview event processing for process_exec

* Fix style issue

* Add test for sched:exec_process

* Add support for IRQ events

---------

Co-authored-by: Tom Ootjers <tomoot@ntdev.microsoft.com>
Co-authored-by: Dillon Caryl <dicaryl@microsoft.com>
Co-authored-by: dillon-caryl <dcaryl@hotmail.com>
brianrob and others added 27 commits June 15, 2026 15:42
Bounds-check length-prefix bytes before reading variable-length array
elements in dynamic event payloads so malformed events cannot cause
out-of-bounds reads. Refines the variable-element minimum size used by
the parser.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Route WriteAllManifests through the shared PathUtilities.SanitizeFileName
helper so malicious provider names cannot escape the manifest output
directory or overwrite arbitrary files.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Validate the stack-bytes size field when parsing EventPipe V3 event
headers so a malformed StackBytesSize cannot cause out-of-bounds reads
while walking event payloads.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Validate payload size against the event's data length before reading
GCDynamic event fields so malformed payloads cannot cause out-of-bounds
reads.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Limit the PDB filename read in the CodeView debug entry to the size
declared by IMAGE_DEBUG_DIRECTORY.SizeOfData so an unterminated name
cannot scan adjacent memory.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Cap PE resource name reads at the size declared by the resource data
directory so malformed names cannot read past the resource section.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
TdhEventParser previously dereferenced every offset in a
TRACE_EVENT_INFO or EVENT_MAP_INFO buffer without validating it against
the buffer size. Thread the buffer length through TdhEventParser and
ParseMap and bounds-check every offset and array extent at the point
it is read.

Cap nested struct recursion at 32. Optional descriptive strings degrade
gracefully on a bad offset (ProviderName falls back to UnknownProvider,
names to string.Empty, maps are skipped) rather than dropping the
whole event; a structurally invalid header still rejects the event.
The legacy unchecked TdhEventParser constructor and ParseMap overload
are removed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Bump ReleaseVersion in src/Directory.Build.props from 3.2.3 to 3.2.4 in
preparation for the v3.2.4 release.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary

These changes shipped in the **PerfView and TraceEvent 3.2.4** release.
This PR brings them into `main` so that all future releases also contain
them.

## Hardening fixes

**Malformed-input bounds checking**
- Fix BPerf WildCopy so short copies do not write past the requested
output range
- Validate BPerf event record bounds
- Validate dynamic event array bounds
- Bounds-check StackBytesSize in EventPipe V3 event headers
- Bounds-check GCDynamic event payloads
- Bounds-check TDH metadata offsets in RegisteredTraceEventParser
- Bound CodeView PDB filename read by IMAGE_DEBUG_DIRECTORY SizeOfData
- Bound PE resource name reads by the resource data directory size

**Path-containment hardening**
- Fix source-server path traversal and command injection
- Validate PDB extraction target paths against the symbol directory
- Sanitize R2R perf map symbol paths
- Constrain DiagSession resource extraction paths
- Validate PdbScope XML module paths
- Sanitize provider names when writing dynamic manifests

## Release mechanics
- Bump ReleaseVersion to 3.2.4
On musl distros (e.g. Alpine) libc and the dynamic loader are combined
into a single module named like ld-musl-x86_64.so.1, where threads start.
Treat it as a valid top frame so musl stacks aren't marked BROKEN, mirroring
the existing glibc libc handling. Add an in-memory nettrace unit test.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Why

Traces captured with one-collect on musl-based Linux distros (e.g.
Alpine) show a large fraction of stacks marked BROKEN when opened in
PerfView or TraceEvent. On a real Alpine trace, about 18% of samples
were broken. The root cause is that thread base frames on musl live in
the combined libc + dynamic loader module, named like
`ld-musl-x86_64.so.1`, which `ReasonableTopFrame` did not recognize as a
legitimate thread-start module. We already special-case glibc's `libc`
for the same reason; musl was simply missing.

## What

- `TraceEventStacks.cs`: In `ReasonableTopFrame`, treat any module whose
name starts with `ld-musl-` (case-insensitive, so it covers `x86_64`,
`aarch64`, etc.) as a valid top frame, mirroring the existing glibc
`libc` handling. When matched, a stack rooted there is no longer wrapped
in a BROKEN frame.

- Added `Universal/MuslBrokenStackTests.cs`: a unit test that
synthesizes a tiny in-memory V6 nettrace (no large trace binary added to
the repo) containing a musl loader module, an ordinary library, and two
cpu samples: one rooted in the musl module and one rooted in the
ordinary library. It asserts the musl-rooted stack is not BROKEN while
the ordinary-library-rooted stack still is, parameterized over both
`ld-musl-x86_64.so.1` and `ld-musl-aarch64.so.1`.

## Validation

- A throwaway TraceEvent-based console app run against the real Alpine
trace confirmed broken stacks dropped from 18.4% to 3.7% (eliminating
~6,100 musl-rooted frames). The scratch app was not committed.
- Confirmed the new test fails without the fix (musl stack marked
BROKEN) and passes with it.
- Full TraceEvent suite is green: 2272 passing on net8.0 and 2289 on
net462, no regressions.

## Notes for reviewers

The negative-case assertion (ordinary library still BROKEN) is
intentional to guard against the match being too broad. The test writer
emits a non-zero `syncTimeQPC` so iterating relative timestamps does not
trip a Debug.Assert in `QPCTimeToRelMSec`; this is a test-harness detail
only.
…soft#2439)

When collecting with /InMemoryCircularBuffer and /CircularMB:N where N is
larger than ~256, PerfView collection succeeds but the subsequent
KernelTraceControl merge fails (e.g. CreateMergedTraceFile returns
0x80280012), and the requested memory grows quadratically.

The buffering-mode branch of GetProperties overwrote properties->BufferSize
with m_CircularBufferMB. BufferSize is a per-buffer size in KB, so a megabyte
value was being written into a kilobyte field. This made each ETW buffer far
larger than the OS maximum buffer size, which the relogger later chokes on
during merge, and it contradicted the MinimumBuffers computation on the line
above (which divides by the 64 KB quantum). It also corrupted the Attach
round-trip that reconstructs buffer settings when stopping the session.

Remove the erroneous assignment so BufferSize stays at the per-buffer
quantum (m_BufferQuantumKB) set earlier, matching the file-based and
real-time paths. MinimumBuffers alone now sizes the in-memory pool, so
(MinimumBuffers * BufferSize) == m_CircularBufferMB megabytes as intended.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
PerfView 3.2.4 can throw `ArgumentOutOfRangeException` when GC Stats or
Heap Analyzer replays `GC/CommittedUsage` events from ETLX. During
conversion, `FixupData()` classifies the raw dynamic event and the ETLX
persists the synthetic event ID, but the original dynamic payload
envelope remains unchanged. On replay, the typed template therefore
still needs to parse that envelope.

This change refreshes the payload layout in `EventPayload` only when
processing a `TraceLog`. Raw ETW and EventPipe dispatch continue using
the payload prepared by `FixupData()`, avoiding redundant parsing.
Fixed-offset `CommittedUsage` fields also return safe defaults for
truncated payloads.

Regression coverage includes valid ETLX replay without `FixupData()`,
reused replay templates with distinct payloads, and malformed payload
access through properties, `PayloadValues`, and `ToXml`.

Fixes microsoft#2438
* Enable W4 and warnings as errors for C++ projects

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5b148be3-5dce-425e-b025-94eb7b8de1d5

* Remove stale sampling debug code

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5b148be3-5dce-425e-b025-94eb7b8de1d5

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ft#2434)

* Support embedded portable PDBs for managed symbol resolution

Managed assemblies built with <DebugType>embedded</DebugType> carry their
portable PDB inside the PE image rather than in a standalone .pdb file.
Previously SymbolReader could not read these, so source/line lookup failed
for such modules.

Add the ability to open an embedded portable PDB:

- SymbolReader.OpenEmbeddedPortablePdb reads the EmbeddedPortablePdb
  debug-directory entry from a module and returns a PortableSymbolModule.
  Results are cached under a key suffixed so they cannot collide with
  standalone-PDB cache entries.
- SymbolReader.OpenSymbolFileForModuleFile is a module-oriented entry point
  that prefers a standalone PDB and falls back to an embedded portable PDB.
- PortableSymbolModule gains a constructor that takes a
  MetadataReaderProvider (which owns its own backing memory).
- TraceLog.OpenPdbForModuleFile falls back to the module's embedded portable
  PDB when the on-disk module matches the trace and no standalone PDB exists.

Tests: add an EmbeddedPdbTestApp fixture (built with embedded PDBs) and
cover the happy path, caching, not-embedded/missing-file cases, the
module-oriented entry point (embedded and standalone), and the end-to-end
TraceLog fallback path. All run cross-platform on net462 and net8.0.

* Build embedded-PDB test fixture unoptimized for stable source lines

In Release the C# compiler optimizes EmbeddedTarget.Add, shifting its first sequence point from the 'int sum = a + b;' line to the 'return' line, so the source-line assertions failed in the Release CI leg. Pin Optimize=false on the fixture so its emitted sequence points are stable regardless of the build configuration.

* Remove test-only OpenSymbolFileForModuleFile wrapper

Per PR review: this wrapper was called only from tests, and TraceLog.OpenPdbForModuleFile already provides the standalone-then-embedded fallback for the trace path. Removed it and its three dedicated tests, keeping OpenEmbeddedPortablePdb (the building block TraceLog uses).
…t#2444)

FastSerializationObjectParser.ReadBlockHeader read an attacker-controlled
32-bit type-name length from fully untrusted nettrace/EventPipe input and only
validated the upper bound (typeLen > maxLen). A negative length passed that
check and flowed into 'stackalloc byte[typeLen]', where the count is converted
to an enormous unsigned size, reliably crashing the process with an uncatchable
StackOverflowException (a denial of service on malformed input). This was found
by the TraceEvent nettrace fuzzer, which reproduces it with a 693-byte input.

Reject negative type-name lengths alongside oversized ones, and add a
regression test that asserts a FormatException (not a crash) for a negative
object type length.


Copilot-Session: 7c1dc14b-deed-412d-bdca-a44a5ac9bf9a

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…rosoft#2445)

* Fix AccessViolation on malformed MethodILToNativeMap entry count

TraceLog.AddILMapping trusted CountOfMapEntries, a 16-bit count read from fully
untrusted MethodILToNativeMap (EventID 190) event payload, when reading the
ILOffset/NativeOffset entries. Because NativeOffset(i) is indexed relative to
CountOfMapEntries, a corrupt or fuzzed EventPipe/ETW stream that claims more
entries than the payload actually contains caused the reads to index past the
end of the event buffer and access protected memory, crashing the process with
an (uncatchable) AccessViolationException. Found by the TraceEvent nettrace
fuzzer.

Reject events whose payload is too small for the claimed entry count (a valid
event has EventDataLength >= CountOfMapEntries * 8 + 21), record the skip in the
conversion log, and add a regression test that drives the full TraceLog
conversion path with such a malformed event.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 7c1dc14b-deed-412d-bdca-a44a5ac9bf9a

* Simplify IL map payload validation

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b49ece18-cc2c-4ca2-8aff-82c7906a5518

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…itch lines (microsoft#2446)

ReadProcessNameUntilNextField loops until it finds the expected next field
name (e.g. prev_pid/next_pid/pid). On malformed or truncated perf script
input where that field name never appears, the loop never terminated,
hanging the parser. OneFuzz fuzzing of the Linux perf script parser found
146 such hang inputs.

Break out of the loop when the end of the stream is reached. Adds a
regression test that parses a truncated sched_switch line and asserts
parsing terminates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 7c1dc14b-deed-412d-bdca-a44a5ac9bf9a
* Support TraceLogging formatting hints

Trace Data Helper lets you add display hints to fields in events. For
example, there are hints to indicate that an integer value should hex
formatted on display or that the value is a HRESULT. The commonly used
[C++ TraceLogging library][0] supports these hints via its [TraceLogging
Wrapper macros][1].

Add support for pretty printing the following _TDH_OUT_TYPE values:

* TDH_OUTTYPE_HEXINT8 - hex, width of the underlying type
* TDH_OUTTYPE_HEXINT16 - hex, width of the underlying type
* TDH_OUTTYPE_HEXINT32 - hex, width of the underlying type
* TDH_OUTTYPE_HEXINT64 - hex, width of the underlying type
* TDH_OUTTYPE_PID - decimal number without digit seperators
* TDH_OUTTYPE_TID - decimal number without digit seperators
* TDH_OUTTYPE_PORT - decimal number without digit seperators, converted
  from network byte order
* TDH_OUTTYPE_IPV4 - dotted quad
* TDH_OUTTYPE_IPV6 - colon-seperated, elision of runs of zeros
* TDH_OUTTYPE_SOCKETADDRESS - "address:port" for AF_INET and AF_INET6
* TDH_OUTTYPE_ERRORCODE - hex, no padding
* TDH_OUTTYPE_WIN32ERROR - hex, no padding
* TDH_OUTTYPE_NTSTATUS - hex, always 8 digits wide
* TDH_OUTTYPE_HRESULT - hex, always 8 digits wide
* TDH_OUTTYPE_CODE_POINTER - lowercase hex, minimum of 8 digits wide

Fixes microsoft#2436.

Given TraceLogging code like this:

```
TraceLoggingWrite(
    g_hMyProvider,
    "MyEvent",
    TraceLoggingUInt32(value1ToLog),
    TraceLoggingHexUInt32(value2ToLog));
```

In PerfView today, this would be rendered as

```
    value1ToLog="1" value2ToLog="32,769"
```

Now, it is rendered as

```
    value1ToLog="1" value2ToLog="0x00008001"
```

For things like flags these format hints can make it easier to read
values at a glance. There are also common values that are represented in
hex, like PCI IDs.

When PerfView already had support for formatting a value, its existing
formating style was followed. Otherwise, I matched WPA's formatting.

Changes made:

* Changed TraceEvent's representation of the output type from a ushort
  to the new TdhOutputType enum.
* Add TdhFormtter.cs that knows how to format a value with a given
  formatting hint. A formatting hint was chosen so that the PayloadFetch
  object didn't need to remember both its TdhInputType and its
  TdhOutputType.
* Reved the FastSerializable format to include the new formatting hint.
* Introduced a new FormatUtils helper for shared formatting code between
  TraceEvent.cs and DynamicTraceEventParser.cs
* Unit tests for the new formatting logic added.
* Updated the baseline files to capture the changes in formatting.

[0]: https://learn.microsoft.com/windows/win32/tracelogging/trace-logging-portal
[1]: https://learn.microsoft.com/windows/win32/tracelogging/tracelogging-wrapper-macros
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Improve keyboard focus indicator contrast

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Isolate focus visual WPF tests

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 11232b9e-2a12-482f-88c4-6b9023450660

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 11232b9e-2a12-482f-88c4-6b9023450660
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: bf7bd1f4-f0fd-4d6c-b398-808014b1bbeb
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 41660996-15c9-4feb-904d-eff836f5f59e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Add Accessible Label To Directory Search Field

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Align Directory Field Accessible Name

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Preserve directory automation name

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 41660996-15c9-4feb-904d-eff836f5f59e

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 41660996-15c9-4feb-904d-eff836f5f59e
@jamescrosswell
jamescrosswell marked this pull request as ready for review August 10, 2026 01:48

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit af22740. Configure here.

**\bin\**\SymbolsAuthTests.dll
**\bin\**\TraceEventTests.dll
**\bin\**\PerfViewTests.dll
**\bin\**\TraceParserGen.Tests.dll

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New tests skipped in CI

Medium Severity

The new FastSerialization.Tests project builds as FastSerializationTests.dll, but the pipeline test assembly list only adds TraceParserGen.Tests.dll. Those new serialization tests never run in CI, so regressions in FastSerialization can ship undetected.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit af22740. Configure here.

@jamescrosswell
jamescrosswell merged commit cf9eb31 into main Aug 11, 2026
10 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.