Kevin Gosse's Avatar

Kevin Gosse

@kevingosse.net

Principal engineer at JetBrains, passionate about .NET, performance, and debugging. Microsoft MVP. Co-author of Pro .NET Memory Management (2nd edition)

1,119
Followers
667
Following
1,307
Posts
25.04.2023
Joined
Posts Following

Latest posts by Kevin Gosse @kevingosse.net

Post image

The tool can be installed from Winget:

winget install KevinGosse.ClipPing

Or directly from github: github.com/kevingosse/C...

I rewrote it entirely in C++ because RAM isn't cheap anymore.

04.03.2026 14:06 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Video thumbnail

ClipPing got a major update!

The tool displays a visual notification whenever the content of the clipboard changes, for all of you who are tired of ctrl+c not working.

I added configurable overlays, and some QoL improvements (like automatically starting the tool with Windows).

04.03.2026 14:06 πŸ‘ 2 πŸ” 1 πŸ’¬ 1 πŸ“Œ 0
Post image

It's crazy that Windows will post notifications for the most unsignificant stuff (like the unfamous "Windows Defender Antivirus did not find any threats"), but I had to check my event viewer for completely unrelated reasons to randomly discover that one of my HDDs is dying.

03.03.2026 15:01 πŸ‘ 8 πŸ” 1 πŸ’¬ 1 πŸ“Œ 0
Preview
Writing a .NET Garbage Collector in C#β€Š - PartΒ 8: Interior pointers Using NativeAOT to write aΒ .NET GC in C#. This time, we look at what interior pointers are and why they’re so difficult for the GC.

I published part 8 of my "Writing a .NET Garbage Collector in C#" series. The subject this time is interior pointers: what are they, and why are they so challenging for the GC.

minidump.net/writing-a-ne...

03.03.2026 12:53 πŸ‘ 8 πŸ” 4 πŸ’¬ 0 πŸ“Œ 0
Preview
dotnet tool install shouldn't use local config for global tools Β· Issue #53126 Β· dotnet/sdk I ran into this unexpected situation where I tried to install a global tool (dotnet tool install -g xxx) but it failed because I was in a project directory which had a nuget.config pointing to an i...

Opened an issue: github.com/dotnet/sdk/i...

23.02.2026 19:12 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image

I'm surprised that "dotnet tool install -g" uses the local nuget config, if any.
For local tools, I get it. For global tools, I would expect it to always use the userprofile config. Sounds a bit dangerous? Like, if you run the command from your Downloads or temp folder and you have a leftover file.

23.02.2026 16:04 πŸ‘ 2 πŸ” 0 πŸ’¬ 2 πŸ“Œ 0
Post image Post image

Pro-tip: even if it's tempting, resist the urge to argue with copilot

21.02.2026 16:59 πŸ‘ 3 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Preview
Too good to be true: an unexpected profiler trap Sometimes the most convincing performance gains deserve a second look. A reminder that profiling data can be more subtle than it first appears.

I got "tricked" by PerfView when using it to measure the effectiveness of my optimizations, so I decided to write about it: minidump.net/an-unexpecte...
It's not specific to PerfView though, in theory this could happen with any profiler.

20.02.2026 12:47 πŸ‘ 8 πŸ” 5 πŸ’¬ 1 πŸ“Œ 0
Preview
Writing a .NET Garbage Collector in C#β€Š - PartΒ 7: Marking handles Using NativeAOT to write aΒ .NET GC in C#. In the seventh part, we scan and update the handles during the mark phase of the garbage collection.

I published a new article in my "Writing a .NET GC in C#" series. This time, we implement a better storage for the handles, and we properly mark them during garbage collection. We also see why DependentHandles are annoying to deal with.

minidump.net/writing-a-ne...

10.02.2026 10:53 πŸ‘ 4 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
Preview
Writing a .NET Garbage Collector in C#β€Š - PartΒ 6: Mark and Sweep Using NativeAOT to write aΒ .NET GC in C#. In the sixth part, we start implementing the mark phase of the garbage collection.

After a long wait, I've finally published the sixth part in my "Writing a .NET Garbage Collector in C#" series. Today, we start implementing mark and sweep.

minidump.net/writing-a-ne...

27.01.2026 10:26 πŸ‘ 11 πŸ” 6 πŸ’¬ 0 πŸ“Œ 0
Video thumbnail

I learned programming on a 80286 with Qbasic. Out of curiosity I checked how this demo would run on that hardware (~1500 cycles/s in dosbox).

Way too slow in QB 1.1 (interpreted), even in CGA. Much better in QB 4.5 (compiled), though it would need some double-buffering to fix the flickering.

31.12.2025 09:04 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

If you missed this video, I strongly recommend watching it. It's a great introduction to 3D graphics, short and easy to understand. I had a lot of fun reimplementing it in Winforms and text mode.

31.12.2025 09:00 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Preview
Investigating a deadlock in Visual Studio A short investigation that showcases one of the most common problem faced when writing a profiler.

Today I ran into a deadlock in VS2026. I debugged it, and it turned out to be a common issue you may run into when writing a profiler.
I wrote a short article about it: minidump.net/investigatin...

17.12.2025 17:55 πŸ‘ 8 πŸ” 4 πŸ’¬ 0 πŸ“Œ 0

