<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>WinDbg</title>
        <link>http://blog.codemurai.de/category/WinDbg.aspx</link>
        <description>WinDbg</description>
        <language>de-DE</language>
        <copyright>André Krämer</copyright>
        <generator>Subtext Version 2.6.0.1</generator>
        <item>
            <title>Wie ziehe ich mir eigentlich einen Memory Dump meiner Anwendung</title>
            <link>http://blog.codemurai.de/archive/2010/04/12/wie-ziehe-ich-mir-eigentlich-einen-memory-dump-meiner-anwendung.aspx</link>
            <description>&lt;p&gt;Vor einiger Zeit habe ich ein kleines &lt;a href="http://blog.codemurai.de/2009/09/04/WinDbgTutorialFehlerursachenFindenTeil1EinerSerie.aspx" target="_blank"&gt;Einsteigertutorial zum Umgang mit WinDbg&lt;/a&gt; geschrieben. Etwas später folgte dann auch ein &lt;a href="http://blog.codemurai.de/2010/03/19/WinDbgVideotutorial.aspx" target="_blank"&gt;kurzes Video&lt;/a&gt; hierzu.&lt;/p&gt;  &lt;p&gt;Sowohl im Tutorial als auch im Video war eine Windows Forms Anwendung das Ziel meiner Debuggingaktivitäten. In einem kurzen Nebensatz erwähnte ich, dass die Zielanwendung bei der gezeigten Vorgehensweise, nämlich dem direkten Anhängen an den Prozess der Wahl, zumindest zeitweise blockiert wird. &lt;/p&gt;  &lt;p&gt;In einer Windows Forms Anwendung mag dies kein Problem sein, schließlich bin ich ja alleine auf dem System. Unschön wird es jedoch, wenn man Probleme in einer produktiven ASP.NET Anwendung sucht. Verständlicherweise reagieren hier nämlich die wenigsten Anwender erfreut, wenn die Website steht weil gerade jemand im Hintergrund daran herumfummelt. Außerdem ist es je nach IT Richtlinie auch problematisch den lokalen Administrator des Kundens davon zu überzeugen, dass man mal gerade physikalisch oder auch nur per Remote Desktop an seinen Webserver will.&lt;/p&gt;  &lt;h2&gt;Und nun?&lt;/h2&gt;  &lt;p&gt;Abhilfe schafft hier die VBScript Datei adplus.vbs innerhalb des WinDbg Verzeichnisses. Sie ermöglicht es, ein aktuelles Speicherabbild des problematischen Prozesses in Form einer *.DMP Datei zu erstellen. Diese kann wiederum in WinDbg geöffnet und analysiert werden.&lt;/p&gt;  &lt;p&gt;Adplus kann in zwei verschiedenen Modi genutzt werden: &lt;strong&gt;hang&lt;/strong&gt; und &lt;strong&gt;crash&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Im hang Modus wird einmalig ein aktueller Memory Dump des Prozesses zum Zeitpunkt der Ausführung des Scripts gezogen. Dieser Modus eignet sich besonders wenn die Applikation "hängt" ;-), also in Deadlock Szenarien, oder aber auch um Memory Leaks zu finden. Zur besseren Analyse sollten im Fall ein Memory Leaks jedoch mehrere Dumps bei verschieden hoher Speicherauslastung gezogen werden.&lt;/p&gt;  &lt;p&gt;Der Befehl zum Erzeugen eines Dumps im hang Modus lautet übrigens:&lt;/p&gt;  &lt;pre&gt;adplus.vbs -hang -p processId&lt;/pre&gt;

&lt;p&gt;Die Id des Prozesses kann entweder über den Taskmanager, oder aber im Fall einer ASP.NET Anwendung die in einem IIS 6 gehostet wird, über den Befehl IISAPP gefunden werden.&lt;/p&gt;

&lt;p&gt;Alternativ zum Parameter &lt;strong&gt;-p&lt;/strong&gt; kann über den Parameter &lt;strong&gt;-pn &lt;/strong&gt;auch ein Prozessname angegeben werden. Im Fall einer ASP.NET Anwendung wäre dies also W3WP.exe (Windows Server mit IIS) bzw. WebDev.WebServer.exe im Falle des lokalen Entwicklungsservers. Außerdem kann über den optionalen Parameter &lt;strong&gt;-o&lt;/strong&gt; auch ein dediziertes Ausgabeverzeichnis angegeben werden. Standardmäßig wird nämlich sonst ein Unterverzeichnis, unterhalb des Ordners aus dem adplus heraus aufgerufen wurde, angelegt.&lt;/p&gt;

