{"id":4442,"date":"2016-09-12T10:00:20","date_gmt":"2016-09-12T09:00:20","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=4442"},"modified":"2016-09-03T09:56:38","modified_gmt":"2016-09-03T08:56:38","slug":"visual-studio-debugger-bei-behandelten-und-unbehandelten-ausnahmen-unterbrechen-lassen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/visual-studio-debugger-bei-behandelten-und-unbehandelten-ausnahmen-unterbrechen-lassen\/","title":{"rendered":"Visual Studio: Debugger bei behandelten und unbehandelten Ausnahmen unterbrechen lassen"},"content":{"rendered":"<p>Der Debugger von Visual Studio ist ein m\u00e4chtiges und n\u00fctzliches Werkzeug, um die Ursachen f\u00fcr fehlerhaftes Anwendungsverhalten schnell ermitteln zu k\u00f6nnen. Eines der praktischsten Funktionen ist wohl die M\u00f6glichkeit, bei Ausnahmen die Ausf\u00fchrung anzuhalten. Visual Studio zeigt Details zur Exception und markiert die Codezeile, in der sie aufgetreten ist. Au\u00dferdem lassen sich die aktuellen Inhalte aller Variablen anzeigen, wodurch sich die Fehlerquelle h\u00e4ufig zumindest eingrenzen l\u00e4sst.<\/p>\n<p>Es gibt allerdings bestimmte F\u00e4lle, in denen Visual Studio dies nicht tut. Beispielsweise bei behandelten Ausnahmen, die mit einem Try-Catch-Block abgefangen werden. Insbesondere in externen Librarys kann dies die Fehlersuche deutlich erschweren.\u00a0Beispielsweise wenn s\u00e4mtliche Exception angefangen und nur \u00fcber ein Error-Event \u00fcbermittelt werden.\u00a0Demonstrieren l\u00e4sst sich dies mit wenigen Zeilen beispielsweise durch provozieren\u00a0einer NullReference-Exception:<\/p>\n<p><a href=\"https:\/\/u-img.net\/img\/3241Yy.jpg\" target=\"_blank\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/u-img.net\/img\/3241Yy.jpg\" \/><\/a><\/p>\n<p>In diesem Falle k\u00f6nnen wir standardm\u00e4\u00dfig nicht mit dem Debugger arbeiten. Uns steht nur die Ausnahme und die Zeilennummer der Stacktrace zur Verf\u00fcgung.<\/p>\n<h4><strong>Bestimmen, bei welchen Ausnahmen Visual Studio\u00a0unterbricht<\/strong><\/h4>\n<p>Um dies zu \u00e4ndern, m\u00fcssen wir Visual Studio zwingen, bei bestimmten Ausnahmetypen immer Anzuhalten und den Debugger zu starten. Dies l\u00e4sst sich \u00fcber die\u00a0<strong>Ausnahmeeinstellungen<\/strong> festlegen. Sie k\u00f6nnen \u00fcber\u00a0<em>Debuggen &gt; Fenster &gt; Ausnahmeeinstellungen<\/em> oder alternativ die Tastenkombination <span class=\"light-keys\"><kbd>Strg<\/kbd> + <kbd>Alt<\/kbd> + <kbd>E<\/kbd><\/span> ge\u00f6ffnet werden. In der sich \u00f6ffnenden Liste d\u00fcrften vor allem die\u00a0<em>Common Language Runtime Exceptions<\/em> interessant sein. Sie enthalten s\u00e4mtliche .NET Ausnahmen. Man kann hier direkt einen Haken setzen oder die Liste \u00f6ffnen, und nur spezifische Ausnahmen aktivieren.<\/p>\n<p>In unserem Beispiel wollen wir den Debugger nur bei NullReferenceExceptions starten. Am schnellsten finden wir diese \u00fcber das Suchfeld rechts oben:<\/p>\n<p><a href=\"https:\/\/u-img.net\/img\/3001It.jpg\" target=\"_blank\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/u-img.net\/img\/3001It.jpg\" \/><\/a><\/p>\n<p>Beim gleichen Code wird Visual Studio nun anhalten und bietet\u00a0wie bei unbehandelten Ausnahmen die M\u00f6glichkeit zu debuggen:<\/p>\n<p><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4453\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug.jpg\" alt=\"Visual Studio kann auch bei behandelten Ausnahmen zu Debugzwecken anhalten\" width=\"884\" height=\"725\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug.jpg 884w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug-439x360.jpg 439w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug-207x170.jpg 207w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug-300x246.jpg 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/08\/vs-handled-exception-halt-debug-768x630.jpg 768w\" sizes=\"auto, (max-width: 884px) 100vw, 884px\" \/><\/a><\/p>\n<p>Ohne das explizite aktivieren wird Visual Studio nat\u00fcrlich nicht bei behandelten Ausnahmen anhalten. In diesem Fall geht die IDE richtigerweise davon aus, dass der Entwickler den Fehler angemessen behandelt, damit das Programm weiter laufen kann. Oder die Ausf\u00fchrung bei entsprechend schweren Fehlern unterbricht. Dieses Verhalten zu \u00e4ndern macht nur zu Fehlersuche im Rahmen von Entwicklungszwecken sinn.<\/p>\n<h4><strong>Nur eigener Code oder auch externe Exceptions?\u00a0<\/strong><\/h4>\n<p>Standardm\u00e4\u00dfig funktioniert dies nur mit dem eigenen Code. Nicht ber\u00fccksichtigt werden Exceptions, die in externen Komponenten geworfen werden wie beispielsweise Frameworks oder sonstige eingebundene Librarys. Ein Beispiel ist die serverseitige Komponente von SignalR: Sie f\u00e4ngt alle Exceptions ab und feuert ein Error-Event.\u00a0Mit den Standardeinstellungen w\u00fcrde Visual Studio bei einer solchen Ausnahme entgegen dem obigen Beispiel nicht anhalten.<\/p>\n<p>Je nach Anwendungsfall ist diese Verhalten erw\u00fcnscht oder eben nicht. Es l\u00e4sst sich in den Debug-Optionen im Men\u00fc <em>Debug &gt; Optionen<\/em> unter dem Punkt\u00a0<em>Allgemein<\/em> anpassen. Ab Werk ist die Einstellung\u00a0<em><strong>Nur meinen Code aktivieren<\/strong><\/em>\u00a0eingeschaltet. Sie verursacht das eben erkl\u00e4rte Verhalten. M\u00f6chte man dagegen Visual Studio auch bei Anwendungen in externen Komponenten anhalten lassen, muss dieser Haken entfernt werden.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/u-img.net\/img\/2838Sr.jpg\" \/><\/p>\n<p>Zu beachten ist, dass Visual Studio die\u00a0entsprechenden Symbole (*.pdb Datei)\u00a0der externen Library ben\u00f6tigt. Die\u00a0<strong>P<\/strong>rogram\u00a0<strong>D<\/strong>ata<strong>B<\/strong>ase Datei enth\u00e4lt Informationen, die Visual Studio f\u00fcr das Debuggung ben\u00f6tigt. F\u00fcr das .NET Framework und alle dazugeh\u00f6rigen Komponenten bietet Microsoft einen Symbolserver an, von dem sie bei Bedarf automatisch geladen werden:<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/u-img.net\/img\/5057Uu.jpg\" \/><\/p>\n<p>Dies muss aber nicht auch zwingend bei Fremd-Entwicklungen der Fall sein. Dort k\u00f6nnen die Entwickler ihre Software ohne Symbole ausliefern. Liegt auch kein Quellcode vor um diese selbst zu generieren, ist das Debuggen mit Visual Studio ohne weiteres nicht m\u00f6glich.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Debugger von Visual Studio ist ein m\u00e4chtiges und n\u00fctzliches Werkzeug, um die Ursachen f\u00fcr fehlerhaftes Anwendungsverhalten schnell ermitteln zu k\u00f6nnen. Eines der praktischsten Funktionen ist wohl die M\u00f6glichkeit, bei Ausnahmen die Ausf\u00fchrung anzuhalten. Visual Studio zeigt Details zur Exception und markiert die Codezeile, in der sie aufgetreten ist. Au\u00dferdem lassen sich die aktuellen Inhalte &#8230;<\/p>\n","protected":false},"author":5,"featured_media":4453,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[331,525,390,526],"class_list":["post-4442","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-net","tag-debugging","tag-visual-studio","tag-visual-studio-2015"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/4442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=4442"}],"version-history":[{"count":26,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/4442\/revisions"}],"predecessor-version":[{"id":4469,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/4442\/revisions\/4469"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/4453"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=4442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=4442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=4442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}