Skip to content

Conversation

@misaz
Copy link

@misaz misaz commented Jul 24, 2025

PR adds support for using customized DebuggerDisplay for customized types (templates) instead of hardocoding DebuggerDisplay to structure's first field name. It is designed to work in a way, that when there is property named DebuggerDisplay, it is used instead. Actually there already were some custom DebuggerDisplays in templates, but these only work with SpecialTypeDefNames because for normal types, only Members are obtained and rest of the template is thrown away and recrated including DebuggerDisplay attribute.

PR also uses newly introduced capability and adds custom DebuggerDisplay for HRESULT type. Custom visualizer show HEX error code number followed by humman readable description of HRESULT error code:

obrazek

It allows developer debugging apps to understand errors without need to use Error Lookup tool or searching online.

Message is internally obtained using avalaible .NET APIs (two variants are implemented depending on .NET version, both should produce same results because internally both end up using FormatMessageW). As you can see, FormatMessage provides localized message. I use Czech windows, so message is in Czech. For debugging it should be no problem.

It also brings debugger visualization experience on par with native debugger which has similar natvis (or maybe hardcoded, who knows?) visualizer for HRESULT as well.

I was also considering adding similar for NTSTATUS, but obtaining message for NTSTATUSes is not that easy because it requires passing NTDLL module handle (+ one more flag) to FormatMessageW and this is not exposed to .NET API. But it can be done manually. Instead of bloating NTSTATUS template in horroble way, I decided to step back on it. Also note, that native debugger do not support visualizer for NTSTATUS as well.

@misaz
Copy link
Author

misaz commented Jul 24, 2025

@microsoft-github-policy-service agree

Copy link
Member

@AArnott AArnott left a comment

Choose a reason for hiding this comment

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

Thanks! This is awesome.

}

string debuggerDisplay;
if (members.Where(x => x is PropertyDeclarationSyntax && ((PropertyDeclarationSyntax)x).Identifier.ValueText == "DebuggerDisplay").Any())
Copy link
Member

Choose a reason for hiding this comment

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

Note for next time: you could simplify this line to:

Suggested change
if (members.Where(x => x is PropertyDeclarationSyntax && ((PropertyDeclarationSyntax)x).Identifier.ValueText == "DebuggerDisplay").Any())
if (members.Where(x => x is PropertyDeclarationSyntax { Identifier.ValueText: "DebuggerDisplay" }).Any())

@AArnott
Copy link
Member

AArnott commented Sep 5, 2025

/azp run

@azure-pipelines
Copy link

No pipelines are associated with this pull request.

@AArnott AArnott merged commit 62fb7a1 into microsoft:main Sep 5, 2025
2 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.

2 participants