&lt;p&gt;Innerhalb des Zielverzeichnisses wird nun eine Datei mit der Endung .DMP angelegt. Diese kann in WinDbg über den Menüpunkt &lt;em&gt;File -&amp;gt; Open Crash Dump&lt;/em&gt; ... geöffnet und mit den bereits &lt;a href="http://blog.codemurai.de/2009/09/04/WinDbgTutorialFehlerursachenFindenTeil1EinerSerie.aspx" target="_blank"&gt;bekannten Befehlen&lt;/a&gt; analysiert werden.&lt;/p&gt;

&lt;p&gt;Der zweite Modus neben &lt;strong&gt;hang&lt;/strong&gt; ist der Modus &lt;strong&gt;crash&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Der Aufruf erfolgt hier ähnlich zum hand Modus, mit dem einzigen Unterschied, dass statt &lt;strong&gt;-hang&lt;/strong&gt; &lt;strong&gt;-crash&lt;/strong&gt; übergeben wird.&lt;/p&gt;

&lt;pre&gt;adplus.vbs -crash -p processId&lt;/pre&gt;

&lt;p&gt;Im Crash Modus bleibt der Debugger so lange am entsprechenden Prozess angehangen, bis dieser unfreiwillig beendet wird. Tritt dieser Fall ein, wird ein Dump auf die Festplatte geschrieben. Außerdem werden Dumps geschrieben, wenn ein zuvor definierter Breakpoint erreicht wird, oder aber eine access violation Exception auftritt.&lt;/p&gt;

&lt;h2&gt;Fazit&lt;/h2&gt;

