Fix !clrstack trimming method names with angle brackets when DML is enabled #5594
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
When
!clrstack
encountered method names containing angle brackets (e.g.,Program.<Main>(System.String[])
), it incorrectly trimmed the content between the brackets, displayingProgram.(System.String[])
instead. This issue affected async methods, local functions, and other compiler-generated methods that use angle brackets in their names.Both ClrMD and WinDbg (ICorDebug + IMetaDataReader) correctly returned the full method name including angle brackets.
Root Cause
When DML (Debugger Markup Language) is enabled, the
<>
characters were being interpreted as DML tags rather than literal text. ThePrintThread
function instrike.cpp
was passing unescaped method names toTableOutput
, causing the content between angle brackets to be treated as markup and stripped from the output.Solution
This PR adds proper DML escaping for method and frame names:
Implemented
DmlEscape()
function inutil.cpp
that escapes special characters:<
→<
>
→>
&
→&
Applied escaping in
PrintThread()
instrike.cpp
:MethodNameFromIP()
are DML-escaped whenIsDMLEnabled()
returns trueGetFrameFromAddress()
receive the same treatment for consistencyAdded test coverage with an
AsyncMain
test case that uses async Main method to verify angle brackets are preserved in the outputExample
Before:
After:
Impact
This is a minimal, surgical fix that only affects method/frame name display when DML is enabled. The changes ensure backward compatibility while correctly handling special characters in method names.
Fixes #4996
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
80zvsblobprodcus35.vsblob.vsassets.io
/home/REDACTED/work/diagnostics/diagnostics/.dotnet/dotnet msbuild /m /nologo /clp:Summary /v:minimal /nr:true /warnaserror /p:TreatWarningsAsErrors=true /p:ContinuousIntegrationBuild=false /home/REDACTED/work/diagnostics/diagnostics/eng/native-prereqs.proj /bl:/home/REDACTED/work/diagnostics/diagnostics/artifacts/log/Debug/GenerateVersion.binlog /t:Build /restore /p:Configuration=Debug /p:TargetOS=linux /p:TargetArch=x64 /p:TargetRid=linux-x64 /p:Platform=x64
(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.