<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Premier Field Engineering Developer Blog</title><subtitle type="html">Microsoft Premier Field Engineering - Developer-oriented articles from Microsoft PFEs</subtitle><id>http://blogs.msdn.com/b/mspfe/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/mspfe/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2012-12-04T15:06:32Z</updated><entry><title>Top 5 Reasons Your Windows Store App Fails Store Certification</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/05/06/top-5-reasons-your-windows-store-app-fails-store-certification.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/05/06/top-5-reasons-your-windows-store-app-fails-store-certification.aspx</id><published>2013-05-06T13:50:00Z</published><updated>2013-05-06T13:50:00Z</updated><content type="html">&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Summary&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;:&amp;nbsp; Whether you're trying to get your Windows Store App certified in the Windows Store and running into blockers, or simply writing a new app for Windows 8 that you expect to publish via the Windows Store, check out the great insight provided by Robert Evans and Christophe Nasarre (two Microsoft Premier Field Engineers) in this article on the primary culprits you might run into when it comes to the certification process.&amp;nbsp; They are technical leads for Windows Store App Labs and they provide a multitude of tips and pointers to some great resources.&amp;nbsp; If that&amp;rsquo;s not enough, they also have the following video to walk you through some of the details.&amp;nbsp; Watch the video, read the post, be informed!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src="http://www.youtube.com/embed/pd_vRJ-UQYs" frameborder="0" width="640" height="360"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;When submitting your app to the Windows Store (&lt;a href="http://www.windowsstore.com"&gt;http://www.windowsstore.com&lt;/a&gt;) you may encounter issues with &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh694083.aspx" target="_blank"&gt;Store Certification&lt;/a&gt;. These are the top 5 most common Store Certification blockers that we&amp;rsquo;ve seen in our &lt;a href="http://www.windowsstore.com/applabs"&gt;Windows Store App Labs&lt;/a&gt; &amp;ndash; and how you can fix them. Let&amp;rsquo;s count-down in reverse order:&lt;/p&gt;
&lt;h2&gt;Number 5: Your App Should be Fully Functional&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Certification requirement 1.2: &amp;ldquo;App must be fully functional&amp;rdquo; (also similar failure is related to certification requirement 3.2 &amp;ldquo;Your app must not stop responding, end unexpectedly, or contain programming errors&amp;rdquo;).&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are failing on this certification requirement there are some things you should check:&lt;/p&gt;
&lt;blockquote&gt;&lt;ol&gt;
&lt;li&gt;Have you tested your App Snapped? Are there overlapping icons in your app bar while snapped?&lt;/li&gt;
&lt;li&gt;Does the charms menu cover up any critical commands?&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;ve declared your app as supporting portrait and landscape &amp;ndash; does it?&lt;/li&gt;
&lt;li&gt;Does your submitted description talk about features you haven&amp;rsquo;t implemented yet? Does your app crash at any point?&lt;/li&gt;
&lt;li&gt;If the app plays background audio does it implement play, pause, and play/pause events to enable users to control audio playback?&lt;/li&gt;
&lt;li&gt;If your app has &amp;ldquo;login&amp;rdquo; functionality did you create a test user account and provide the username/password in the &amp;ldquo;Notes to Testers&amp;rdquo; field when you submit your application?&lt;/li&gt;
&lt;li&gt;Does the app work on all the architectures such as ARM that you checked off and claim to support when you submitted your app?&lt;/li&gt;
&lt;li&gt;Have you run the Windows App Cert Kit against your app &amp;ndash; and from an ARM device such as Surface?&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;h2&gt;Number 4: Localize Appropriately&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Certification requirement 6.5: &amp;ldquo;You must localize your app for all languages that it supports.&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is different than specifying Markets. Your supported language may differ from the Markets, and Markets are specified when submitting your app under &amp;ldquo;Selling Details.&amp;rdquo;&amp;nbsp; For example, if you open Package.apppxmanifest and under your &amp;lt;Resources&amp;gt; specify &amp;lt;Resource Language="x-generate" /&amp;gt; then Visual Studio will automatically add the languages your app supports based on the discovered resources when generating your final manifest. The important thing with regards to certification is that you support at least &lt;a href="http://aka.ms/gxdeut" target="_blank"&gt;one of the allowed 37 certification languages&lt;/a&gt;. You may support any number of the 66 total allowed languages, but at least one language must be one of the allowed certification languages for testing purposes. Be sure that all of your images are also localized &amp;ndash; if you have any images that contain text they should be localized.&lt;/p&gt;
&lt;h2&gt;Number 3: Performance&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Certification requirement 3.8: &amp;ldquo;Your app must meet the basic performance criteria on a low-power computer - the app must launch in 5 seconds or less and the app must suspend in 2 seconds or less.&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Runtime broker suspends all threads of any Windows Store App that is not in the forefront. If your app takes more than the allotted time to save state while suspending or takes too long while loading then the your app will be terminated. Typically this failure is uncovered by testing with the latest version of the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/jj572486.aspx" target="_blank"&gt;Windows App Cert Kit&lt;/a&gt; which does automated tests of this. Failing on this requirement results in a technical compliance failure. In some cases people run the Windows App Cert Kit on their developer machine but when they submit to the store they still fail with this issue. That is why we recommend running the Windows App Cert Kit against your app on different hardware &amp;ndash; including on an ARM device such as &lt;a href="http://www.surface.com" target="_blank"&gt;Surface&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then the question is what are you doing in your app when you are loading and when you are suspending? If you are talking to webservices perhaps it works on your local machine but not when you upload as performance may vary based on different network capability. You should avoid any long operations when loading and when suspending and save state only locally. LocalSettings is a keyvalue pair that can be used that saves locally. RoamingSettings saves locally first and then synchs at a later date so that too is a great way to save data &amp;ndash; and it is easy to change the default backing store of the SuspensionManager to RoamingSettings (see &lt;a href="http://aka.ms/vrrplb"&gt;http://aka.ms/vrrplb&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;If you find your initial loading is taking a long time due to heavy operations such as xml serialization then check out the &lt;a href="http://code.msdn.microsoft.com/windowsapps/Splash-screen-sample-89c1dc78" target="_blank"&gt;MSDN Splashcreen Sample&lt;/a&gt;. They load the app and then create a fake splashscreen while they continue heavy loading operations &amp;ndash; that&amp;rsquo;s one way to get around the time limitations.&lt;/p&gt;
&lt;p&gt;Another common issue related to performance is when navigating pages within your app &amp;ndash; you should only use simple types for your navigation parameters &amp;ndash; such as Strings or Ints.&lt;/p&gt;
&lt;h2&gt;Number 2: Primary Experiences Stay Within The App&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Certification requirement 2.4: &amp;ldquo;The primary experiences your app provides must take place within the app.&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This was a very common failure reason particularly in the first wave of Windows Store Apps and it is still common today. You should not redirect the user to the web browser to complete one of your primary scenarios. In our labs we recommend developers document their five primary scenarios for testing and include them in their tester notes with each step and a &amp;ldquo;scenario complete&amp;rdquo; at the end.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s okay to redirect the user to the browser or even embedded browser for other scenarios in your app such as submitting help requests or tutorials and such &amp;ndash; but it&amp;rsquo;s not okay for your primary scenarios. You should not take them out to a browser nor should you use an embedded browser.&lt;/p&gt;
&lt;p&gt;The reason is simple &amp;ndash; if you are using a browser to complete your primary scenario &amp;ndash; then it is arguable that your app should be a website and not an app.&lt;/p&gt;
&lt;h2&gt;Number 1:&amp;nbsp; Privacy-Related Requirements&lt;/h2&gt;
&lt;p&gt;Drum roll please&amp;hellip; the number one top failure reason for Windows Store Certification is&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Certification requirement&lt;/strong&gt; &lt;strong&gt;4.1: &amp;ldquo;Your app must comply with the following privacy-related requirements&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why do so many people fail on this? By default in Visual Studio, Windows Store App templates have the Internet (Client) capability declared. When this is declared &amp;ndash; even if you aren&amp;rsquo;t using it &amp;ndash; you must have a Privacy Statement and it must be available from the Settings Flyout. That Privacy Statement can be a link to your online Privacy Statement or another page within your app that lists the Privacy Statement. If you are not using the network you can simply disable that capability to avoid this requirement. Otherwise it is easy enough to add a settings flyout. There are examples on &lt;a href="http://code.msdn.microsoft.com/windowsapps/App-settings-sample-1f762f49" target="_blank"&gt;MSDN&lt;/a&gt; or see Tim Heuer&amp;rsquo;s excellent free &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;frm=1&amp;amp;source=web&amp;amp;cd=1&amp;amp;cad=rja&amp;amp;ved=0CDAQFjAA&amp;amp;url=https%3A%2F%2Fgithub.com%2Ftimheuer%2Fcallisto&amp;amp;ei=Mi6EUc30O4L2iwLIzoGYDA&amp;amp;usg=AFQjCNFlOXB6u_LJl50X-uSlgyHkVp84Zg&amp;amp;sig2=MZwLjs3TktYQOzHn1IrlKg&amp;amp;bvm=bv.45960087,d.cGE" target="_blank"&gt;Callisto&lt;/a&gt; controls also available as a Nuget package.&lt;/p&gt;
&lt;p&gt;In that similar category of failure reasons &amp;ndash; if you are selling your app &amp;ndash; you must also have a help and support section. There are three acceptable help and support options. A telephone, an email address (and they will test if it is a working address) or a webform. The help and support can be a separate link from your Settings flyout or it can be within your About section (also linked in your Settings flyout).&lt;/p&gt;
&lt;h2&gt;Finally&amp;hellip;&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve followed these pointers and you&amp;rsquo;ve checked the Windows Store Apps &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/category/windowsapps" target="_blank"&gt;Forums&lt;/a&gt; and you are still blocked on Store Certification &amp;ndash; please don&amp;rsquo;t sit there in frustration depriving the world of your amazing app!&lt;/p&gt;
&lt;p&gt;Please either visit one of our free Windows Store App Labs (&lt;a href="http://www.windowsstore.com/applabs" target="_blank"&gt;www.windowsstore.com/applabs&lt;/a&gt;) or follow the instructions below to get fast assistance. There&amp;rsquo;s even a &amp;ldquo;chat&amp;rdquo; option!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1)&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit the URL: &lt;a href="http://aka.ms/storesupport" target="_blank"&gt;http://aka.ms/storesupport&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2)&amp;nbsp;&amp;nbsp;&amp;nbsp; Towards the bottom of the page, there is a link that says &amp;ldquo;&amp;hellip;&lt;a href="https://getsupport.microsoft.com/?locale=EN-US&amp;amp;supportregion=EN-US&amp;amp;ccfcode=US&amp;amp;mkt=EN-US&amp;amp;pesid=14654&amp;amp;oaspworkflow=start_1.0.0.0&amp;amp;tenant=store&amp;amp;supporttopic_L1=31762159&amp;amp;supporttopic_L2=31762160" target="_blank"&gt;contact us&lt;/a&gt; immediately.&lt;strong&gt;&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;3)&amp;nbsp;&amp;nbsp;&amp;nbsp; Click that link and then it will ask you to choose the support type. To reach the App Certification team choose the following:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Problem Type: &amp;ldquo;App Submission and Certification&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Category: &amp;ldquo;Submitting an app&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Once you do that chose an option for support such as &amp;ldquo;Request a Call&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/2480.clip_5F00_image0024_5F00_01BA7314.jpg"&gt;&lt;img style="display: inline; background-image: none;" title="Windows Store Certification Developer Support Options" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/8360.clip_5F00_image0024_5F00_thumb_5F00_7CD7BF57.jpg" alt="Windows Store Certification Developer Support Options" width="699" height="363" border="0" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10416333" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows 8" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+8/" /><category term="Windows Store" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+Store/" /><category term="Robert Evans" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Robert+Evans/" /><category term="Certification" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Certification/" /><category term="Christophe Nasarre" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Christophe+Nasarre/" /><category term="Windows Store App" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+Store+App/" /></entry><entry><title>Windows Store App Development, with Christophe</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/04/05/windows-store-app-development-with-christophe.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/04/05/windows-store-app-development-with-christophe.aspx</id><published>2013-04-05T01:21:34Z</published><updated>2013-04-05T01:21:34Z</updated><content type="html">&lt;p&gt;&lt;a href="http://iinspectable.wordpress.com/"&gt;Christophe Nasarre-Soulier&lt;/a&gt; is a development-focused PFE I’ve worked via the Windows Store App Labs program.&lt;/p&gt;  &lt;p&gt;As part of that program, we provide design and development assistance to Windows Store App developers across the world, and gained a lot of exposure to common questions, issues, and techniques.&lt;/p&gt;  &lt;p&gt;Christophe’s been busy blogging some of his learnings on Windows Store Apps – including (naughty!) testing-only features that are fun to play with in local development environments but that won’t pass Store certification requirements – and has a veritable smorgasbord of posts for you to consume.&lt;/p&gt;  &lt;p&gt;First up, his series on &lt;a href="http://iinspectable.wordpress.com/2013/03/01/inter-process-communication-with-winrt-part-1/"&gt;inter-process communication with Windows Store Apps&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Since the pre-release of Windows 8 at the Microsoft BUILD conference in 2011, I’ve been investigating the different ways for a Windows Store App (WSA in the rest of the post) to interact with either other WSAs or Desktop Apps (DA in the rest of the post). Unlike .NET that was built from the beginning with &lt;/em&gt;&lt;a href="http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X"&gt;&lt;em&gt;interoperability in mind&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, WinRT is another beast.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;A Microsoft collegue has been &lt;/em&gt;&lt;a href="http://apps.microsoft.com/windows/app/windows-8-company-store/9b22e9ba-50cc-4e0c-8aa6-c84d351c4ddb"&gt;&lt;em&gt;working on a WSA&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that makes it simple to deploy and launch applications in an enterprise environment (visit &lt;/em&gt;&lt;a href="http://companystore.codeplex.com/"&gt;&lt;em&gt;http://companystore.codeplex.com/&lt;/em&gt;&lt;/a&gt;&lt;em&gt; for more details). However, some actions are not allowed from a WSA such as looking for installed WSAs and launch them. This was a great opportunity to turn my research into real code. I’m sharing the outcome in a few blog posts starting with this one.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first post (linked above) covers the basics of possible interaction mechanisms between Windows Store apps (file associations and protocol handlers), and it’s a quick, helpful read.&lt;/p&gt;  &lt;p&gt;The second post &lt;a href="http://iinspectable.wordpress.com/2013/03/08/inter-process-communication-with-file-association-in-winrt-part-2/"&gt;delves deeply into using file associations&lt;/a&gt; to allow app activation outside the bounds of a Windows Store App into a desktop app – with the requisite warning that you can’t do this in a Store-published app:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;WARNING&lt;/font&gt;: all these techniques are violating the point 3.1 from the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh694083.aspx"&gt;&lt;em&gt;Windows Store Requirements&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that states: “Your app may only depend on software listed in the Windows Store“. Therefore, you should not use them for a WSA that you plan to publish into the Windows Store because it will be rejected.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It’s a fascinating look into the internals of how file association activation works.&lt;/p&gt;  &lt;p&gt;Christophe’s back-catalogue covers lots of other WinRT-related goodness, from &lt;a href="http://iinspectable.wordpress.com/2013/02/02/wsals_guidelines_and_requirements_for_windows_store_apps_development/"&gt;Windows Store checklists to make it easier to make great Windows Store apps&lt;/a&gt;, to a &lt;a href="http://iinspectable.wordpress.com/2012/08/12/missing-bcl-types-in-winrt/"&gt;tool that identifies BCL classes available vs excluded from WinRT and the .Net Framework 4.5&lt;/a&gt;. Enjoy!&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Posted by &lt;/font&gt;&lt;/em&gt;&lt;a href="http://blogs.technet.com/b/tristank/"&gt;&lt;em&gt;&lt;font size="1"&gt;Tristan Kington&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;font size="1"&gt;, MSPFE Editor that just got to use the word “smorgasbord” in a serious context&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10407814" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows 8" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+8/" /><category term="Windows Store" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+Store/" /><category term="WinRT" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/WinRT/" /><category term=".Net" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/-Net/" /></entry><entry><title>Taming XML query performance using persisted computed columns</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/03/26/taming-xml-query-performance-using-persisted-computed-columns.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/03/26/taming-xml-query-performance-using-persisted-computed-columns.aspx</id><published>2013-03-26T09:58:55Z</published><updated>2013-03-26T09:58:55Z</updated><content type="html">&lt;p&gt;Storing data in XML format has presented a &lt;a href="http://en.wikipedia.org/wiki/Conundrum" target="_blank"&gt;conundrum&lt;/a&gt; to SQL developers from time to time. While storing it is easy, how does one efficiently extract those pieces of data which are needed from the XML field?&lt;/p&gt;  &lt;p&gt;My friend and PFE colleague from Dubai, &lt;a href="http://blogs.msdn.com/b/batuhanyildiz/about.aspx" target="_blank"&gt;Batuhan Yildiz,&lt;/a&gt; had faced this situation recently. He shares his experiences on the performance impact of retrieving specific data from the XML field, and presents an interesting way of solving the issue by using persisted computed columns. Read the details at his &lt;a href="http://blogs.msdn.com/b/batuhanyildiz/archive/2013/03/21/which-one-is-better-persisted-column-or-xml-indexes.aspx" target="_blank"&gt;blog here&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;   &lt;hr /&gt;&lt;em&gt;Linked content authored by &lt;a href="http://blogs.msdn.com/b/batuhanyildiz/about.aspx" target="_blank"&gt;Batuhan Yildiz&lt;/a&gt;; posted by &lt;a href="http://blogs.msdn.com/b/arvindsh" target="_blank"&gt;Arvind Shyamsundar&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405360" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>The case of the broken AppFabric</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/03/22/the-case-of-the-broken-appfabric.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/03/22/the-case-of-the-broken-appfabric.aspx</id><published>2013-03-22T09:36:44Z</published><updated>2013-03-22T09:36:44Z</updated><content type="html">&lt;p&gt;&lt;em&gt;This article has been contributed by Vasco Preto, a Premier Field Engineer with Microsoft Portugal. Vasco is no stranger to MSPFE, having previously contributed a very interesting case study on our TechNet blog. This time he shares a captivating walkthrough on how to troubleshoot AppFabric caching services.&lt;/em&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;I’ve been recently involved in troubleshooting a production problem reported by a customer which revolved around a generic error that was preventing client applications from successfully establishing a connection to the &lt;a href="http://msdn.microsoft.com/en-us/windowsserver/gg675186" target="_blank"&gt;AppFabric – Caching Services&lt;/a&gt; layer. Here’s a quick recap of what the exact symptoms were and the analysis and diagnostic that resulted from the troubleshooting effort.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Problem description &lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;The client presented a specific case where a set of recently deployed client applications were unable to connect to the AppFabric – Caching Services layer. This specific error was generating the following message (extracted from the event logging system).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;{Microsoft.ApplicationServer.Caching.DataCacheException: ErrorCode&amp;lt;ERRCA0017&amp;gt;:SubStatus&amp;lt;ES0006&amp;gt;:There is a temporary failure. Please retry later. (One or more specified Cache servers are unavailable, which could be caused by busy network or servers. Ensure that security permission has been granted for this client account on the cluster and that the AppFabric Caching Service is allowed through the firewall on all cache hosts. Retry later.)&lt;/font&gt;&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Furthermore, the client stated that this error was only affecting a subset of client applications and these specific client applications had functioned correctly in the past and, supposedly, they had not been subjected to any change recently.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Analysis&lt;/b&gt;&lt;/h2&gt;  &lt;h3&gt;Step 1: Check for known issues&lt;/h3&gt;  &lt;p&gt;Considering the starting point, which was little more than a fairly generic message, I did a quick search through existing KB articles in an attempt to clarify which conditions could actually lead to this type of error. Unfortunately, this quick research did not produce a more defined and limited scope to investigate, as there are many different conditions that can lead to problems which are reported through error code &lt;code&gt;ERRCA0017&lt;/code&gt; and sub-status code &lt;code&gt;ES0006&lt;/code&gt;.&lt;/p&gt;  &lt;h3&gt;Step 2: Check if the AppFabric cluster is running&lt;/h3&gt;  &lt;p&gt;Considering that the client was describing the problem as a connection error between client applications and AppFabric server, I started off my direct troubleshooting effort by verifying that the AppFabric cluster was in fact up and running. Using some administrative PowerShell commands I concluded that the AppFabric server was in fact working properly (commands used include &lt;code&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Get-CacheClusterHealth&lt;/font&gt;&lt;/code&gt;,&lt;code&gt; &lt;font style="background-color: rgb(204, 204, 204);"&gt;Get-Cache&lt;/font&gt; &lt;/code&gt;and&lt;code&gt; &lt;font style="background-color: rgb(204, 204, 204);"&gt;Get-CacheStatistics&lt;/font&gt;&lt;/code&gt;).&lt;/p&gt;  &lt;p&gt;Afterwards, I verified if I could in fact establish a TCP connection between client and server machines through the AppFabric port, which is port 22233. By using a simple telnet client utility I did in fact verify that the client application was able to connect to the server through port 22233. However, when that connection was established through AppFabric’s client libraries the previously showed error would appear.&lt;/p&gt;  &lt;h3&gt;Step 3: Gathering network traces&lt;/h3&gt;  &lt;p&gt;At this point, I was able to get a few network traces supplied by the customer’s operations team. As shown in the following image, which depicts the filtered frames that pertain to the action of establishing the AppFabric connection (filtered by client and server IP addresses), we can clearly see two things:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The initial TCP/IP handshake between client and server was correctly established.&lt;/li&gt;    &lt;li&gt;A few frames after the handshake, the server reset the connection.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/8662.clip_5F00_image002_5F00_45D03B70.jpg"&gt;&lt;img title="Analysing the network trace" style="display: inline; background-image: none;" border="0" alt="Analysing the network trace" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/6521.clip_5F00_image002_5F00_thumb_5F00_114F6928.jpg" width="654" height="410" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 4: Drilling down into the network trace&lt;/h3&gt;  &lt;p&gt;Continuing within the network trace, and following the TCP stream regarding these frames, I could drill down on a bit more information. As seen in the next image, the information contained within the network trace showed a few more interesting pieces of information:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Information regarding the client and its credentials.&lt;/li&gt;    &lt;li&gt;Identification of the server to which the communication was being established.&lt;/li&gt;    &lt;li&gt;References to authentication protocols.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/7585.clip_5F00_image004_5F00_2EE14427.jpg"&gt;&lt;img title="More details from network trace" style="display: inline; background-image: none;" border="0" alt="More details from network trace" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/6683.clip_5F00_image004_5F00_thumb_5F00_4C731F26.jpg" width="654" height="410" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 5: Checking which accounts have access to AppFabric&lt;/h3&gt;  &lt;p&gt;At this point, I discussed the situation with the customer and we both agreed that the problem seemed to be related with client credentials and inherent authentication process. Going back to the PowerShell administration console, we analyzed which accounts had been granted access to AppFabric. As shown in the next output, the existing configuration was apparently allowing a wide open access to all client credentials.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;PS C:\Windows\system32&amp;gt; Get-CacheAllowedClientAccounts          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;EVERYONE          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;ANONYMOUS LOGON&lt;/font&gt;&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Despite this configuration, I queried the customer about the exact credentials that the client was sending (which were also identifiable in the previously shown TCP stream – please note reference to local machine) and we concluded that the client application was using a local account. As such, the customer agreed to change the client credentials and the client application was reconfigured to use a domain account.&lt;/p&gt;  &lt;h3&gt;Step 6: AppFabric logging and ETW&lt;/h3&gt;  &lt;p&gt;Unfortunately this change did not fix the problem so we analyzed other available troubleshooting options and decided that we needed to get more logging data from AppFabric. By the way, this avenue has impact as it requires restarting the cache service, which implies temporarily restarting one of the cache cluster nodes, and hence temporarily affecting performance (other cache nodes are not directly affected, but regions within this node will ultimately need to be re-populated from ground up afterwards). After some debate, the client accepted this route and we performed two actions.&lt;/p&gt;  &lt;p&gt;Firstly, we changed the logging level of the caching service by adding the following configuration elements to its configuration file (file DistributedCacheService.exe.config).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;lt;system.diagnostics&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sources&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;source name=&amp;quot;System.ServiceModel&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switchValue=&amp;quot;Information, ActivityTracing&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propagateActivity=&amp;quot;true&amp;quot;&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listeners&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add name=&amp;quot;traceListener&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;System.Diagnostics.XmlWriterTraceListener&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; initializeData= &amp;quot;c:\Temp\DistributedCacheService.svclog&amp;quot; /&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/listeners&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/source&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/sources&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;trace autoflush=&amp;quot;true&amp;quot; /&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;#160; &amp;lt;/system.diagnostics&amp;gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Secondly, we activated ETW for AppFabric through the following command line:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;tracelog.exe -start debugtrace -f &amp;quot;c:\Temp\cachedebugtrace.etl&amp;quot; -guid &amp;quot;c:\Windows\System32\AppFabric\Manifests\ProviderGUID.txt&amp;quot; -level 5 -cir 512&lt;/font&gt;&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Step 7: Analyzing ETW&lt;/h4&gt;  &lt;p&gt;After acquiring the ETW log we transformed it into a CSV file through the command: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;tracerpt &amp;quot;c:\Temp\cachedebugtrace.etl&amp;quot; -o &amp;quot;c:\Temp\cachedebugtrace.csv&amp;quot; -of CSV&lt;/font&gt;&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And by analyzing its contents we were able to find some interesting information such as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&amp;quot;Recoverable exception raised - ChannelID = 29180324 System.ServiceModel.ProtocolException: Stream Security is required at http://www.w3.org/2005/08/addressing/anonymous, but no security context was negotiated. This is likely caused by the remote endpoint missing a StreamSecurityBindingElement from its binding. at System.ServiceModel.Channels.ServerSessionPreambleConnectionReader.ServerFramingDuplexSessionChannel.SetupSecurityIfNecessary() at System.ServiceModel.Channels.ServerSessionPreambleConnectionReader.ServerFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at Microsoft.ApplicationServer.Caching.WcfServerChannel.Listen(IAsyncResult result)&amp;quot;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Interestingly, this message hints that there is something definitely wrong with the security context, but not necessarily implying problems with credentials. It also suggests that there are some issues with the underlying WCF transport that is used between client application and AppFabric server whenever the AppFabric API is used. &lt;/p&gt;  &lt;p&gt;The error message is almost clear to the point that it identifies the lack of a required security context, which results in a binding error to an existing WCF endpoint. To confirm this we opened the log file (the &lt;code&gt;svclog&lt;/code&gt; file generated by the changes introduced in the distributed cache service configuration file) which confirmed what had been established so far (as shown in the following picture).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/4024.image_5F00_58286658.png"&gt;&lt;img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/8737.image_5F00_thumb_5F00_0C9912D4.png" width="654" height="410" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In possession of all this information we went back to the configuration files of both client application and AppFabric server and concluded that there was indeed a mismatch, as the client configuration (contrary to what was defined in the server side configuration) was using &lt;code&gt;None&lt;/code&gt; as the configuration value for both &lt;code&gt;securityMode&lt;/code&gt; and &lt;code&gt;protectionLevel &lt;/code&gt;(more information on these options can be found &lt;a href="http://msdn.microsoft.com/en-us/library/ff921012(v=azure.10).aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Finally, the solution!&lt;/h2&gt;  &lt;p&gt;So, finally, to fix the problem we changed the &lt;code&gt;securityMode&lt;/code&gt; to &lt;code&gt;Transport&lt;/code&gt; and the &lt;code&gt;protectionLevel&lt;/code&gt; to &lt;code&gt;EncryptAndSign&lt;/code&gt; and, having matched client and server configuration attributes, the solution was finally up and running. &lt;/p&gt;  &lt;p&gt;To wrap up, it is almost inevitable to report that, as it turns out, someone had, inadvertently, copied a configuration file from development environment to production, thinking that they were an exact match, without verifying that the security configuration elements were in fact distinct. &lt;/p&gt;  &lt;p&gt;I guess this is another example that supports the prohibition of direct copying from development and quality environments into production environments, although a more clear error message from AppFabric would also be much appreciated &lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/3857.wlEmoticon_2D00_smile_5F00_50209E29.png" /&gt;.&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;em&gt;Written by Vasco Preto; posted by MSPFE Editor &lt;a href="http://blogs.msdn.com/b/arvindsh" target="_blank"&gt;Arvind Shyamsundar&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10404482" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Azure" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Azure/" /><category term="AppFabric" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/AppFabric/" /><category term="WCF" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/WCF/" /><category term="Vasco Preto" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Vasco+Preto/" /></entry><entry><title>More Efficiently Debug the Managed Heap Using SOS 4.5</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mariohewardt/archive/2013/03/13/more-efficiently-debug-the-managed-heap-using-sos-4-5.aspx" /><id>http://blogs.msdn.com/b/mariohewardt/archive/2013/03/13/more-efficiently-debug-the-managed-heap-using-sos-4-5.aspx</id><published>2013-03-13T22:27:00Z</published><updated>2013-03-13T22:27:00Z</updated><content type="html">More often than not, when we investigate the managed heap using SOS we use the all powerful !DumpHeap command. It's an incredibly useful command to get in depth detail on what currently resides on the heap. Let's look at an example of the abbreviated output from !DumpHeap -stat: 
 
 MT Count TotalSize ...read more...(&lt;a href="http://blogs.msdn.com/b/mariohewardt/archive/2013/03/13/more-efficiently-debug-the-managed-heap-using-sos-4-5.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10402145" width="1" height="1"&gt;</content><author><name>kurakuraninja</name><uri>http://blogs.msdn.com/Anonymous/ProfileUrlRedirect.ashx</uri></author><category term="MSPFE" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/MSPFE/" /><category term="debugging" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/debugging/" /><category term="WinDbg" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/WinDbg/" /><category term="SOS" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/SOS/" /><category term="4.5" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/4-5/" /></entry><entry><title>Video series: .Net Debugging for the Production Environment</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/01/30/video-series-net-debugging-for-the-production-environment.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/01/30/video-series-net-debugging-for-the-production-environment.aspx</id><published>2013-01-30T10:38:59Z</published><updated>2013-01-30T10:38:59Z</updated><content type="html">&lt;p&gt;Brad Linscott is a very experienced Premier Field Engineer from the .Net development side of the house &lt;em&gt;(Ed: who originally trained me in .Net Debugging techniques, oh, eight? years ago?)&lt;/em&gt; and he’s published a &lt;a href="http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment"&gt;video series on .Net Debugging on Channel 9&lt;/a&gt;, which runs you from the basics to some quite advanced techniques in .Net debugging, as performed by the experts!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;img src="http://files.channel9.msdn.com/thumbnail/09eecb88-d147-4abf-ad8c-57e484d5f1e4.png" width="640" height="167" /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;This series was created based off of a thread on the Channel 9 Site Feedback forum. Read the original post &lt;/em&gt;&lt;a href="http://channel9.msdn.com/Forums/Feedback/Suggestion-WinDBG-tutorial-video-series-from-beginner-to-advanced#cf1f9724fd4d74bad8cec9fd800abf1e2"&gt;&lt;em&gt;here&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. We heard what you wanted, so we created the first &lt;strong&gt;.NET Debugging Starter Kit&lt;/strong&gt; series. With the help of Brad Linscott, Premier Field Engineer, this series will teach you how to use various tools, including the Debugging Tools for Windows package (windbg), to resolve your .NET application issues in a production and pre-production environment, including post-mortem analysis of dump files.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It’s a series of shortish videos (given the subject depth), which is nice and lunch-break friendly. Or you could replace your mandatory afternoon snooze with learnings!&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;em&gt;Posted by &lt;/em&gt;&lt;a href="http://blogs.technet.com/b/tristank/"&gt;&lt;em&gt;Tristan Kington&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, MSPFE Editor, and a table as well.&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10389453" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="debugging" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/debugging/" /><category term="ASP.Net" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/ASP-Net/" /><category term="Brad Linscott" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Brad+Linscott/" /></entry><entry><title>Free Expert Advice for Building Your Windows 8 Apps.  Windows Store App Labs! </title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/01/25/free-expert-advice-for-building-your-windows-8-app-windows-store-app-labs.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/01/25/free-expert-advice-for-building-your-windows-8-app-windows-store-app-labs.aspx</id><published>2013-01-25T15:59:00Z</published><updated>2013-01-25T15:59:00Z</updated><content type="html">&lt;div class="post-content user-defined-markup"&gt;&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Summary:&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&amp;nbsp; &lt;/em&gt;&lt;a href="http://social.technet.microsoft.com/profile/robert%20w%20evans/" target="_blank"&gt;&lt;em&gt;Robert Evans&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, a Senior Microsoft Premier Field Engineer focused on development, informs us of some awesome resources for Windows 8 developers to get&amp;nbsp;advice from experts and access to a myriad of Win8 devices.&amp;nbsp; Take advantage of it if you can.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52/1803.Win8.png"&gt;&lt;img style="border: 0px currentColor;" title="Windows 8 Logo" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52/1803.Win8.png" alt="Windows 8 Logo" width="300" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows Store App Labs (WSALs) are here!&lt;/strong&gt; A place where you can access Windows 8 devices, get design help, and meet with Windows 8 Experts to make your app great! &lt;strong&gt;All for free!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Get technical guidance from Windows 8 Experts&lt;/h2&gt;
&lt;p&gt;Our Windows Store app developer experts are on-hand to help you get started, to test your app and offer any technical advice you need!&amp;nbsp; We can help you with coding tips, debugging, and prepping your app to submit to the Windows Store.&lt;/p&gt;
&lt;h2&gt;Check out and test on the newest Windows 8 devices&lt;/h2&gt;
&lt;p&gt;Test your app on a variety of screen sizes, input methods, and chipsets with the latest Windows 8 devices including Windows RT tablets, Ultrabooks, All-in-Ones, and more. Designers will review your app mock-ups or your complete app and provide feedback on how you can improve your app&amp;rsquo;s layout, navigation, live tile, and other UI elements.&lt;/p&gt;
&lt;p&gt;As you get started - check out &lt;a href="http://blogs.msdn.com/b/windowsstore/archive/2012/11/19/5-tips-to-getting-your-apps-certified-quickly.aspx"&gt;5 tips to help you get your app certified&lt;/a&gt; quickly, &lt;a href="http://blogs.msdn.com/b/cbowen/archive/2012/08/01/the-top-10-windows-8-secrets-of-app-success.aspx"&gt;top 10 app secrets of success&lt;/a&gt;, &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/category/windowsapps"&gt;Win8 Forms&lt;/a&gt; and more helpful information on our&lt;a href="https://applabs.msregistration.com/LabResources.aspx"&gt; lab resources page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;All for free!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Space is limited.&amp;nbsp; Please register for a lab in your location:&lt;/p&gt;
&lt;table style="width: 759px;" border="0" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;&lt;strong&gt;Country&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;&lt;strong&gt;City&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;strong&gt;Registration Link&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;Canada&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Vancouver&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=52&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=52&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;US&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;San Francisco/Santa Clara&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=139&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=139&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;Canada&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Toronto&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=40&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=40&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;US&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;New York&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=140&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=140&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;England&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;London&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=9&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=9&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;France&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Paris&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=13&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=13&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;Belgium&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Brussels&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=25&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=25&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;Czech Republic&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Prague&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=25&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=25&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;Sweden&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Kista&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=22&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=22&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;Turkey&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Istanbul&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=22&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=22&amp;amp;userid=null#list&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;India&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Mumbai&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=22&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=22&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;India&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Bangalore&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=3&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=3&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;
&lt;p&gt;China&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="167"&gt;
&lt;p&gt;Beijing&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom" nowrap="nowrap" width="491"&gt;
&lt;p&gt;&lt;a href="https://applabs.msregistration.com/LabList.aspx?drop=11&amp;amp;userid=null#list"&gt;https://applabs.msregistration.com/LabList.aspx?drop=11&amp;amp;userid=null#list&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="bottom" nowrap="nowrap" width="101"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10388345" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="Windows 8" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+8/" /><category term="XAML" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/XAML/" /><category term="Windows" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows/" /><category term="Windows Store" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Windows+Store/" /><category term="Robert Evans" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Robert+Evans/" /></entry><entry><title>Debugging STL containers using WinDbg</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2013/01/15/debugging-stl-containers-using-windbg.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2013/01/15/debugging-stl-containers-using-windbg.aspx</id><published>2013-01-15T05:02:02Z</published><updated>2013-01-15T05:02:02Z</updated><content type="html">&lt;p&gt;My good friend and colleague, &lt;strong&gt;Ambrose Wong&lt;/strong&gt;, is a Principal PFE in Hong Kong. He has been debugging and troubleshooting production issues for over a decade now. More importantly, he mentors our customers to be their own hero and debug issues on their own.&lt;/p&gt;  &lt;p&gt;One of the conversations we have with customers who are using WinDbg for the first time is obvious comparisons with Visual Studio, and how easy it is to ‘Watch’ things in VS.NET. The expression evaluation (a.k.a. Watch) capability in VS.NET is very easy to use, but what if you have to do that with WinDbg in a production environment? &lt;/p&gt;  &lt;p&gt;While it may be easy to dump scalar values, how about when you are dealing with STL vector classes, such as vector&amp;lt;&amp;gt;? It may not be very apparent how to do that in WinDbg. Ambrose has started a series on how YOU can do that yourself – read the &lt;a href="http://blogs.msdn.com/b/ambrosew/archive/2013/01/14/debugging-stl-containers-with-windbg-prolog.aspx" target="_blank"&gt;introduction&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/b/ambrosew/archive/2013/01/15/debugging-stl-containers-with-windbg-part-1-vector.aspx" target="_blank"&gt;part 1&lt;/a&gt; of his series. &lt;strong&gt;Highly recommended &lt;/strong&gt;for WinDbg buffs!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;BTW, if you have never heard about the Standard Template Library – STL – you can hear Stephan Lavavej (Mr. STL himself &lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/0724.wlEmoticon_2D00_smile_5F00_3ECEB828.png" /&gt;) introduce it &lt;/em&gt;&lt;a href="http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Introduction-to-STL-with-Stephan-T-Lavavej" target="_blank"&gt;&lt;em&gt;here&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt; &lt;em&gt;   &lt;hr /&gt;&lt;/em&gt;  &lt;p&gt;&lt;em&gt;Posted by Arvind Shyamsundar, MSPFE Editor&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10385010" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="debugging" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/debugging/" /><category term="WinDbg" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/WinDbg/" /><category term="C++" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/C_2B002B00_/" /></entry><entry><title>SQL Server Upgrade Advisor: Considerations when upgrading from SQL 2000 to SQL 2012</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2012/12/06/sql-server-upgrade-advisor-considerations-when-upgrading-from-sql-2000-to-sql-2012.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2012/12/06/sql-server-upgrade-advisor-considerations-when-upgrading-from-sql-2000-to-sql-2012.aspx</id><published>2012-12-06T02:29:00Z</published><updated>2012-12-06T02:29:00Z</updated><content type="html">&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This article was contributed by &lt;a href="http://social.msdn.microsoft.com/profile/tonyogrady/"&gt;Tony O&amp;rsquo;Grady&lt;/a&gt;, a Premier Field Engineer from the UK.&lt;/em&gt;&lt;/p&gt;
&amp;nbsp;&lt;hr /&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Are you currently running old SQL Server 2000 instances in your estate? &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Are you planning to upgrade these to SQL Server 2012? &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;A direct upgrade from SQL 2000 to SQL 2012 is not supported, so chances are you&amp;rsquo;ll need to go via an intermediate version. Identifying issues we may need to fix - either before or after the upgrade - is one of the challenges with this technique. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong style="mso-bidi-font-weight: normal;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;SQL Server Upgrade Advisor:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;To prepare for upgrades, Microsoft provides a tool called the &lt;/span&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms144256(v=sql.100).aspx"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="color: #0000ff;"&gt;SQL Server Upgrade Advisor&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;. This tool analyses a SQL Server and creates a report which identifies issues we may need to fix when upgrading to a later version. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;The Upgrade Advisor can be used for supported upgrade scenarios:&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 45pt; text-indent: -18pt; mso-list: l1 level1 lfo2;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-fareast-font-family: symbol; mso-bidi-font-family: symbol;" lang="EN-GB"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-family: Symbol;"&gt;&amp;middot;&lt;/span&gt;&lt;span style="line-height: normal;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;The SQL Server 2012 version of the Upgrade Advisor can examine instances of SQL Server 2005, SQL Server 2008, and SQL Server 2008 R2. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 45pt; text-indent: -18pt; mso-list: l1 level1 lfo2;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-fareast-font-family: symbol; mso-bidi-font-family: symbol;" lang="EN-GB"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-family: Symbol;"&gt;&amp;middot;&lt;/span&gt;&lt;span style="line-height: normal;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;The older SQL Server 2008 R2 Upgrade Advisor can be used for older SQL 2000 instances.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Since a direct upgrade from SQL 2000 to 2012 is not a supported scenario, we cannot use the SQL 2012 Upgrade Advisor to examine SQL 2000 instances. This is explained in the &lt;/span&gt;&lt;a href="http://download.microsoft.com/download/9/5/3/9533501A-6F3E-4D03-A6A3-359AF6A79877/SQL_Server_2012_Upgrade_Technical_Reference_Guide_White_Paper.pdf"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="color: #0000ff;"&gt;SQL Server 2012 Upgrade Technical Reference Guide&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt; which offers the following guidance on Upgrading SQL Server 2000 to SQL Server&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;2012:&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="vertical-align: middle; margin: 0cm 0cm 0pt 27pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-fareast-font-family: symbol; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: symbol;" lang="EN-GB"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;middot;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: normal;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;You cannot upgrade a SQL Server 2000 instance or database to SQL Server 2012. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="vertical-align: middle; margin: 0cm 0cm 0pt 27pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;&lt;span style="mso-ansi-language: en-us; mso-fareast-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: symbol;" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;middot;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: normal;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;For a side-by-side upgrade, first restore the SQL Server 2000 databases to SQL Server 2005, 2008, or 2008 R2, and then restore the resulting database to SQL Server 2012.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong style="mso-bidi-font-weight: normal;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Do we need to run multiple versions of the Upgrade Advisor?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Is it really necessary to run both versions of the Upgrade Advisor, or will it be sufficient to run the 2012 Upgrade Advisor to identify all potential issues?&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;To answer this question we have to consider whether the SQL Server 2012 upgrade Advisor will identify&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms144262(v=sql.90).aspx"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;&lt;span style="color: #0000ff;"&gt;SQL 2000 features discontinued in SQL 2005&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;One example of such a feature is the non-ANSI outer join operator &amp;ldquo;*=&amp;rdquo; which is only supported on SQL Server 2005 when the database is running in the older SQL Server 2000 (80) compatibility mode. For forward compatibility, it should be replaced with &amp;ldquo;LEFT OUTER JOIN&amp;rdquo; syntax. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;Using this as an example on&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt; a development SQL Server 2005 instance, we created a test stored procedure which uses the &lt;span style="mso-bidi-font-weight: bold;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&amp;ldquo;*=&amp;rdquo; &lt;/span&gt;join operator. We then evaluated the instance with both the SQL 2008 R2 and SQL 2012 Upgrade Advisor tools. A summary of this test is presented below.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong style="mso-bidi-font-weight: normal;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Creating our test scenario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;On a development instance of SQL Server 2005 we created a test database called TestComp and set the &lt;em style="mso-bidi-font-style: normal;"&gt;compatibility&lt;/em&gt; of the database to 80. Setting the compatibility of the database to 80 ensured that the non-ANSI outer join operator &amp;ldquo;*=&amp;rdquo;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;would execute successfully. To facilitate testing, we also imported in a couple of tables from the AdventureWorks database.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt; text-indent: 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;CREATE DATABASE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="font-size: 9pt;"&gt;[TESTComp] &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;EXECUTE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="font-size: 9pt;"&gt;dbo.sp_dbcmptlevel @dbname=N'TESTComp', @new_cmptlevel=80&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Next, we created a stored procedure called &lt;/span&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt;"&gt;testJoin&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt; that used the deprecated &amp;ldquo;*=&amp;rdquo; join operator&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="color: #1f497d;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: 10pt;"&gt;Create&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;PROCEDURE &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[dbo]&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[testJoin]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;AS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 54pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: 10pt;"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt; color: #808080;"&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 54pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: 10pt;"&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp; Employee &lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;LEFT&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;OUTER&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt; color: #808080;"&gt;JOIN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 81pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;EmployeeAddress &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Employee&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;EmployeeID &lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; EmployeeAddress&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;EmployeeID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 54pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: 10pt;"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt; color: #808080;"&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 54pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: 10pt;"&gt;FROM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp; Employee&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt; EmployeeAddress &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 54pt;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="font-size: 10pt;"&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt; Employee&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;EmployeeID &lt;/span&gt;&lt;span style="background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%; mso-highlight: yellow;"&gt;&lt;span style="background-color: #ffff00; color: #808080;"&gt;*=&lt;/span&gt;&lt;/span&gt;&lt;span&gt; EmployeeAddress&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;EmployeeID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;Since the database compatibility mode was set to &lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;80,&lt;/span&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt; the stored procedure executed successfully:&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;EXECUTE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[dbo]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[testJoin]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 8pt;"&gt;(290 row(s) affected)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 8pt;"&gt;(290 row(s) affected)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&lt;span style="font-size: 12pt;"&gt;SQL Server 2008 Upgrade Advisor results&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;"&gt;&lt;span style="font-size: 12pt;"&gt;We then ran the SQL Server 2008 R2 Upgrade Advisor against the &lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;&lt;span style="font-size: 12pt;"&gt;TESTComp database, and looked at the results:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/2248.image_5F00_3E126BB7.png"&gt;&lt;img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="SQL Server 2008 R2 Upgrade Advisor results" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/0184.image_5F00_thumb_5F00_02062A02.png" alt="SQL Server 2008 R2 Upgrade Advisor results" width="477" height="306" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;As we can see, the report highlights the use of the outer join operator&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt; &amp;ldquo;*=&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong style="mso-bidi-font-weight: normal;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;SQL Server 2012 Upgrade Advisor results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri; mso-bidi-font-weight: bold;" lang="EN-GB"&gt;&lt;span style="font-size: 12pt;"&gt;We tried the SQL 2012 Upgrade Advisor against the same TESTComp database, and got the following error:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;strong&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/8105.image_5F00_3F46DEC9.png"&gt;&lt;img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="SQL Server 2012 Upgrade Advisor results (compatibility = 80 error)" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/0268.image_5F00_thumb_5F00_12517BEE.png" alt="SQL Server 2012 Upgrade Advisor results (error)" width="403" height="88" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;The SQL 2012 Upgrade Advisor requires the database to be at a compatibility level of 90 or greater. Since this was a test database on my laptop, we went ahead and changed the compatibility level:&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;EXECUTE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt; dbo.sp_dbcmptlevel @dbname=N'TESTComp', @new_cmptlevel=90&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 10pt; color: #0000ff;"&gt;EXECUTE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[dbo]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[testJoin]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 8pt; color: #ff0000;"&gt;Msg 4147, Level 15, State 1, Procedure testAnsci, Line 12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 8pt; color: #ff0000;"&gt;The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="font-size: 8pt; color: #ff0000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;Changing the compatibility level to 90 caused the execution of the &lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[dbo]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span&gt;&lt;span style="color: #808080;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 10pt;"&gt;[testJoin]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;stored procedure to fail. &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;This was expected, so we continued on and ran the 2012 Upgrade Advisor:&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/1830.image_5F00_7085A35C.png"&gt;&lt;img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="SQL Server 2012 Upgrade Advisor output" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-52-metablogapi/7115.image_5F00_thumb_5F00_5FBDF8AE.png" alt="SQL Server 2012 Upgrade Advisor output" width="519" height="287" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt 27pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;As you can see from the report above, the 2012 Upgrade Advisor did &lt;em&gt;not&lt;/em&gt; give a specific warning on the outer join operator&lt;/span&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt; &amp;ldquo;*=&amp;rdquo;. If you simply tried to upgrade the compatibility level and relied on the report alone, you might not have known that your database was no longer functioning correctly.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="mso-bidi-font-family: calibri;"&gt;Conclusion:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;The SQL Server 2012 Upgrade Advisor will analyse instances of SQL Server 2005, SQL Server 2008, and SQL Server 2008 R2 when the database is in a compatibility mode greater than 80. In our example above, we used a feature which is not supported when the compatibility level of the database is set to 90. The resulting report generated from the SQL 2012 Upgrade Advisor did not highlight this as something to fix, but this issue was clearly reported on the older SQL 2008 R2 Upgrade Advisor tool.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;So, when upgrading from SQL Server 2000 to 2012, consider using both the older 2008 R2 Upgrade Advisor and the new SQL 2012 Upgrade Advisor, as this will provide a more complete picture of issues you may need to fix. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;For additional information on upgrading to SQL 2012 see &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb677622.aspx%20and"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="color: #0000ff;"&gt;the MSDN library&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;and the &lt;/span&gt;&lt;a href="http://download.microsoft.com/download/9/5/3/9533501A-6F3E-4D03-A6A3-359AF6A79877/SQL_Server_2012_Upgrade_Technical_Reference_Guide_White_Paper.pdf"&gt;&lt;span style="mso-ansi-language: en-gb; mso-bidi-font-family: calibri;" lang="EN-GB"&gt;&lt;span style="color: #0000ff;"&gt;SQL Server 2012 Upgrade Technical Reference Guide&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Posted by &lt;/em&gt;&lt;a href="http://blogs.technet.com/b/tristank/"&gt;&lt;em&gt;Tristan &amp;ldquo;Mad King&amp;rdquo; Kington&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, MSPFE Editor. With fire.&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10375072" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="SQL Server 2012" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/SQL+Server+2012/" /><category term="Tony O'Grady" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/Tony+O_2700_Grady/" /><category term="SQL Server" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/SQL+Server/" /></entry><entry><title>Heap Corruption – a W3WP case study</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/mspfe/archive/2012/12/04/heap-corruption-a-w3wp-case-study.aspx" /><id>http://blogs.msdn.com/b/mspfe/archive/2012/12/04/heap-corruption-a-w3wp-case-study.aspx</id><published>2012-12-04T15:06:32Z</published><updated>2012-12-04T15:06:32Z</updated><content type="html">&lt;p&gt;&lt;em&gt;This blog post has been authored by &lt;a href="http://social.msdn.microsoft.com/Profile/Yawei Wang" target="_blank"&gt;Yawei Wang&lt;/a&gt;, a Premier Field Engineer with Microsoft Singapore. He describes a very common and important type of issue – heap corruption – and how you can successfully debug it using the Debugging Tools for Windows.&lt;/em&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;h2&gt;Background&lt;/h2&gt;  &lt;p&gt;Heap corruption is by nature a complicated issue to troubleshoot and in some cases luck is as important as debugging knowledge as well. It normally happened intermittently and we cannot reproduce it within a short time frame. The best way to understand how it works is through a real case analysis. Today we are going to unveil the secret a W3WP heap corruption case together.&lt;/p&gt;  &lt;h2&gt;Symptoms&lt;/h2&gt;  &lt;p&gt;The background is that a customer reported an intermittent crash of W3WP process on IIS server when the server was under heavy load. Sometimes it would respond with HTTP 500 (&lt;a href="http://support.microsoft.com/?id=318380" target="_blank"&gt;IIS 5.0 / 6.0&lt;/a&gt;, &lt;a href="http://support.microsoft.com/kb/943891" target="_blank"&gt;IIS 7.x&lt;/a&gt;) but sometimes the process was just terminated unexpectedly. It’s a generic second chance access violation (0xC0000005) exception (see &lt;a href="http://blogs.msdn.com/b/davidklinems/archive/2005/07/12/438061.aspx" target="_blank"&gt;What is a First Chance Exception?&lt;/a&gt;) and we were able to get the crash dump with DebugDiag.&lt;/p&gt;  &lt;h2&gt;Troubleshooting&lt;/h2&gt;  &lt;p&gt;From the dump, we can find the thread was crashed on CUSTOM_ERROR_TABLE::FindCustomError. FindCustomError finds the applicable custom error entry for a given status / subcode and return it back to client. Here is the call stack:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; knL       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;# ChildEBP RetAddr       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;00 06cee2cc 5a49fb48 w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x18       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;01 06cee428 5a42392b w3core!ISAPI_REQUEST::GetCustomError+0x8e&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;…&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;1b 06ceffb8 7c82482f msvcrt!_threadstartex+0x74       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;1c 06ceffec 00000000 kernel32!BaseThreadStart+0x34&lt;/font&gt; &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The calls stack was quite clean without any third-party components to suspect. It’s also very rare that the crash happened within IIS module and as you may not know w3core.dll is the core component in IIS 6 (same as iiscore.dll in IIS 7) there can’t be an issue in it as IIS 6 has been released for years and the number of calls to FindCustomError can be numerous. If there should be a issue, it wouldn’t survive for a minute. &lt;/p&gt;  &lt;p&gt;So, how did it happen? Let’s first take a look at the register status: ESI is null, which seems to be the direct culprit.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;eax=06ce0000 ebx=06ceedb4 ecx=017c4774 edx=000006e2 esi=00000000 edi=06ceedb4       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;eip=5a49fbd2 esp=06cee2c4 ebp=06cee2cc iopl=0 nv up ei ng nz ac po cy       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010293       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x18:       &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbd2 668b4608 mov ax,word ptr [esi+8] ds:0023:00000008=????&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;  &lt;p&gt;To understand why ESI was null we have to analyze the below assembly. We see the address stored in ECX was null which caused the C++ exception.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; u        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x18        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbd2 668b4608 mov ax,word ptr [esi+8] &lt;strong&gt;&amp;lt;======esi is null          &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbd6 663b4508 cmp ax,word ptr [ebp+8]        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbda 7404 je w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x22 (5a49fbe0)&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;        &lt;br /&gt;5a49fbdc 8b36 mov esi,dword ptr [esi]         &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbde ebea jmp w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x34 (5a49fbca)&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;        &lt;br /&gt;5a49fbe0 668b460a mov ax,word ptr [esi+0Ah]         &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbe4 663b450c cmp ax,word ptr [ebp+0Ch]        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbe8 0f841c780000 je w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x3f (5a4a740a)&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is the disassembly of the function &lt;font style="background-color: rgb(255, 255, 255);"&gt;w3core!CUSTOM_ERROR_TABLE::FindCustomError:&lt;/font&gt;&lt;/p&gt; &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbac 8bff mov edi,edi        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbae 55 push ebp        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbaf 8bec mov ebp,esp        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbb1 56 push esi        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbb2 57 push edi        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbb3 8b7d10 mov edi,dword ptr [ebp+10h]        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbb6 85ff test edi,edi        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbb8 0f8467fdffff je w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x59 5a49f925)        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbbe 837d1400 cmp dword ptr [ebp+14h],0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbc2 0f845dfdffff je w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x59 (5a49f925)        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbc8 8b31 mov esi,dword ptr [ecx&lt;strong&gt;]&amp;lt;=======poi(ecx) -&amp;gt; esi ; poi(ecx) = null          &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbca 3bf1 cmp esi,ecx        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;5a49fbcc 0f8448fdffff je w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x38 (5a49f91a)&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Why ECX was NULL? We know “this call” calling convention (used for calling C++ non-static member functions) will pass “this” pointer in ECX. As you see, The ‘dt’ command will show the structure name. Although the debugger says “this” is stored in EDX, it's wrong! It should be in ECX which is null.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; dt this &lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Local var @ edx Type CUSTOM_ERROR_TABLE*&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; dd poi(ecx) L1&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;01dc7540 00000000&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Then we dumped the CUSTOM_ERROR_ENTRY and would like to see why the object CUSTOM_ERROR_TABLE was null.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; !list &amp;quot;-t ntdll!_LIST_ENTRY.Flink -e -x /&amp;quot;dt w3core!CUSTOM_ERROR_ENTRY @$extret/&amp;quot; 017c4774&amp;quot;        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;dt w3core!CUSTOM_ERROR_ENTRY @$extret        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x000 _listEntry : _LIST_ENTRY [ 0x1dc7540 - 0x1d60620 ]        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x008 _StatusCode : 0xbda0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x00a _SubError : 0x1db        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x00c _strError : STRU        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x03c _fIsFile : 0n0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;dt w3core!CUSTOM_ERROR_ENTRY @$extret        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x000 _listEntry : _LIST_ENTRY [ 0x0 - 0x0 ]        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x008 _StatusCode : 0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x00a _SubError : 0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x00c _strError : STRU        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;+0x03c _fIsFile : 0n0&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; ? 0xbda0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Evaluate expression: 48544 = 0000bda0&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Obviously, the custom error list is completely corrupted so we can't get actual custom error 500.100 (Internal Server Error - ASP error).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; .frame 0&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;00 06cee2cc 5a49fb48 w3core!CUSTOM_ERROR_TABLE::FindCustomError+0x18 &lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; dv        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;this = 0x000006e2        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;StatusCode = 0x1f4&amp;lt;=====500        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;SubError = 0x64&amp;lt;======100        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;pfIsFile = 0x06ceedb4        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;pstrError = 0x06cee334&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;When we check the list entry address 0x1d60620, we can see that it belongs to heap 0x2b0000, which is the MSVCRT (C Runtime) heap.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:033&amp;gt; !address 0x1d60620        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Usage: Heap        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Allocation Base: 01d50000        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Base Address: 01d50000        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;End Address: 01e50000        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Region Size: 00100000        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Type: 00020000 MEM_PRIVATE        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;State: 00001000 MEM_COMMIT        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Protect: 00000004 PAGE_READWRITE        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;More info: heap containing the address: !heap 0x2b0000        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;More info: heap entry containing the address: !heap -x 0x1d60620        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Heap 3 - 0x002b0000        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Heap Name msvcrt!_crtheap        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Heap Description This heap is used by msvcrt        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Reserved memory 3.13 MBytes        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Committed memory 1.64 MBytes (52.38% of reserved)        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Uncommitted memory 1.49 MBytes (47.63% of reserved)        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Number of heap segments 3 segments        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Number of uncommitted ranges 1 range(s)        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Size of largest uncommitted range 1.43 MBytes        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Calculated heap fragmentation 3.94%&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;At the current stage, we believe that it is a typical heap corruption. While debugging heap corruption issues is not an easy task because the thread that caused the exception was not usually the thread that caused the corruption (FindCustomError is the victim in this case), we still can use the &lt;strong&gt;full PageHeap &lt;/strong&gt;feature to capture another round of IIS crash dump. &lt;/p&gt;  &lt;p&gt;With the assistance of &lt;a href="http://blogs.msdn.com/b/webdav_101/archive/2010/06/22/detecting-heap-corruption-using-gflags-and-dumps.aspx" target="_blank"&gt;pageheap.exe&lt;/a&gt;, we managed to capture another round of IIS crash dump and this time we found the culprit:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;FAILED_INSTRUCTION_ADDRESS:        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;safeagent+1ae10        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;1001ae10 ?? ???        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;SYMBOL_STACK_INDEX: 0        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;SYMBOL_NAME: safeagent!unloaded+1ae10        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;FOLLOWUP_NAME: wintriag        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;MODULE_NAME: safeagent&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;IMAGE_NAME: safeagent.dll&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;DEBUG_FLR_IMAGE_TIMESTAMP: 45f51b03&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;FAILURE_BUCKET_ID: BAD_INSTRUCTION_PTR_c0000005_safeagent.dll!unloaded&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;BUCKET_ID: APPLICATION_FAULT_BAD_INSTRUCTION_PTR_INVALID_POINTER_READ_BAD_IP_safeagent!unloaded+1ae10&lt;/font&gt;&lt;/p&gt;   &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;    &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;Followup: wintriag&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;font style="background-color: rgb(204, 204, 204);"&gt;&lt;/font&gt;  &lt;p&gt;The call stack was truncated, due to the module being unloaded:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;0:007&amp;gt; knL        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;# ChildEBP RetAddr        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;WARNING: Frame IP not in any known module. Following frames may be wrong.        &lt;br /&gt;&lt;/font&gt;&lt;font style="background-color: rgb(204, 204, 204);"&gt;00 088bc188 00000000 &amp;lt;Unloaded_safeagent.dll&amp;gt;+0x1ae10&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;In this case, we can conclude that the third party module (safeagent.dll) was involved in this issue. The next step was to contact the provider of this module for further investigation.&lt;/p&gt;  &lt;p&gt;   &lt;hr /&gt;&lt;em&gt;Edited and posted by &lt;/em&gt;&lt;a href="http://blogs.msdn.com/arvindsh" target="_blank"&gt;&lt;em&gt;Arvind Shyamsundar&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, MSPFE Editor&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10374481" width="1" height="1"&gt;</content><author><name>Premier Field Engineers</name><uri>http://blogs.msdn.com/mspfe_4000_hotmail.com/ProfileUrlRedirect.ashx</uri></author><category term="debugging" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/debugging/" /><category term="WinDbg" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/WinDbg/" /><category term="IIS" scheme="http://blogs.msdn.com/b/mspfe/archive/tags/IIS/" /></entry></feed>