&lt;p&gt;Mit adplus liegt ein leichtgewichtiges Skript zur Hand, dass bei der Problemanalyse innerhalb produktiver Umgebungen enorm helfen kann. Gerade in Umgebungen, in denen das Live-System nicht durch Debugging blockiert werden darf, oder aber der Administrator keinen Zugriff auf das System gewährt, kann das Skript seine stärken Ausspielen.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:88dec9f8-aee2-438e-bfe5-59738edc47c3" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://blog.codemurai.de/tags/WinDbg/default.aspx" rel="tag"&gt;WinDbg&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blog.codemurai.de/aggbug/132.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>André Krämer</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/04/12/wie-ziehe-ich-mir-eigentlich-einen-memory-dump-meiner-anwendung.aspx</guid>
            <pubDate>Mon, 12 Apr 2010 23:07:04 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/04/12/wie-ziehe-ich-mir-eigentlich-einen-memory-dump-meiner-anwendung.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/132.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WinDbg Videotutorial</title>
            <link>http://blog.codemurai.de/archive/2010/03/19/windbg-videotutorial.aspx</link>
            <description>&lt;p&gt;Vor einiger Zeit habe ich ein kurzes Tutorial zur Bedienung der Windows Debugging Tools hier in &lt;a title="WinDbg Tutorial" href="http://blog.codemurai.de/2009/09/04/WinDbgTutorialFehlerursachenFindenTeil1EinerSerie.aspx" target="_blank"&gt;meinem Blog veröffentlicht&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Dieses Tutorial traf auf großen Anklang. Zumindest wenn ich meinen Statistiken trauen darf. Denn laut diesen kommen die meisten Besucher durch eine Google Suche nach WinDbg auf mein Blog.&lt;/p&gt;  &lt;p&gt;Um dieser Tatsache gerecht zu werden, habe ich mich dazu entschlossen das ursprüngliche Tutorial nun auch als Video bereit zu stellen. Ich hoffe damit auch Gregor zufrieden zu stellen, der meinte dass die geschriebene Variante doch etwas schwierig zu befolgen wäre ;-) &lt;/p&gt;  &lt;p&gt;&lt;object id="csSWF" height="498" width="640" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt;&lt;param name="_cx" value="16933" /&gt;&lt;param name="_cy" value="13176" /&gt;&lt;param name="FlashVars" value="" /&gt;&lt;param name="Movie" value="http://www.codementor.de/media/windbg/1/windbg1_controller.swf" /&gt;&lt;param name="Src" value="http://www.codementor.de/media/windbg/1/windbg1_controller.swf" /&gt;&lt;param name="WMode" value="Window" /&gt;&lt;param name="Play" value="0" /&gt;&lt;param name="Loop" value="-1" /&gt;&lt;param name="Quality" value="High" /&gt;&lt;param name="SAlign" value="" /&gt;&lt;param name="Menu" value="-1" /&gt;&lt;param name="Base" value="" /&gt;&lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="Scale" value="ShowAll" /&gt;&lt;param name="DeviceFont" value="0" /&gt;&lt;param name="EmbedMovie" value="0" /&gt;&lt;param name="BGColor" value="1A1A1A" /&gt;&lt;param name="SWRemote" value="" /&gt;&lt;param name="MovieData" value="" /&gt;&lt;param name="SeamlessTabbing" value="1" /&gt;&lt;param name="Profile" value="0" /&gt;&lt;param name="ProfileAddress" value="" /&gt;&lt;param name="ProfilePort" value="0" /&gt;&lt;param name="AllowNetworking" value="all" /&gt;&lt;param name="AllowFullScreen" value="true" /&gt;                                                                                                                                  &lt;!--[if !IE]&gt;--&gt;                 &lt;object type="application/x-shockwave-flash" data="http://www.codementor.de/media/windbg/1/windbg1_controller.swf" width="640" height="498"&gt;                     &lt;param name="quality" value="best" /&gt;                     &lt;param name="bgcolor" value="#1a1a1a" /&gt;                     &lt;param name="allowfullscreen" value="true" /&gt;                     &lt;param name="scale" value="showall" /&gt;                     &lt;param name="allowscriptaccess" value="always" /&gt;                     &lt;param name="flashvars" value="autostart=false&amp;amp;thumb=http://www.codementor.de/media/windbg/1/FirstFrame.png&amp;amp;thumbscale=45&amp;amp;color=0x000000,0x000000" /&gt;                 &lt;!--&lt;![endif]--&gt;                    &lt;div id="noUpdate"&gt;                         &lt;p&gt;The Camtasia Studio video content presented here requires a more recent version of the Adobe Flash Player. If you are you using a browser with JavaScript disabled please enable it now. Otherwise, please update your version of the free Flash Player by &lt;a href="http://www.adobe.com/go/getflashplayer"&gt;downloading here&lt;/a&gt;.&lt;/p&gt;                     &lt;/div&gt;                &lt;!--[if !IE]&gt;--&gt;                 &lt;/object&gt;                &lt;!--&lt;![endif]--&gt;            &lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Über Kommentare und Rückfragen würde ich mich sowohl hier auf meinem Blog, als auch unter der im Video angegebenen E-Mail Adresse sehr freuen.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:277a825b-7f48-4646-b2b4-45576a0373c6" class="wlWriterSmartContent"&gt;Tags: &lt;a href="http://blog.codemurai.de/tags/WinDbg/default.aspx" rel="tag"&gt;WinDbg&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/.NET/default.aspx" rel="tag"&gt;.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/Community/default.aspx" rel="tag"&gt;Community&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blog.codemurai.de/aggbug/138.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>André Krämer</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/03/19/windbg-videotutorial.aspx</guid>
            <pubDate>Fri, 19 Mar 2010 02:19:48 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/03/19/windbg-videotutorial.aspx#feedback</comments>
            <slash:comments>10</slash:comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/138.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WinDbg Tutorial: Fehlerursachen finden (Teil 1 einer Serie???)</title>
            <link>http://blog.codemurai.de/archive/2009/09/04/windbg-tutorial-fehlerursachen-finden-teil-1-einer-serie.aspx</link>
            <description>&lt;p&gt;In meinem &lt;a title="Meine Top Drei Entwicklertools" href="http://blog.codemurai.de/2009/06/04/MeineDreiTopEntwicklertools.aspx" target="_blank"&gt;Beitrag&lt;/a&gt; zur &lt;a title="MSDN Blogparade" href="http://blogs.msdn.com/softwarehersteller/archive/2009/05/06/msdn-blog-parade-was-sind-ihre-lieblings-entwickler-tools-mitmachen-und-gewinnen.aspx" target="_blank"&gt;MSDN Blogparade&lt;/a&gt; zum Thema Entwicklungstools zählte ich &lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx" target="_blank"&gt;WinDbg&lt;/a&gt; als einen meiner Favoriten auf. In einem Nebensatz erwähnte ich, dass ich bei Interesse gerne ein kleines Tutorial zu diesem Werkzeug schreiben könnte. Die Anzahl der Rückmeldungen auf diesen Beitrag führten zu zwei Schlussfolgerungen:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Mein Blog lesen mehr Leute als ich dachte, und nicht wie vorher vermutet nur meine Frau und meine Mutter.  &lt;li&gt;Das Interesse an einem Tutorial ist definitiv vorhanden. Also werde ich mein Versprechen einhalten und ein kleines Tutorial schreiben.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Sicherlich stellt sich nun die Frage, warum überhaupt so lange gedauert hat, das Tutorial zu verfassen!&lt;/p&gt; &lt;p&gt;Nun, das liegt zum einen daran, dass ich zur Zeit nicht in Köln, sondern in Bonn arbeite. Somit verbringe ich viel weniger Zeit im Zug und habe somit auch viel weniger Zeit zum bloggen. Zum anderen liegt es daran, dass ich die knappe Zeit im Zug nicht zum schreiben, sondern zum Ansehen von &lt;a href="http://blog.wekeroad.com/mvc-storefront/" target="_blank"&gt;Rob Conneries StoreFront&lt;/a&gt; Webcasts genutzt habe. An dieser Stelle möchte ich mich als absoluter Fan der Serie bekennen. Wer sich die Webcasts noch nicht angesehen hat, sollte dies unbedingt nachholen! Dann kam auch noch der Urlaub hinzu, so dass dieser Eintrag einfach ein wenig warten musste.&lt;/p&gt; &lt;p&gt;Jetzt aber zurück zum eigentlichen Thema!&lt;/p&gt; &lt;h3&gt;WinDbg - Was ist das überhaupt?&lt;/h3&gt; &lt;p&gt;Wie in meinem vorherigen Blog Post geschrieben, ist WinDbg ein unmanaged (native) Debugger mit grafischer Benutzeroberfläche. Dank der SOS Erweiterung kann man ihn jedoch wunderbar dazu verwenden, auch managed Code zu debuggen. WinDbg benötigt &lt;em&gt;eigentlich&lt;/em&gt; keinerlei Installation auf dem zu debuggenden System und kann somit wunderbar als Geheimwaffe auf einem &lt;strike&gt;Schweizer Taschenmesser&lt;/strike&gt; USB Stick mitgeführt werden.&lt;/p&gt; &lt;h3&gt;Wo bekommt man ihn her und was muss bei der Installation beachtet werden?&lt;/h3&gt; &lt;p&gt;Herunterladen kann man WinDbg in Form eines MSI Paketes auf der &lt;a title="WinDBG Download Seite" href="http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx" target="_blank"&gt;Download Seite&lt;/a&gt; der Microsoft Debugging Tools for Windows. Die Installation an sich verläuft recht geradlinig (Next -&amp;gt; Next -&amp;gt; I Agree -&amp;gt; Next -&amp;gt; Finish ;-)). Sind die Debugging Tools installiert, kann der komplette Inhalt des Verzeichnisses wie bereits erwähnt auf einen Stick kopiert werden und wäre auch von dort aus lauffähig.&lt;/p&gt; &lt;p&gt;Bevor WinDbg nun wirklich genutzt werden kann, ist jedoch noch eine kleine Vorarbeit - nämlich die Definition des Symbol-Pfads - notwendig. Andernfalls meldet WinDbg während der Debugging Aktivitäten stets, dass er keine Symbole (PDB-Dateien) findet, was die Übersichtlichkeit ein wenig leiden lässt.&lt;/p&gt; &lt;p&gt;Zur Angabe des Symbol Pfads legt man nun zunächst ein Verzeichnis auf seiner Festplatte/Stick an, zum Beispiel &lt;font face="Courier New"&gt;c:\symbols&lt;/font&gt;. Anschließend startet man WinDbg und wählt im Menü &lt;font face="Courier New"&gt;File&lt;/font&gt; den Eintrag &lt;font face="Courier New"&gt;Symbol File Path ...&lt;/font&gt; aus. Im sich anschließend öffnenden Dialog gibt man über folgenden Befehl an, dass man die Symbole gerne von Microsoft herunter laden und auf der Festplatte im Verzeichnis &lt;font face="Courier New"&gt;c:\symbols&lt;/font&gt;&amp;nbsp; speichern würde:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;SRV*c:\symbols*&lt;/font&gt;&lt;a href="http://msdl.microsoft.com/download/symbols"&gt;&lt;font face="Courier New"&gt;http://msdl.microsoft.com/download/symbols&lt;/font&gt;&lt;/a&gt;  &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Genug der Vorarbeit. Los gehts!&lt;/h3&gt; &lt;p&gt;Jetzt, nachdem WinDbg korrekt installiert und konfiguriert ist, möchte ich anhand eines kleinen Beispiels die Funktionsweise zeigen. Source Code sowie die kompilierte Version gibt es übrigens bald auf meiner Hompage zum Download.  &lt;p&gt;Die Applikation um die es sich handelt ist eine kleine Windows Anwendung, die nur aus einem Login Dialog besteht. Gibt der Anwender die korrekten Zugangsdaten ein, erhält er Bestätigungsmeldung:  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/WinDbgTutorialFehlerursachenfindenTeil1e_EACB/windbg1.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="182" alt="windbg1" src="/images/localhost/windbg1_thumb.png" width="244" border="0"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;p&gt;Sind die Benutzerdaten falsch, kommt eine Fehlermeldung:  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/WinDbgTutorialFehlerursachenfindenTeil1e_EACB/windbg2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="windbg2" src="/images/localhost/windbg2_thumb.png" width="244" border="0"&gt;&lt;/a&gt;  &lt;p&gt;Das ganze läuft seit einer ganzen Weile recht gut beim Kunden im produktiven Einsatz. Seit kurzem ist jedoch kein Login mehr möglich. Der Kunde meldet, dass trotz 100%ig richtiger Zugangsdaten stets die Meldung "Ungültige Benutzername / Passwort Kombination" Meldung kommt. Eine Log Datei wird leider nicht erstellt, so dass die Ursache des Fehlers derzeit vollkommen offen ist. Ein Blick auf den Quellocde zeigt folgende Zeilen innerhalb des Login-Formulars  &lt;p&gt;&lt;font face="Courier New" size="2"&gt;private void LoginButton_Click(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserService service = new UserService();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; service.ValidateUser(UserNameTextBox.Text, PasswordTextBox.Text);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Login erfolgreich");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Ungültige Benutzername / Passwort Kombination");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;  &lt;p&gt;Wie man sieht, wird hier Logik über Exceptions gesteuert. Nicht schön, aber vorerst leider nicht zu ändern. Da der Code im Falle &lt;strong&gt;irgendeiner&lt;/strong&gt; Exception die Meldung "&lt;em&gt;Ungültige Benutzername / Passwort Kombination&lt;/em&gt;" bringt, liegt die Vermutung nahe, dass irgendein Fehler innerhalb der Methode ValidateUser auftritt, der zu einer Exception führt. Die Frage ist nur: Welche Exception und warum tritt diese überhaupt auf?  &lt;p&gt;Die Ursache des Problems wäre mit einer kleinen Quellcodeänderung schnell gefunden. Eine schnelle Lösung ist zwar genau das, was unser Kunde braucht, jedoch möchte er uns weder zum Debuggen in sein Netzwerk, noch auf Gut Glück neue Versionsstände mit erweiterten Log Nachrichten einspielen lassen. Allerdings willigt er ein, dass wir mit einem USB Stick bewaffnet an einen der betroffenen PCs dürfen. Voraussetzung jedoch ist, dass wir keine Software installieren.  &lt;h3&gt;Showtime&lt;/h3&gt; &lt;p&gt;Die beschriebene Situation ist ein typisches Einsatzszenario für WinDbg.&lt;/p&gt; &lt;p&gt;Wir starten also WinDbg von unserem USB Stick und wählen das Menü &lt;em&gt;File&lt;/em&gt;-&amp;gt;&lt;em&gt;Attach to a process.&lt;/em&gt; Anschließend wählen wir unsere fehlerhafte Applikation aus der Prozessliste aus und drücken OK. WinDbg sollte nun ungefähr so aussehen:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/WinDbgTutorialFehlerursachenfindenTeil1e_EACB/windbg3.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="149" alt="windbg3" src="/images/localhost/windbg3_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Als nächstes geben wir folgende Kommandos in die Eingabezeile ein:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;sxe clr&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;.loadby sos mscorwks&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Falls nun keine Fehlermeldung kommt, haben wir alles richtig gemacht ;-)&lt;/p&gt; &lt;p&gt;sxe clr sagt dem Debugger, dass er bei jeder CLR Exception anhalten soll. Der Befehl ".loadby sos mscorwks" dient dazu, die SOS Extension zu laden. Diese DLL ermöglicht die Untersuchung von Managed Code innerhalb von WinDbg, der ja eigentlich ein Debugger für unmanaged Code ist. Für jede Version der CLR gibt es eine eigene SOS.DLL. Um nun die zum Framework der fehlerhaften Anwendung passende SOS.DLL zu laden, kann man entweder den vollständigen Pfad angeben, oder man lädt die Extension einfach aus dem Pfad, aus dem auch die mscorwks geladen wurden. Die Datei mscorwks gehört zum .NET Framework.&lt;/p&gt; &lt;p&gt;Derzeit befindet sich das Programm immer noch im Haltemodus. Über die Eingabe von g (für Go) bzw. drücken von F5 können wir die Ausführung fortführen. &lt;/p&gt; &lt;p&gt;Als nächstes Klicken wir in unserer fehlerhaften Applikation erneut auf den Button Login, um den Fehler zu provozieren. Ein Wechsel zu WinDbg zeigt, dass die Ausführung aufgrund der Exception angehalten wurde. Außerdem werden folgende Zeilen ausgegeben:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;(1144.1380): CLR exception - code e0434f4d (first chance)&lt;br&gt;First chance exceptions are reported before any exception handling.&lt;br&gt;This exception may be expected and handled.&lt;br&gt;eax=0012ecf0 ebx=e0434f4d ecx=00000000 edx=00000028 esi=0012ed7c edi=0015b718&lt;br&gt;eip=7c812a6b esp=0012ecec ebp=0012ed40 iopl=0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nv up ei pl nz na po nc&lt;br&gt;cs=001b&amp;nbsp; ss=0023&amp;nbsp; ds=0023&amp;nbsp; es=0023&amp;nbsp; fs=003b&amp;nbsp; gs=0000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; efl=00000202&lt;br&gt;*** ERROR: Symbol file could not be found.&amp;nbsp; Defaulted to export symbols for C:\WINDOWS\system32\KERNEL32.dll - &lt;br&gt;KERNEL32!RaiseException+0x52:&lt;br&gt;7c812a6b 5e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esi&lt;/font&gt;  &lt;p&gt;Wir sehen also, dass eine CLR Exception aufgetreten ist. Leider sagt die aktuelle Ausgabe noch relativ wenig über die Ursache aus. Wie kommen wir also an die Details?&lt;/p&gt; &lt;p&gt;Dazu gibt es prinzipiell zwei Möglichkeiten.&lt;/p&gt; &lt;p&gt;Variante 1 ist, über den Befehl&lt;/p&gt; &lt;p&gt;&lt;font face="courier "&gt;!DumpStackObjects&lt;/font&gt; (oder kurz &lt;font face="courier "&gt;!dso&lt;/font&gt;) eine Liste aller Objekte, die aktuell auf dem Stack verwiesen werden, abzurufen.&lt;/p&gt; &lt;p&gt;Das Ergebnis sieht in meinem Beispiel wie folgt aus:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;0:000&amp;gt; &lt;strong&gt;!dso&lt;br&gt;&lt;/strong&gt;*** ERROR: Symbol file could not be found.&amp;nbsp; Defaulted to export symbols for c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll - &lt;br&gt;PDB symbol for mscorwks.dll not loaded&lt;br&gt;OS Thread Id: 0x1380 (0)&lt;br&gt;ESP/REG&amp;nbsp; Object&amp;nbsp;&amp;nbsp; Name&lt;br&gt;0012ed5c &lt;strong&gt;&lt;font color="#ff0000"&gt;014c8974 System.Data.SqlServerCe.SqlCeException&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;0012eda8 014c8974 System.Data.SqlServerCe.SqlCeException&lt;br&gt;0012edec 014c8974 System.Data.SqlServerCe.SqlCeException&lt;br&gt;0012edf8 014c8974 System.Data.SqlServerCe.SqlCeException&lt;br&gt;0012ee20 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ee24 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ee50 014c8974 System.Data.SqlServerCe.SqlCeException&lt;br&gt;0012ee7c 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef00 014bf388 System.Windows.Forms.MouseEventArgs&lt;br&gt;0012ef04 014c0430 Codemurai.Tutorial.WinDbg.ExceptionHunting.UserService&lt;br&gt;0012ef08 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef14 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef18 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef2c 014b075c System.Object[]&amp;nbsp;&amp;nbsp;&amp;nbsp; (System.Object[])&lt;br&gt;0012ef30 014bf388 System.Windows.Forms.MouseEventArgs&lt;br&gt;0012ef34 014c0430 Codemurai.Tutorial.WinDbg.ExceptionHunting.UserService&lt;br&gt;0012ef50 014c048c System.Text.StringBuilder&lt;br&gt;0012ef5c 014c04a0 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; test&lt;br&gt;0012ef60 014a6e80 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; Data Source=CodemuraiDb2.sdf&lt;br&gt;0012ef64 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef68 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef6c 014a6b78 System.Configuration.ConnectionStringSettings&lt;br&gt;0012ef70 014a5f8c System.Configuration.ConnectionStringSettingsCollection&lt;br&gt;0012ef80 014c04d8 System.Data.SqlServerCe.SqlCeConnection&lt;br&gt;0012ef84 014a6b78 System.Configuration.ConnectionStringSettings&lt;br&gt;0012ef88 014a5f8c System.Configuration.ConnectionStringSettingsCollection&lt;br&gt;0012ef8c 014c045c System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; wilhelm&lt;br&gt;0012ef98 014c0430 Codemurai.Tutorial.WinDbg.ExceptionHunting.UserService&lt;br&gt;0012efb0 014bf388 System.Windows.Forms.MouseEventArgs&lt;br&gt;0012efb4 013c8b28 System.EventHandler&lt;br&gt;0012efb8 013c6a04 System.Windows.Forms.Button&lt;br&gt;0012efc4 014c04a0 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; test&lt;br&gt;0012efc8 014c04a0 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; test&lt;br&gt;0012efcc 014c045c System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; wilhelm&lt;br&gt;0012efd0 014c0430 Codemurai.Tutorial.WinDbg.ExceptionHunting.UserService&lt;br&gt;0012efd4 014c0430 Codemurai.Tutorial.WinDbg.ExceptionHunting.UserService&lt;br&gt;0012efd8 014c0430 Codemurai.Tutorial.WinDbg.ExceptionHunting.UserService&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;...&lt;/font&gt;  &lt;p&gt;Wir sehen, dass ganz oben auf dem Stack eine SqlCeException liegt. Diese ist unter der Adresse &lt;strong&gt;014c8974 &lt;/strong&gt;auf dem Heap abgelegt. Details eines Objekts kann man sich über &lt;font face="Courier New"&gt;!DumpObj&lt;/font&gt; bzw. &lt;font face="Courier New"&gt;!do&lt;/font&gt; ansehen.  &lt;p&gt;&lt;font face="Courier New"&gt;0:000&amp;gt; &lt;strong&gt;!do 014c8974&lt;/strong&gt; &lt;br&gt;Name: System.Data.SqlServerCe.SqlCeException&lt;br&gt;MethodTable: 07d8255c&lt;br&gt;EEClass: 07d04f14&lt;br&gt;Size: 76(0x4c) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_MSIL\System.Data.SqlServerCe\3.5.1.0__89845dcd8080cc91\System.Data.SqlServerCe.dll)&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;79330a00&amp;nbsp; 40000b5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _className&lt;br&gt;7932fe74&amp;nbsp; 40000b6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 ...ection.MethodBase&amp;nbsp; 0 instance 00000000 _exceptionMethod&lt;br&gt;79330a00&amp;nbsp; 40000b7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _exceptionMethodString&lt;br&gt;79330a00&amp;nbsp; 40000b8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 &lt;strong&gt;&lt;font color="#ff0000"&gt;instance 014c8e0c _message&lt;/font&gt;&lt;/strong&gt;&lt;br&gt;7932a35c&amp;nbsp; 40000b9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14 ...tions.IDictionary&amp;nbsp; 0 instance 00000000 _data&lt;br&gt;79330b94&amp;nbsp; 40000ba&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Exception&amp;nbsp; 0 instance 00000000 _innerException&lt;br&gt;79330a00&amp;nbsp; 40000bb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _helpURL&lt;br&gt;7933061c&amp;nbsp; 40000bc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 00000000 _stackTrace&lt;br&gt;79330a00&amp;nbsp; 40000bd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _stackTraceString&lt;br&gt;79330a00&amp;nbsp; 40000be&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _remoteStackTraceString&lt;br&gt;79332c4c&amp;nbsp; 40000bf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 _remoteStackIndex&lt;br&gt;7933061c&amp;nbsp; 40000c0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 00000000 _dynamicMethods&lt;br&gt;79332c4c&amp;nbsp; 40000c1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 38&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance -2146233087 _HResult&lt;br&gt;79330a00&amp;nbsp; 40000c2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _source&lt;br&gt;793332c8&amp;nbsp; 40000c3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 _xptrs&lt;br&gt;79332c4c&amp;nbsp; 40000c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance -532459699 _xcode&lt;br&gt;07d82660&amp;nbsp; 400032a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 44 ...CeErrorCollection&amp;nbsp; 0 instance 014c8784 errors&lt;/font&gt;  &lt;p&gt;In den Informationen über unser Exception Objekt sehen wir nun, dass es ein Feld _message gibt, dessen Inhalt sich an der Adresse 014c8e0c befindet. An die Details des Felds _message kommen wir wieder über den Befehl &lt;font face="Courier New"&gt;!do&lt;/font&gt;.  &lt;p&gt;&lt;font face="Courier New"&gt;0:000&amp;gt; &lt;strong&gt;!do 014c8e0c&lt;/strong&gt; &lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 79330a00&lt;br&gt;EEClass: 790ed64c&lt;br&gt;Size: 282(0x11a) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;String: The database file cannot be found. Check the path to the database. [ Data Source = CodemuraiDb2.sdf ]&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;79332c4c&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 133 m_arrayLength&lt;br&gt;79332c4c&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 101 m_stringLength&lt;br&gt;793316e0&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 54 m_firstChar&lt;br&gt;79330a00&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 00163700:013a1198 &amp;lt;&amp;lt;&lt;br&gt;79331630&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 00163700:013a18ec &amp;lt;&amp;lt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="trech"&gt;Prima, diese Aussage hat doch gleich eine ganz andere Qualität. Benutzername/Passwort waren wirklich nicht falsch. Einzig die geschluckte Exception sorgte für den Eindruck. Statt dessen konnte die DB nicht gefunden werden. Ein kurzer Blick die App.Config zeigt folgenden Eintrag:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;lt;connectionStrings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="CodemuraiDb" connectionString="Data Source=&lt;strong&gt;CodemuraiDb2.sdf&lt;/strong&gt;"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; providerName="Microsoft.SqlServerCe.Client.3.5" /&amp;gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Die DB selbst heißt im Dateisystem jedoch: CodemuraiDb.sdf.&lt;/p&gt; &lt;p&gt;Einen kurzen Eintrag in der Datei Codemurai.Tutorial.WinDbg.ExceptionHunting.exe.config später läuft das Programm wieder wie gewünscht.&lt;/p&gt; &lt;h3&gt;&lt;font face="trech"&gt;Geht das auch schneller?&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font face="trech"&gt;Selbstverständlich. Sobald unser Code wegen einer Exception steht hätten wir statt !dso und mindestens Zwei mal !do auch einfach !&lt;strong&gt;PrintException&lt;/strong&gt;, oder kurz &lt;strong&gt;!pe&lt;/strong&gt; eingeben können.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;0:000&amp;gt; &lt;strong&gt;!pe&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;Exception object: 014c8974&lt;/strong&gt;&lt;br&gt;Exception type: System.Data.SqlServerCe.SqlCeException&lt;br&gt;Message: The database file cannot be found. Check the path to the database. [ Data Source = CodemuraiDb2.sdf ]&lt;br&gt;InnerException: &amp;lt;none&amp;gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;lt;none&amp;gt;&lt;br&gt;StackTraceString: &amp;lt;none&amp;gt;&lt;br&gt;HResult: 80131501&lt;/font&gt;  &lt;p&gt;Aber das kann ja jeder ;-) Außerdem haben wir über den anderen Weg direkt noch ein paar Debugging Tipps gelernt.&lt;/p&gt; &lt;h3&gt;Zusammenfassung&lt;/h3&gt; &lt;p&gt;In diesem Eintrag wurden folgende Befehle besprochen.&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="90%" border="1"&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Befehl&lt;/th&gt; &lt;th&gt;Bedeutung&lt;/th&gt;&lt;/tr&gt; &lt;thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;sxe clr&lt;/td&gt; &lt;td valign="top"&gt;Bei jeder CLR Exception anhalten&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;&lt;font face="Courier New"&gt;.loadby sos mscorwks&lt;/font&gt;&lt;/td&gt; &lt;td valign="top"&gt;SOS Extension passend zur .NET Framework Version laden&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;g&lt;/td&gt; &lt;td valign="top"&gt;Ausführung fortführen&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;&lt;font face="courier "&gt;!DumpStackObjects&lt;/font&gt; / !dso&lt;/td&gt; &lt;td valign="top"&gt;Auflistung aller Objekte, die auf dem Stack verwiesen werden&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;&lt;font face="Courier New"&gt;!DumpObj&lt;/font&gt; /&lt;font face="Courier New"&gt;!do &amp;lt;Adresse&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top"&gt;Details zu einem Objekt ansehen&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;&lt;font face="Courier New"&gt;!PrintException / !pe&lt;/font&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top"&gt;Details zur aktuellen Exception ansehen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt; &lt;h3&gt;Wie gehts weiter?&lt;/h3&gt; &lt;p&gt;Ziel dieses kleinen Beispiels war es, den Einstieg in WinDbg zu erleichtern. Natürlich gibt es noch weitaus mehr, was mit WinDbg angestellt werden kann. So ist der Debugger sehr hilfreich, um Speicherlecks, oder (vermeintliche) Deadlocks zu finden. Auch die Option, einen zuvor durch den Kunden generierten MemoryDump zu analysieren ist sehr interessant.&lt;/p&gt; &lt;p&gt;Sollte also Interesse an einer Fortsetzung bestehen, reicht es einen kurzen Kommentar zu diesem Beitrag zu hinterlassen. Kommen genug Kommentare zusammen, schreibe ich gerne weitere Teile - dieses Mal auch mit weniger Wartezeit ;-)&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/154.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2009/09/04/windbg-tutorial-fehlerursachen-finden-teil-1-einer-serie.aspx</guid>
            <pubDate>Fri, 04 Sep 2009 18:02:00 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2009/09/04/windbg-tutorial-fehlerursachen-finden-teil-1-einer-serie.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/154.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
