finds.dev← search

// the find

benaadams/Ben.Demystifier

★ 2,868 · C# · Apache-2.0 · updated Mar 2024

High performance understanding for stack traces (Make error logs more productive)

Ben.Demystifier translates .NET stack traces from the compiler-mangled IL representation back into readable C# source format — async state machines become `async Task<string> MethodAsync()`, lambdas get source location and ordinal instead of `<>c__DisplayClass`, generics resolve their type parameters. It's a one-line drop-in for exception formatting. Written by Ben Adams, who spent years on ASP.NET Core performance, so the implementation is unusually careful.

The before/after comparison in the README makes the value immediate and concrete — this isn't overselling. The approach uses reflection and portable PDB data rather than a hack, so it handles edge cases (local functions, value tuples, ref returns) that simpler approaches miss. It's already integrated into Serilog, Exceptional, and ASP.NET Core's developer exception page, which means it's been battle-tested in production at scale. Test coverage is solid and covers the awkward cases: async enumerables, dynamic compilation, recursive stacks, mixed managed/native.

Last meaningful commit was early 2024 and the repo shows signs of maintenance drift — open issues with no response, benchmarks still reference `netcoreapp2.0`. The core functionality works, but it leans on reflection internals that can shift between .NET runtime versions, and there's no explicit statement of .NET 8/9/10 support. Portable PDB reading is a footgun: if you deploy without PDBs (common in production), you get degraded output without a clear warning about why. The IL reader for resolving method display is non-trivial and largely undocumented — modifying it is not for the faint-hearted.

View on GitHub →

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →