<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>mgoldin's blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/mgoldin/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/mgoldin/feed.xml</link>
    <description>A blog about Profiler in Microsoft Visual Studio.</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:23:56 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Visual Studio 2012 and Debugger .NATVIS files – what can I do with them?</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/visual-studio-2012-and-debugger-natvis-files-what-can-i-do-with-them</link>
      <pubDate>Wed, 06 Jun 2012 07:33:00 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2012/06/06/visual-studio-2012-and-debugger-natvis-files-what-can-i-do-with-them/</guid>
      <description><![CDATA[In Visual Studio 2012 , Visual Studio native debugger introduces a new type visualization framework...]]></description>
      <content:encoded><![CDATA[<p>In Visual Studio 2012 , Visual Studio native debugger introduces a new type visualization framework that allows customizing the way Visual Studio displays native types in debugger variable windows (watch, locals, data tips etc.). It supersedes the autoexp.dat file that has been used in earlier versions of Visual Studio and offers xml syntax, better diagnostics, versioning and multiple file support. Component authors can use this framework to create visualization rules for their types making it easy for developers to inspect them during debugging. </p>  <p>Visualizers for native types are specified in <strong>.natvis </strong>files. A natvis file is simply an xml file (with a .natvis extension) with its schema defined in &lt;VSINSTALLDIR&gt;\Xml\Schemas\natvis.xsd. Visual Studio ships with a few natvis files in &lt;VSINSTALLDIR&gt;\Common7\Packages\Debugger\Visualizers folder. These files contain visualization rules for many common types and can serve as examples when writing visualizers for new types.</p>  <p>Not trying to provide all the details about .natvis files (as it is a topic for entire separate blog/article), I will rather try to demonstrate briefly the flexibility and power of the framework that can be used beyond simplistic visualization of data.</p>  <p>Let’s pretend that you have your own data type:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5822.image_2FBB2F78.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-76-metablogapi/5822.image_5F00_2FBB2F78.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5482.image_thumb_2274A665.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-76-metablogapi/5482.image_5F00_thumb_5F00_2274A665.png" width="534" height="68" /></a></p>  <p>When you look at variables of this type in debugger Watch, Locals or Auto window, you see the expected data:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/6153.image_025999A8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-76-metablogapi/6153.image_5F00_025999A8.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/2671.image_thumb_623E8CEA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-76-metablogapi/2671.image_5F00_thumb_5F00_623E8CEA.png" width="662" height="319" /></a></p>  <p>Now copy the below XML snippet into the file with extension .natvis, and place it in %USERPROFILE%\My Documents\Visual Studio 11\Visualizers\. Besides many different ways to display your types in friendly ways, you can create synthetic expansions:</p>  <p><font size="2"><strong>mytypes.natvis:</strong> </font></p>  <p><font size="2" face="Courier New">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;      <br />&lt;AutoVisualizer xmlns=&quot;</font><a href="https://schemas.microsoft.com/vstudio/debugger/natvis/2010&quot;"><font size="2" face="Courier New">https://schemas.microsoft.com/vstudio/debugger/natvis/2010&quot;</font></a><font size="2" face="Courier New">&gt;      <br />&#160; &lt;Type Name=&quot;Rectangle&quot;&gt;       <br />&#160;&#160;&#160;&#160; &lt;Expand&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;Synthetic Name=&quot;Am I a square?&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160; Condition=&quot;height==width&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;DisplayString&gt;Yes I am.       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/DisplayString&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;/Synthetic&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;Synthetic Name=&quot;Am I a square?&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160; Condition=&quot;height!=width&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;DisplayString&gt;No I am not.       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/DisplayString&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;/Synthetic&gt;       <br />&#160;&#160;&#160;&#160; &lt;/Expand&gt;       <br />&#160; &lt;/Type&gt;       <br />&lt;/AutoVisualizer&gt;       <br /></font></p>  <p>And now your visualization is richer and allows you to see not only raw data of your objects, but also some post-processing of it (which can be very handy, especially if you are dealing with complicated data types that require some non-trivial evaluation).</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/3252.image_090CA32B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-76-metablogapi/3252.image_5F00_090CA32B.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/6888.image_thumb_540013FA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-76-metablogapi/6888.image_5F00_thumb_5F00_540013FA.png" width="666" height="385" /></a></p>  <p>Enjoy!</p>  <p><strong><u>Update</u></strong>: more data on this subject is available here: <a title="https://code.msdn.microsoft.com/Writing-type-visualizers-2eae77a2" href="https://code.msdn.microsoft.com/Writing-type-visualizers-2eae77a2">https://code.msdn.microsoft.com/Writing-type-visualizers-2eae77a2</a></p>]]></content:encoded>
    </item>
    <item>
      <title>“Performance reports must be created on a local drive”</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/performance-reports-must-be-created-on-a-local-drive</link>
      <pubDate>Mon, 25 Apr 2011 15:24:15 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2011/04/25/performance-reports-must-be-created-on-a-local-drive/</guid>
      <description><![CDATA[For better performance, VS Profiler requires the report to be on a local drive. If you change the...]]></description>
      <content:encoded><![CDATA[<p>For better performance, VS Profiler requires the report to be on a local drive. If you change the report file location through Performance Session properties page (right click on performance session in Performance Explorer –&gt; Properties –&gt; General):</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/7776.image_721B6716.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/7776.image_5F00_721B6716.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/7608.image_thumb_2D3F1D15.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/7608.image_5F00_thumb_5F00_2D3F1D15.png" width="671" height="96" /></a></p>  <p>then you end up with an error like that:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/8360.image_78328DE4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/8360.image_5F00_78328DE4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/1016.image_thumb_0604D3E0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/1016.image_5F00_thumb_5F00_0604D3E0.png" width="478" height="180" /></a></p>  <p>The rationale behind usage of local drives is that VS Profiler attempts to make logging to the file fast, while usage of network drives might introduce logging delays (up to blocking your application execution in some cases).</p>  <p>However, if you absolutely have to use your network drives for that purpose, you can achieve that through usage of <a href="https://msdn.microsoft.com/en-us/library/aa365680(VS.85).aspx">Symbolic Links</a>. A symbol link can be easily created with <strong><a href="https://technet.microsoft.com/en-us/library/cc753194(WS.10).aspx">mklink</a> </strong>utility. For example, </p>  <p><font face="Courier New">mklink /D C:\Foo </font><a href="file://\\MyNetwork\MyValut"><font face="Courier New">\\MyNetwork\MyValut</font></a></p>  <p>After that you can use C:\Foo as a location for profiling reports. Keep in mind, though, that your network access can be slower than a local drive access, and it can impact your profiling session.</p>]]></content:encoded>
    </item>
    <item>
      <title>VS2010 SP1: Silverlight 4 profiling from Visual Studio UI</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/vs2010-sp1-silverlight-4-profiling-from-visual-studio-ui</link>
      <pubDate>Tue, 21 Dec 2010 10:09:03 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/12/21/vs2010-sp1-silverlight-4-profiling-from-visual-studio-ui/</guid>
      <description><![CDATA[&#160;  If you install recently published VS2010 SP1 Beta, you can discover that VS Profiler team...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>If you install recently published <a href="https://www.microsoft.com/downloads/en/details.aspx?FamilyID=11ea69cb-cf12-4842-a3d7-b32a1e5642e2&amp;displaylang=en"><font style="style" color="#0066dd"><u>VS2010 SP1 Beta</u></font></a><a href="https://www.microsoft.com/downloads/en/details.aspx?FamilyID=11ea69cb-cf12-4842-a3d7-b32a1e5642e2&amp;displaylang=en"><font style="background-color: #ffff00"></font></a>, you can discover that VS Profiler team enriched Silverlight profiling user experience. Previously I published few posts about VS2010 usage for those purposes, either through VS Profiler <a href="https://blogs.msdn.com/b/mgoldin/archive/2010/04/26/vs2010-silverlight-4-profiling.aspx">command line tools</a> or <a href="https://blogs.msdn.com/b/mgoldin/archive/2010/06/01/vs2010-sliverlight-4-profiling-from-visual-studio-ui.aspx">VS2010 UI</a>. Both approaches led you to the final results or figuring out the bottlenecks of your Silverlight application, but they require number of manual steps to be done.</p>  <p>In VS2010 SP1 however Silverlight projects are fully recognized by VS Profiler, and you can conduct your performance investigations much easier. </p>  <p>For example, you might use the <a href="https://msdn.microsoft.com/en-us/library/ff426926(v=VS.95).aspx">Silverlight Text Editor Sample</a>, and open this project in VS2010 SP1:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5228.image_5FE33A61.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/5228.image_5F00_5FE33A61.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/0435.image_thumb_1BDF564A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/0435.image_5F00_thumb_5F00_1BDF564A.png" width="324" height="373" /></a></p>  <p>Now, if you wish to create a performance session for this project, you can do it in a usual way through Performance Wizard:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/3162.image_269CAD9F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/3162.image_5F00_269CAD9F.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/1680.image_thumb_4D6AC3DF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/1680.image_5F00_thumb_5F00_4D6AC3DF.png" width="338" height="199" /></a></p>  <p>You will see your project in the list of possible targets (it was not there before the final integration of Silverlight projects and VS Profiler), and you can select it there and proceed with the Wizard that creates and starts a performance session for you:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/2021.image_0D34AA65.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/2021.image_5F00_0D34AA65.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5228.image_thumb_45DF5472.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/5228.image_5F00_thumb_5F00_45DF5472.png" width="521" height="448" /></a></p>  <p>When you close your application – the session is over and profiling results are presented so you can analyze the data:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/7360.image_137B80F3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/7360.image_5F00_137B80F3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/8053.image_thumb_53456778.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/8053.image_5F00_thumb_5F00_53456778.png" width="523" height="404" /></a></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/8546.image_0BF01186.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/8546.image_5F00_0BF01186.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/2021.image_thumb_1DCCA553.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/2021.image_5F00_thumb_5F00_1DCCA553.png" width="523" height="309" /></a></p>  <p>Enjoy!</p>]]></content:encoded>
    </item>
    <item>
      <title>CPU Performance Counters in Visual Studio 2010 Profiler</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/cpu-performance-counters-in-visual-studio-2010-profiler</link>
      <pubDate>Mon, 21 Jun 2010 09:58:42 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/06/21/cpu-performance-counters-in-visual-studio-2010-profiler/</guid>
      <description><![CDATA[&#160;  While using Visual Studio Profiler either from Visual Studio UI or through command line...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>While using Visual Studio Profiler either from Visual Studio UI or through command line tools, you may wish to collect more/different information using specific CPU Performance Counters. The collected data depends on the profiling mode. As usage of CPU Performance Counters considered an advanced technique, let me explain what is the proper way to use them and how to interpret the results.</p>  <p>First of all, CPU Performance Counters are <strong><u>not</u> </strong><a href="https://msdn.microsoft.com/en-us/library/aa373083(v=VS.85).aspx">operating system performance counters</a>, as they are implemented by CPU vendors inside of a CPU die.</p>  <p>If you run inside of a Virtual Machine or on a Hyper-V enabled machine – you have no access to CPU Performance Counters (as I mentioned in my previous <a href="https://blogs.msdn.com/b/mgoldin/archive/2010/01/09/visual-studio-profiler-in-virtual-environment.aspx">post</a>). This is the current limitation of virtualization technologies.</p>  <p>Let’s review 2 basic modes of VS Profiler – Sampling and Instrumentation – and discuss how the counters are used in each one of them.</p>  <h1>Sampling</h1>  <p>In Sampling mode, the profiler periodically interrupts an execution of your application in order to take a sample of it. The regularity of interrupts is achieved through usage of one of the CPU Performance Counters. By default – it is 10,000,000 Non Halted CPU Cycles. You can change the predefined sampling interval or the counter itself. When you change the counter, that means that you switch to a different event as a trigger of your samples. If the default Non Halted Cycles event causes your samples being collected when your application is actively using CPU, then switching to Last Level Cache Misses event, for example,&#160; will cause samples being generated on cache misses (so, if there are no cache misses – no data is collected).</p>  <p>VS Profiler supports sampling on only one counter at a time. Therefore, you can use only one counter when you configure your sampling session. </p>  <p>When you look through results of sampling, you will <strong><em>not </em></strong>see separate data columns with the counter name. Remember, that usage of specific counter in this scenario means that your samples were triggered by the counter event. So interpret your samples (inclusive, exclusive, function samples, module samples, call trees etc) appropriately. </p>  <p>To select a specific counter for your Sampling session in Visual Studio, go to Properties of your Performance Session (right click –&gt; Properties), and select the <strong>Sampling</strong> tab. In <strong>Sample event</strong> drop down list switch default <em>Clock cycles</em> to <em>Performance counter</em>.</p>  <h4>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/0458.image_44697B1B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/0458.image_5F00_44697B1B.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/0523.image_thumb_641854E3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/0523.image_5F00_thumb_5F00_641854E3.png" width="473" height="215" /></a></h4>  <p>Now you can select one of the provided counters and set its <strong>Sampling interval</strong>.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/4336.image_0EF0B8F6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/4336.image_5F00_0EF0B8F6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/4657.image_thumb_63AC21EE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/4657.image_5F00_thumb_5F00_63AC21EE.png" width="484" height="346" /></a>&#160; </p>  <p>The full set of counters provided by CPU vendors is quite big. VS Profiler suggests a sub-set of them, with an ability to add more counters to the selection if necessary. You will see all currently supported counters in VS UI. If you use <a href="https://msdn.microsoft.com/en-us/library/bb385768.aspx">command line tools</a> for your data collection, you can see the counters through the following option:</p>  <p><font color="#0000ff" face="Courier New">C:\MyProjects&gt;<strong>VSPerfCmd.exe /querycounters</strong>       <br />Microsoft (R) VSPerf Command Version 10.0.30319 x86       <br />Copyright (C) Microsoft Corp. All rights reserved. </font></p>  <p><font face="Courier New"><font color="#0000ff">Portable counters:        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; InstructionsRetired         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; NonHaltedCycles         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; L2Misses         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; L2References         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ITLBMisses         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; BranchesRetired         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; MispredictedBranches         <br />Platform counters:         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; DCULinesIn         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; DCUModifiedLinesIn         <br /><font size="4">&#160;&#160;&#160;&#160;&#160;&#160;&#160; . . .</font></font></font>     <br /></p>  <p>To use one of them, you need to provide the counter name in <strong>/COUNTER</strong> option of <strong>VSPerfCmd.exe</strong> when you start your data collection. <strong>VSPerfCmd.exe /?</strong> will give you an exact syntax. For example:</p>  <p><font face="Courier New">VSPerfCmd.exe /attach:MyApplication.exe /COUNTER:L2Misses,1000</font></p>  <h1>Instrumentation</h1>  <p>In instrumentation mode, VS Profiler records timestamps at function entries and exits. If you add CPU Performance Counters to the session, their values will be collected at the same time, and you will have separate columns of data for each counter. Unlike the sampling mode, you theoretically can add to instrumentation profiling session as many CPU counters as you wish. Practically, however, the number of counters you can use simultaneously is limited by a number of registers that are implemented in your CPU for that purpose. Sometimes it could be as few as two registers only, and VS Profiler always tries to acquire one of them for internal usage. </p>  <p>To add some Performance Counters to your Performance Session, go to the session Properties and select <strong>CPU Counters</strong> tab. There you can enable and select counters you want to add to your instrumentation data collection.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5241.image_1C56CBFC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/5241.image_5F00_1C56CBFC.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/4667.image_thumb_2309D57F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/4667.image_5F00_thumb_5F00_2309D57F.png" width="511" height="220" /></a> </p>  <p>When you look at collected results, you will see new columns of data:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/8053.image_4DE23991.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/8053.image_5F00_4DE23991.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/0042.image_thumb_09A1D245.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/0042.image_5F00_thumb_5F00_09A1D245.png" width="517" height="117" /></a> </p>  <p>If number of counters that you select exceeds current CPU limitation, some of them will be dropped from the collection and you will get a WARNING message in the Output window:</p>  <p><font size="2" face="Courier New">Warning VSP2318: The monitor was unable to initialize counter 'Mispredicted Branches'.</font></p>  <p>While using command line tools, you can have multiple /COUNTER options to add several counters to your instrumentation session:</p>  <p><font size="2" face="Courier New">VSPerfCmd.exe /start:trace /output:MyFile.vsp /COUNTER:c1 /COUNTER:c2</font></p>  <p>Enjoy!</p>]]></content:encoded>
    </item>
    <item>
      <title>Thread Performance: Resource Contention Concurrency Profiling in Visual Studio 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/thread-performance-resource-contention-concurrency-profiling-in-visual-studio-2010</link>
      <pubDate>Tue, 08 Jun 2010 13:35:30 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/06/08/thread-performance-resource-contention-concurrency-profiling-in-visual-studio-2010/</guid>
      <description><![CDATA[Does your native code deals with critical sections or other synchronization primitives? Does your...]]></description>
      <content:encoded><![CDATA[<p>Does your native code deals with <strong><em><a href="https://msdn.microsoft.com/en-us/library/ms682530(VS.85).aspx">critical sections</a></em></strong> or other synchronization primitives?</p> <p>Does your managed code uses C# <strong><em><a href="https://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx">lock</a></em></strong> statement or <strong><em><a href="https://msdn.microsoft.com/en-us/library/system.threading.monitor.aspx">Monitor</a></em></strong> class?</p> <p>If yes, and if you would like to get a clear picture of all contentions in your application, you might want to check out the new profiling mode of VS2010 Profiler – Resource Contention concurrency profiling. It collects and presents information about all contentions, when synchronization resources cause your threads to be blocked in an attempt to acquire the resource.&nbsp; Being contended, a thread doesn’t run. It waits. It wastes the time. It decreases the performance you wanted to gain from your super powerful multi-core machine, when you designed your application as a multithreaded in the first place.</p> <p>For detailed explanation about how to collect contentions data, and what are the best ways to investigate it, follow the links.</p> <ol> <li><a href="https://msdn.microsoft.com/en-us/magazine/ff714587.aspx">Resource Contention Concurrency Profiling in Visual Studio 2010</a> – June 2010 MSDN article</li> <li><a title="https://blogs.msdn.com/b/mgoldin/archive/2010/04/22/resource-contention-concurrency-profiling-in-visual-studio-2010-performance-investigation-flows.aspx" href="https://blogs.msdn.com/b/mgoldin/archive/2010/04/22/resource-contention-concurrency-profiling-in-visual-studio-2010-performance-investigation-flows.aspx">Resource Contention Concurrency Profiling in Visual Studio 2010 – Performance Investigation Flows</a> – a follow up blog to the MSDN article.</li></ol> <p><img title="June 2010 issue" alt="June 2010 issue" align="middle" src="https://i.msdn.microsoft.com/ff727949.cover_0610_lrg(en-us,MSDN.10).png" /></p> <p>Resolve synchronization issues, if your code has any, and boost the performance of your application!</p>]]></content:encoded>
    </item>
    <item>
      <title>VS2010: Silverlight 4 profiling from Visual Studio UI</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/vs2010-silverlight-4-profiling-from-visual-studio-ui</link>
      <pubDate>Tue, 01 Jun 2010 12:31:55 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/06/01/vs2010-silverlight-4-profiling-from-visual-studio-ui/</guid>
      <description><![CDATA[In my previous post I showed how VS2010 Profiler command line tools can be used to profile your...]]></description>
      <content:encoded><![CDATA[<p>In my previous <a href="https://blogs.msdn.com/b/mgoldin/archive/2010/04/26/vs2010-silverlight-4-profiling.aspx">post</a> I showed how VS2010 Profiler <em>command line tools</em> can be used to profile your Silverlight 4 application, as this feature is only partially integrated with Visual Studio UI. While we are working on a full integration story, let me show you how VS UI can be used (with some extra work) currently to get same results as you get using the command line tools.</p>  <p>We will use the same <a href="https://www.silverlight.net/community/samples/silverlight-samples/breakout-game-34870/">Breakout Game</a> example, which is open as a project in Visual Studio at the beginning:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/1565.image_4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/1565.image_5F00_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/6765.image_thumb_1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/6765.image_5F00_thumb_5F00_1.png" width="337" height="189" /></a></p>  <p>As Silverlight project is not currently recognized by the Performance Wizard, you better start with creating an empty Performance Session. You can do it from the Analyze menu (Analyze –&gt; Profiler –&gt; New Performance Session):</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5381.image_8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/5381.image_5F00_8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/3618.image_thumb_3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/3618.image_5F00_thumb_5F00_3.png" width="674" height="211" /></a>&#160;&#160; </p>  <p>or by clicking a <em><strong>New Performance Session</strong></em> button in Performance Explorer:</p>  <p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/2158.image_10.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/2158.image_5F00_10.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/4214.image_thumb_4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/4214.image_5F00_thumb_5F00_4.png" width="326" height="138" /></a></p>  <p>When a new Performance Session is created, it has empty Reports and Targets nodes. Now right click on Targets, select Add Target Binary and pick up<strong> <font color="#0000ff">c:\Program Files\Internet Explorer\iexplore.exe</font></strong> (or <strong><font color="#0000ff">c:\Program Files (x86)\Internet Explorer\iexplore.exe</font></strong>, if you work on x64 machine):</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/2654.image_16.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/2654.image_5F00_16.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/7455.image_thumb_7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/7455.image_5F00_thumb_5F00_7.png" width="333" height="141" /></a> </p>  <p>Next step is to right click on iexplore.exe node, select Properties, and then select Launch tab in the Property Pages window. The “Executable to launch” is set already, but you should add Arguments and Working directory for your application.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/2654.image_24.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/2654.image_5F00_24.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/3568.image_thumb_11.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/3568.image_5F00_thumb_5F00_11.png" width="609" height="417" /></a> </p>  <p>The last preparation before you can start measurements is to make sure your Symbols setting includes the binary directory where the application is compiled. This is currently required for correct symbols resolution. You can find the Symbols setting in Tools –&gt; Options –&gt; Debugging –&gt; Symbols (it is under Debugging and not Performance Tools, as both Debugger and Profiler share the same setting for Symbols).</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/8546.image_26.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/8546.image_5F00_26.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/4645.image_thumb_12.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/4645.image_5F00_thumb_5F00_12.png" width="615" height="355" /></a> </p>  <p>Now you can click Start Profiling button <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/8546.image_36.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/8546.image_5F00_36.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/5635.image_thumb_17.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/5635.image_5F00_thumb_5F00_17.png" width="28" height="28" /></a> in the Performance Explorer, and Internet Explorer will be started under profiler, running your application. As I mentioned in the previous post, there could be number of IE processes while your application is running. Yet Visual Studio attaches Profiler to only first of them, and doesn’t reattach it automatically to other spawned processes. Thus, you have 2 options here – either to eliminate creation of child processes by IE <a href="https://blogs.msdn.com/askie/archive/2009/03/09/opening-a-new-tab-may-launch-a-new-process-with-internet-explorer-8-0.aspx">through the registry</a> (modifying <strong>TabProcGrowth</strong> value), or attach profiler to additional IE process (one or many) before you start running your scenario. Simultaneous profiling of several processes is supported, and you will actually profile all IE processes that you attach the profiler to. Those processes that run your application will generate a valuable profiling data, while rest could be later ignored. </p>  <p>You can attach to additional processes using <strong>Attach/Detach</strong> button of Performance Explorer:</p>  <p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/6708.image_28.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/6708.image_5F00_28.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/0042.image_thumb_13.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/0042.image_5F00_thumb_5F00_13.png" width="319" height="113" /></a> </p>  <p>In our example, you can see in “Attach Profiler to Process” dialog that the profiler is attached already to one IE process, and now you will attach it to yet another one.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/0044.image_30.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/0044.image_5F00_30.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/7801.image_thumb_14.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/7801.image_5F00_thumb_5F00_14.png" width="591" height="346" /></a> </p>  <p>After you finish your scenario, close IE window and profiling results will be automatically open for you in Visual Studio, so you can navigate it using all views as usual:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/3107.image_32.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/3107.image_5F00_32.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/47/76/metablogapi/3107.image_thumb_15.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-47-76-metablogapi/3107.image_5F00_thumb_5F00_15.png" width="1025" height="353" /></a></p>  <p></p>  <p></p>  <p>Enjoy!</p>]]></content:encoded>
    </item>
    <item>
      <title>VS2010: Silverlight 4 profiling</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/vs2010-silverlight-4-profiling</link>
      <pubDate>Mon, 26 Apr 2010 08:12:27 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/04/26/vs2010-silverlight-4-profiling/</guid>
      <description><![CDATA[Did you know that Visual Studio 2010 Profiler allows you to profile your Silverlight 4 applications?...]]></description>
      <content:encoded><![CDATA[<p>Did you know that Visual Studio 2010 Profiler allows you to profile your <a href="https://www.silverlight.net/getstarted/silverlight-4/">Silverlight 4</a> applications? You didn’t? It does.</p> <p>This feature, however, is only partially integrated with Visual Studio UI, and you need to use command line tools to collect the data. After that, you can open the resulting .VSP file in Visual Studio as you normally do after other types of profiling, and enjoy rich visualization experience while investigating your performance problems.</p> <p>Yes, we know it is not as cool as clicking VS buttons. We are working on a better experience. Yet I thought it is worth to emphasize that there is a way to use command line tools for customers that seek performance improvement in their Silverlight applications.</p> <p>Let assume you develop an application like <a href="https://www.silverlight.net/community/samples/silverlight-samples/breakout-game-34870/">Breakout Game</a>. </p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_2.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb.png" width="378" height="343"></a>&nbsp;</p> <p>You compile it inside VS2010, run it, and want to profiler it. Performance Wizard tells you that this project can not be launched by the profiler. Alas. Time to go to the command line tools. Click you <strong>Start </strong>button, go to <strong>All Programs </strong>and find there <strong>Microsoft Visual Studio 2010</strong>. There, go to <strong>Visual Studio Tools </strong>and launch a <strong>Visual Studio Command Prompt (2010).</strong></p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_4.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb_1.png" width="392" height="491"></a></p> <p></p> <p></p> <p>This command line window has predefined PATH that includes profiler command line tools:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_8.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb_3.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb_3.png" width="904" height="147"></a> </p> <p>Now go to the directory where your Silverlight binaries are compiled:</p> <p><font face="Courier New">&gt;cd c:\Breakout\Breakout\Bin\Release</font></p> <p>We are ready to start our profiling session.  <ol> <li><font color="#0000ff" size="2" face="Courier New"><strong>VSPerfClrEnv </strong>/sampleon </font> <li><font size="2"><font color="#0000ff"><font face="Courier New">"c:\Program Files (x86)\Internet Explorer\iexplore.exe" C:\Breakout\Breakout\Bin\Release\TestPage.html</font> </font></font> <li><font size="2"><font color="#0000ff"><font face="Courier New"><strong>VSPerfCmd</strong> /start:<strong>sample</strong> /output:MyFile /attach:&lt;PID of iexplore.exe process&gt;</font> </font></font> <li><font size="2"><font color="#0000ff"><font face="Courier New">Run your scenario</font> </font></font> <li><font size="2"><font color="#0000ff"><font face="Courier New"><strong>VSPerfCmd</strong> /detach</font> </font></font> <li><font size="2"><font color="#0000ff"><font face="Courier New"><strong>VSPerfCmd </strong>/shutdown</font> </font></font> <li><font color="#0000ff" size="2" face="Courier New"><strong>VSPerfClrEnv</strong> /off</font></li></ol> <p>Steps above require some explanation. In 1 – you prepare environment that is needed for Silverlight profiling, and in 2 you start your hosting process (iexplore.exe, in our example) within that environment. This is essential, as if you start IE by clicking an icon on your desktop, you will get no Silverlight profiling data at the end. Step 3 starts profiler in <strong>Sampling</strong> mode, and attaches it to the process of your choice. Keep in mind that you might have multiple IE processes running, so you need to choose one that runs your code. If you are not completely sure which one is it, or if your code runs in several IE processes – well, attach to all of them! You can do it either running “VSPerfCmd /attach:&lt;PidN&gt;” several times, or enumerating all PIDs in a single command: “VSPerfCmd /attach:PID1,PID2,PID3”. After profiler is attached, you run your scenario in step 4, and detach profiler from all target processes in step 5. Detaching is not enough, as you need to shutdown the profiler in order to finalize your result file (step 6). Step 7 cancels changes of the environment that are made in step 1.</p> <p>It could be that you need to profile your application from the very beginning. In this case steps 2 and 3 can be combined into one, where you launch IE under profiler:  <p><font size="2" face="Courier New">VSPerfCmd /start:<strong>sample</strong> /output:MyFile /<strong>launch</strong>:"c:\Program Files (x86)\Internet Explorer\iexplore.exe" /<strong>args</strong>:”C:\Breakout\Breakout\Bin\Release\TestPage.html“</font>  <p>The caveat here is that if IE process spawns a child process that will run your application, the profiler will be still attached to the “father” IE process, as it doesn’t re-attach itself automatically to spawned processes. You may, however, eliminate creation of child processes by IE8 <a href="https://blogs.msdn.com/askie/archive/2009/03/09/opening-a-new-tab-may-launch-a-new-process-with-internet-explorer-8-0.aspx">through the registry</a>, modifying <strong>TabProcGrowth</strong> value.  <p><img src="https://dgeenens.net/images/600px-Warning.png" width="44" height="37"> <font color="#0000ff" size="2">Please make sure that you run all the above steps from the directory where your binaries are located. Until we complete the integration of this feature with VS, your function names will not be properly resolved otherwise. </font></p> <p>You can kill you IE process now. Open the MyFile.VSP in VS2010 as you would do normally for profiling results. </p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_10.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_10.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb_4.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Silverlight4profiling_BD30/image_thumb_4.png" width="1138" height="311"></a>  <p>Formally, that would conclude an official support of Silverlight profiling in VS2010 – Sampling mode through command line tools.  <p>However, if you want to try .NET memory or concurrency resource contention profiling of your Silverlight application – I won’t stop you. This is not currently supported and tested modes of work, but they might work for you and help you to see your performance problems from a different angle.  <p>For .NET memory profiling, use “VSPerfClrEnv /samplegc” or “VSPerfClrEnv /samplegclife” in your step 1 to get either allocation profiling or allocation and lifetime profiling.  <p>For concurrency resource contention – use “/start":concurrency,ResourceOnly” in the step 3 above.  <p><font color="#0000ff" size="2"><a href="https://www.nachmore.com/2010/profiling-silverlight-4-with-visual-studio-2010/">Oren Nachman</a></font> from Sliverlight team is another excellent source for Silverlight profiling information. In his great article he provides several additional tricks and options that you can find quite useful.  <p>Enjoy!&nbsp; ]]></content:encoded>
    </item>
    <item>
      <title>Resource Contention Concurrency Profiling in Visual Studio 2010 – Performance Investigation Flows</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/resource-contention-concurrency-profiling-in-visual-studio-2010-performance-investigation-flows</link>
      <pubDate>Thu, 22 Apr 2010 09:02:23 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/04/22/resource-contention-concurrency-profiling-in-visual-studio-2010-performance-investigation-flows/</guid>
      <description><![CDATA[Visual Studio 2010 brings a number of innovations to multithreaded and parallel computing. One of...]]></description>
      <content:encoded><![CDATA[<p>Visual Studio 2010 brings a number of innovations to multithreaded and parallel computing. One of them is Resource Contention Concurrency Profiling. John Robbins gives a really great first look at this feature in his Wintellect <a href="https://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-concurrency-resource-profiling-in-depth-first-look.aspx">VS 2010 Beta 2 Concurrency Resource Profiling In Depth First Look</a> post. The June 2010 issue of MSDN magazine contains the <a href="https://msdn.microsoft.com/en-us/magazine/ff714587.aspx">Resource Contention Concurrency Profiling in Visual Studio 2010</a> article with a detailed explanation of this profiling mode, including various ways of data collection and presentation and some guidance to efficient data analysis. Here I would like to <em>append </em>the article with some additional valuable information. </p> <p>The table below presents a subset of VS2010 performance data views. Those views are useful while investigating results of Resource Contention Concurrency Profiling. </p> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="139"> <p><strong>View</strong></p></td> <td valign="top" width="499"> <p><strong>Description</strong></p></td></tr> <tr> <td valign="top" width="139"> <p>Summary</p></td> <td valign="top" width="499"> <p>Summary information is presented to serve as a starting point for your investigation. This is the first view you see, and it is opened automatically after the profiling session is over and result file is ready.</p></td></tr> <tr> <td valign="top" width="139"> <p>Resource Details</p></td> <td valign="top" width="499"> <p>A detailed view of a specific resource (for example, a lock), showing all threads that were blocked on it during the application lifetime. </p></td></tr> <tr> <td valign="top" width="139"> <p>Thread Details</p></td> <td valign="top" width="499"> <p>A detailed view of a specific thread, showing all resources (such as locks) the thread was blocked on. </p></td></tr> <tr> <td valign="top" width="139"> <p>Contention</p></td> <td valign="top" width="499"> <p>Call trees that are separated per contention resource. In other words, this view presents a set of call trees, each containing stacks that were blocked on a specific resource. </p></td></tr> <tr> <td valign="top" width="139"> <p>Processes</p></td> <td valign="top" width="499"> <p>A list of inspected processes, where each process has a list of its threads, and each thread is attributed with the number of contentions it experienced, and summarized length of blocked time. </p></td></tr> <tr> <td valign="top" width="139"> <p>Function Details</p></td> <td valign="top" width="499"> <p>A detailed view of a specific function, including functions it calls and collected data. </p></td></tr></tbody></table> <p>&nbsp;</p> <p>The <strong><font color="#0000ff">Resource Details view</font></strong>, for example, is the following one:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_2.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_thumb.png" width="1068" height="528"></a> </p> <p>There are several built-in transitions between profiling data views inside VS2010, and they are explained in the article. Let me briefly summarize those transitions through the below diagram, which presents possible performance investigation flows. When you analyze your data, do not feel obligated to use VS2010 views in that exact order or sequence – you can always select any desired view through a drop-down combo box of VS2010 that enumerates all views. The diagram is just a suggestion how that can be done.</p> <p>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_6.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_thumb_2.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/ResourceContentionConcurrencyProfilingin_C1C4/image_thumb_2.png" width="860" height="411"></a> </p> <p>The transitions that are enumerated on the diagram are: </p> <blockquote> <p>1. Move from Summary view to Resource Details view (chart) by clicking a resource name in the Most Contended Resources table  <p>2. Move from Summary view to Thread Details view (chart) by clicking a thread ID in the Most Contended Threads table  <p>3. Switch from Resource Details view to Thread Details view by clicking on a chart label, representing the thread  <p>4. Switch from Thread Details view to Resource Details view by clicking on a chart label, representing the resource  <p>5. Move from Resource Details view to Function Details view by double clicking on a function name in Contention Call Stack panel  <p>6. Move from Thread Details view to Function Details view by double clicking on a function name in Contention Call Stack panel  <p>7. Move from Resource Details view to Contention view by clicking on a Total label of the chart  <p>8. Move from Contention view to Resource Details view through a context menu (right-click) of a resource  <p>9. Move from Thread Details view to Processes/Threads view by clicking on a Total label of the chart  <p>10. Move from Processes/Threads view to Thread Details view through a context menu of a thread </p></blockquote> <p>When you open the profiling results file, you see a Summary view that helps you to select a possible investigation direction. Some options to consider here are:  <p></p> <ul> <li>Start in Summary view, detect a contention resource or a thread you want to inspect closely (because it has too many contentions), then explore data through the transitions:  <ul> <li>1 – to see resource details, or 2 – to see thread details  <li>4 and 3 – to pivot between resources and threads details  <li>5 and 6 – to see details of function causing the contention </li></ul> <li>Start in Summary view, use drop-down combo box to switch to Contention view, sort all resources, select one of them, then use transition 8 to get to the resource details, followed by transitions 4, 3, 5 and 6 as required.  <li>Start in Summary view, use drop-down combo box to switch to Processes/Threads view, sort all threads, select one of them, then use transition 10 to get to the thread details, followed by transitions 4, 3, 5 and 6 as required. </li></ul>]]></content:encoded>
    </item>
    <item>
      <title>VS2010: Using profiler to improve cache data locality</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/vs2010-using-profiler-to-improve-cache-data-locality</link>
      <pubDate>Wed, 20 Jan 2010 17:27:38 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/01/20/vs2010-using-profiler-to-improve-cache-data-locality/</guid>
      <description><![CDATA[A recent Concurrency Hazards: False Sharing article demonstrates how VS2010 profiler can be used to...]]></description>
      <content:encoded><![CDATA[<p>A recent <a href="https://www.codeproject.com/KB/threads/FalseSharing.aspx">Concurrency Hazards: False Sharing</a> article demonstrates how VS2010 profiler can be used to detect source of cache data locality issues. To achieve this, you can sample with cache specific CPU performance counters, as long as you do not run inside Virtual Machine or on Hyper-V enabled environment (<a href="https://blogs.msdn.com/mgoldin/archive/2010/01/09/visual-studio-profiler-in-virtual-environment.aspx">and this is why</a>).</p> <p>In post-VS2010 Beta 2 releases you can use <em><strong><font color="#0000ff">Last Level Cache Misses</font> </strong></em>and <strong><em><font color="#0000ff">Last Level Cache References</font> </em></strong>counters for that purpose:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Usingprofilertoimprovecachedataloc_F542/image_6.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Usingprofilertoimprovecachedataloc_F542/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/VS2010Usingprofilertoimprovecachedataloc_F542/image_thumb_2.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/VS2010Usingprofilertoimprovecachedataloc_F542/image_thumb_2.png" width="600" height="376"></a></p>]]></content:encoded>
    </item>
    <item>
      <title>PRF0025: No data was collected – why is that?</title>
      <link>https://docs.microsoft.com/archive/blogs/mgoldin/prf0025-no-data-was-collected-why-is-that</link>
      <pubDate>Thu, 14 Jan 2010 16:51:12 GMT</pubDate>
      <dc:creator><![CDATA[mgoldin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/mgoldin/2010/01/14/prf0025-no-data-was-collected-why-is-that/</guid>
      <description><![CDATA[One day, you may try to use Visual Studio profiler to sample an application you develop, and end up...]]></description>
      <content:encoded><![CDATA[<p>One day, you may try to use Visual Studio profiler to sample an application you develop, and end up with an error saying no data is collected:</p> <p><font color="#0000ff" face="Courier New">Profiling started.<br>Profiling process ID 2752 (&lt;Your Application Name&gt;).<br>Process ID 2752 has exited.<br>Data written to C:\&lt;some path&gt;\Report100114.vsp.<br>Profiling finished.<br></font><font face="Courier New"><font color="#0000ff"><strong><font size="4">PRF0025: No data was collected. </font></strong><br>Profiling complete. </font></font> <p>There could be number of reasons for that. </p> <p>The first question I will ask: “Is your application CPU bound?”. If your process doesn’t use CPU intensively enough during the profiling session (it waits on IO instead, for example), than the process becomes “invisible” for default profiler sampling (as events that trigger a sample happen when <em>other</em> applications are running – see my previous <a href="https://blogs.msdn.com/mgoldin/archive/2005/08/05/total-application-kernel-overhead-other-samples-what-are-they-all-about.aspx">post</a> explaining different samples and what they mean). If you use advanced sampling, configuring some specific CPU Performance Counter (through either /COUNTER command line option, or using Visual Studio UI) – for example, L2 Cache Misses – then again, if your application doesn’t generate samples of <em>that specific event</em>, no data will be collected. In those cases you may try to switch to Instrumentation mode.</p> <p>If, however, you are sure your application is CPU bound as you see CPU spikes during its execution, yet Visual Studio claims “no data was collected” – please look into Properties of the collected file (you can get it by pressing F4). In some rare cases you will see all collected Samples are set to 0. Which means no sample was collected at all (normally, even if your application is not CPU bound – samples <em>are</em> collected, but they belong either to kernel mode, or other applications; Total number of samples equal to 0 is something really strange). The question I will ask in this case is: “Did you use any other diagnostic tool recently? Especially those, that are not developed by Microsoft?” And if you answer “Yes”, please reboot your machine and try again. The reason is that some tools may leave your machine hardware in a state that breaks functionality of Visual Studio profiler. Reboot will fix it for you.</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/PRF0025Nodatawascollectedwhyisthat_9A69/image_4.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/PRF0025Nodatawascollectedwhyisthat_9A69/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/mgoldin/WindowsLiveWriter/PRF0025Nodatawascollectedwhyisthat_9A69/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/mgoldin/WindowsLiveWriter/PRF0025Nodatawascollectedwhyisthat_9A69/image_thumb_1.png" width="494" height="433"></a></p>]]></content:encoded>
    </item>
  </channel>
</rss>