Visual Studio 2026 18.1.1 has been released. I strongly recommend upgrading if you're using ReSharper, as it fixes an issue that was making startup significantly slower.

Thanks a lot to the VS team for their reactivity!

17.12.2025 09:05 πŸ‘ 5 πŸ” 2 πŸ’¬ 0 πŸ“Œ 0
Preview
Creating a .NET CLR profiler using C# and NativeAOT with Silhouette In this post I look at how to create a simple .NET profiler. But instead of using C++, the profiler uses C# and NativeAOT with the Silhouette library

Blogged: Creating a .NET CLR profiler using C# and NativeAOT with Silhouette

andrewlock.net/creating-a-d...

In this post I look at how to create a simple .NET profiler. But instead of using C++, the profiler uses C# and NativeAOT with @kevingosse.net's Silhouette library

#dotnet

16.12.2025 18:10 πŸ‘ 13 πŸ” 3 πŸ’¬ 0 πŸ“Œ 0
Preview
From the backblaze community on Reddit Explore this post and more from the backblaze community

Anyway, if you're using their backup client, you'll probably want to know that they have hidden exclusion rules, and they exclude .git folders by default: www.reddit.com/r/backblaze/...

11.12.2025 08:17 πŸ‘ 3 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

I like the peace of mind that @backblaze.bsky.social
is offering, especially after my recent SSD crash. But god, their support is beyond bad. I've contacted them twice, and both times I had to solve the issue myself after a completely unhelpful exchange.

11.12.2025 08:17 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

That sounds crazy but honestly I've seen crazier stuff. I'll give it a try, thanks.

08.12.2025 12:18 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

There are Mondays, and then there are "the computer doesn't recognize the dev SSD anymore" Mondays.

Samsung 990 Pro 2TB. I tried pretty much everything I could think of, including moving it to a different M2 slot. Suggestions are welcome. The drive doesn't appear in the bios.

08.12.2025 09:04 πŸ‘ 1 πŸ” 1 πŸ’¬ 1 πŸ“Œ 0
Post image

I was investigating a crash, and pasted my windbg output to ChatGPT to see if it could come up with any lead.

It noticed something that I completely missed, a memory area that I dumped in binary was actually a string (even though it's not supposed to be). That's really nice and unexpected.

02.12.2025 08:47 πŸ‘ 6 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Yeah, it looks like they really want those changes to propagate quickly, and so they cut corners. And when you do, it always backfires sooner or later πŸ™‚

19.11.2025 14:45 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Focusing on the Rust Unwrap in the CloudFlare outage is really the scalability equivalent of "When a sage points to the moon, all the fool sees is the finger".

At that scale, failures *will* happen. Programming error are unavoidable. What's interesting is why it took down the entire system.

19.11.2025 10:56 πŸ‘ 2 πŸ” 1 πŸ’¬ 1 πŸ“Œ 0
Post image

Fun fact: you can't use print screen to capture a screenshot of a crash of SnippingTool

06.11.2025 08:31 πŸ‘ 12 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Video thumbnail

#UCP25 | Kevin Gosse - The Hidden Life of Method Calls

Kevin reveals in his session what really happens when your code runs:
➑️ calling conventions
➑️ stack frames
➑️ JIT compilation
➑️ virtual dispatch
➑️ CPU-level mechanics

➑️ prague.updateconf.net

#DotNet #Performance @kevingosse.net @woodruff.dev

06.11.2025 08:11 πŸ‘ 4 πŸ” 2 πŸ’¬ 0 πŸ“Œ 0
Post image

It is! VS2026 shows this exception whenever I debug this solution (github.com/kevingosse/T...)
Something to do with hot reload apparently, but I tried completely disabling hot reload and that doesn't fix it.

01.11.2025 23:14 πŸ‘ 3 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Post image

I had a ton of fun at Techorama NL. It's not everyday that you get a chance to debug variadic .NET functions on a giant movie theater screen.

01.11.2025 09:35 πŸ‘ 4 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Is that a Resharper issue? It already happened to me in the past but I always assumed it was VS. I'll try debugging it next time.

30.10.2025 20:04 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Total startup time:
2025.2: 148 seconds
2025.3: 127 seconds (15% improvement)

UI freezes during startup:
2025.2: 93 seconds
2025.3: 46 seconds (50% improvement)

Shutdown:
2025.2: 30 seconds
2025.3: 10 seconds (67% improvement)

30.10.2025 19:04 πŸ‘ 7 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

We are getting closer to the release of Resharper 2025.3 , so I ran some performance tests to see how much we improved compared to 2025.2.

For this iteration, I focused my effort mainly on the huge Datadog.Trace solution, available on the DataDog/dd-trace-dotnet repository.

Results below πŸ‘‡

30.10.2025 19:04 πŸ‘ 1 πŸ” 1 πŸ’¬ 2 πŸ“Œ 0
Preview
Using profiler function hooks in .NET with Silhouette In this article, we see what are function hooks, and how to use them in .NET with Silhouette. We also learn how to statically link a library with NativeAOT.

I just published a new article: Using profiler function hooks in .NET with Silhouette.
In the process, we also learn how to use static linking with NativeAOT.

minidump.net/using-functi...

21.10.2025 11:49 πŸ‘ 7 πŸ” 6 πŸ’¬ 0 πŸ“Œ 0