<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Visual Studio on Isaac Levin</title><link>https://example.com/tags/visual-studio/</link><description>Recent content in Visual Studio on Isaac Levin</description><generator>Hugo</generator><language>en</language><managingEditor>isaac@isaaclevin.com (Isaac Levin)</managingEditor><webMaster>isaac@isaaclevin.com (Isaac Levin)</webMaster><lastBuildDate>Fri, 14 Jun 2019 08:25:05 -0400</lastBuildDate><atom:link href="https://example.com/tags/visual-studio/index.xml" rel="self" type="application/rss+xml"/><item><title>Deoptimize Your Snapshots Now in Snapshot Debugger</title><link>https://example.com/2019/snapshot-deoptimized/</link><pubDate>Fri, 14 Jun 2019 08:25:05 -0400</pubDate><author>isaac@isaaclevin.com (Isaac Levin)</author><guid>https://example.com/2019/snapshot-deoptimized/</guid><description>&lt;h2 id="have-you-tried-snapshot-debugger-yet-no-why-not"&gt;Have You Tried Snapshot Debugger Yet? No? Why Not?&lt;/h2&gt;
&lt;br /&gt;
If you don't know by now, I am a huge fan of [Snapshot Debugger](https://docs.microsoft.com/azure/azure-monitor/app/snapshot-debugger), which if you are not aware is a tool that allows .NET developers to get better visibility into their remote applications. Snapshot Debugger is accessible via 2 locations, the Azure Portal (Product Name is Application Insights Snapshot Debugger), where you can see variables in your call stack like so.
&lt;br /&gt;&lt;br /&gt;
 Snapshot Debugger is also built into Visual Studio Enterprise (Product Name is Visual Studio SnapshotDebugger, man naming is hard 😊) so be sure to ask your boss for it if you don't have it. You can access this feature by downloading a snapshot from the Azure Portal (the extension is .diagsession) and opening it with Visual Studio. With Snapshot Debugger, you have the ability to view, key information related to exceptions that your application is throwing, which quickens the time to triage and eventually solve your problem. I have talked about on [Channel 9](https://www.youtube.com/watch?v=Ug2ZO5zbYmc), and spoken at numerous conferences about how it is a must-have tool for every .NET developer on the planet.
&lt;br /&gt;&lt;br /&gt;
&lt;h2 id="current-limitations"&gt;Current Limitations&lt;/h2&gt;
&lt;br /&gt;
Right now, there is a considerable limitation with Snapshot Debugger. To not affect performance of apps, by default code is optimized when snapshots are generated, what does this mean? It means that your ability to view certain variables is taken away. This severely limits our ability as developers to get the full view of an exception that happens. But there has recently been help from the Product Group in this area.&lt;br /&gt;&lt;br /&gt;
&lt;h2 id="configurable-deoptimization"&gt;Configurable Deoptimization&lt;/h2&gt;
&lt;br /&gt;
Beginning in version `1.3.5-pre-1906.403`(preview release) of `Microsoft.ApplicationInsights.SnapshotCollector`, a setting was added to the `SnapshotCollectorConfiguration` node called *DeoptimizeMethodCount*.
&lt;br /&gt;&lt;br /&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SnapshotCollectorConfiguration&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DeoptimizeMethodCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IsEnabledInDeveloperMode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ThresholdForSnapshotting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MaximumSnapshotsRequired&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MaximumCollectionPlanSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ReconnectInterval&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;00:15:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProblemCounterResetInterval&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.00:00:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SnapshotsPerTenMinutesLimit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SnapshotsPerDayLimit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SnapshotInLowPriorityThread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProvideAnonymousTelemetry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;FailedRequestLimit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
This setting allows developers to configure the level of deoptimization suitable for their apps. To enable deoptimization, be sure to enable Snapshot Debugger call stacks and local variable support from the Application Insights configuration page.
&lt;br /&gt;
&lt;figure&gt;&lt;img src="https://example.com/images/deopt/portal.png"&gt;
&lt;/figure&gt;

&lt;br /&gt;
&lt;p&gt;The default value is 1 (setting to 0 completely disables deoptimization), meaning you will only have deoptimization at the first level of your exception, for instance below an exception is thrown and there is only visibility at the first level of the call stack.&lt;/p&gt;</description></item></channel></rss>