[API Proposal]: ```[StackTraceHidden(StackTraceVisibility.HideAllChildren)]```

Open
#112,130 10 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Stale
Tech stack
csharp

Research direction

No implementation files or tests are named. Start by reviewing the existing StackTraceHidden attribute and the proposed StackTraceVisibility enum and constructor; done means the child-frame hiding behavior, full-detail retrieval, and public API are specified and validated.

Written by the indexing model from the issue text.

Description

api-suggestion area-System.Diagnostics
Background and motivation

.NET stack traces are an important element that helps developers diagnose bugs and exceptions. However, diagnosing the actual location of the bug often involves developers skipping over unnecessary entries that should be hidden from the stack trace.

To alleviate this issue, the attribute [StackTraceHidden()] can be used to hide a single current method from the stack trace. This is often used for throw helpers but is an incomplete solution due to there being no ability to prune an entire branch of code.

Take the following program as an example:

DoTest();

static void DoTest() {
    //This will always throw
    using var FS = System.IO.File.OpenRead($@"\\0.0.0.0\C$\Testasdf.txt");
}

When this crashes, the stack trace will show:

[0] Unhandled exception. System.IO.FileNotFoundException: Could not find file '\\CODE2024\C$\Testasdf.txt'.
[1] File name: '\\CODE2024\C$\Testasdf.txt'
[2]    at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
[3]    at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
[4]    at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
[5]    at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
[6]    at System.IO.File.OpenRead(String path)
[7]    at Program.<<Main>$>g__DoTest|0_0() in C:\Users\Administrator\source\repos\ConsoleApp16\ConsoleApp16\Program.cs:line 7
[8]    at Program.<Main>$(String[] args) in C:\Users\Administrator\source\repos\ConsoleApp16\ConsoleApp16\Program.cs:line 3

The important part of the stack trace really begins at line 6 as lines 2-5 are essentially internal calls.

.NET should expose a way of easily hiding internal stack trace trees.

API Proposal
namespace System.Diagnostics;

public enum StackTraceVisibility {
   Default,
   Hidden,
   HideAllChildren,
}

public partial class StackTraceHidden {
  public StackTraceHidden(StackTraceVisibility Visibility) { }
}

API Usage

[StackTraceHidden(StackTraceVisibility.HideAllChildren)]
public void MyMethod() { }
Alternative Designs

Developers could catch and re-throw exceptions to try to clean up stack traces.

Risks

It is possible that someone might actually want all the internal details of exactly where an internal call failed. A method should exist that can retrieve them.

Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/runtime

All issues in dotnet/runtime

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.