{"id":55000228,"date":"2020-08-01T00:00:00","date_gmt":"2020-11-26T08:55:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=228"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Debugging_in_Visual_Studio","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Debugging_in_Visual_Studio\/","title":{"rendered":"Debugging in Visual Studio"},"content":{"rendered":"<p><b>Wenn eine Anwendung sich nicht so verh&auml;lt wie gew&uuml;nscht oder diese sogar Ausnahmen ausl&ouml;st, wollen wir herausfinden, warum das so ist. Wurde ein Wert nicht oder falsch gesetzt, konnte ein Objekt nicht gef&uuml;llt werden oder was ist die Ursache f&uuml;r das Problem Hier kommen die Debugging-Techniken von Visual Studio ins Spiel. Der vorliegende Artikel stellt die g&auml;ngigsten Techniken zum Debuggen von Code unter Visual Studio vor.<\/b><\/p>\n<p>Das Wort <b>Debuggen <\/b>kommt der Sage nach vom Wort Bug. Fr&uuml;her wurden zum Durchf&uuml;hren von Rechenoperationen in Computern Relais verwendet, die durch Insekten blockiert werden konnten. Das Entfernen dieser Tierchen wurde schlie&szlig;lich <b>Debuggen <\/b>genannt &#8211; ein Begriff, der sich bis heute gehalten hat. Nur, dass Bug heute nicht mehr sprichw&ouml;rtlich K&auml;fer bedeutet, sondern schlicht Programmierfehler.<\/p>\n<p><b>Anwendung zum Debuggen starten<\/b><\/p>\n<p>Grunds&auml;tzlich gibt es zwei Modi zum Ausf&uuml;hren von .NET-Anwendungen: Den Debug-Modus und den Release-Modus. Der Release-Modus erzeugt eine leistungsoptimierte Version der Anwendung &#8211; diese entspricht auch der Version der Anwendung, die Sie mit dem Erstellen eines Projekts erhalten. Der Debug-Modus hingegen erlaubt es, bei Fehlern den Quellcode anzuzeigen, der f&uuml;r den Fehler verantwortlich ist. Au&szlig;erdem k&ouml;nnen Sie in diesem Modus Informationen &uuml;ber den Zustand von Objekten und Variablen erhalten, die gerade im G&uuml;ltigkeitsbereich liegen und Meldungen ausgeben sowie weitere Funktionen nutzen, die wir Ihnen im Laufe dieses Artikels vorstellen werden. Standardm&auml;&szlig;ig ist f&uuml;r das Starten einer Anwendung von Visual Studio aus der Debug-Modus eingestellt. Diese Einstellung k&ouml;nnen Sie leicht &uuml;ber das Men&uuml; von Visual Studio &auml;ndern (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_001.png\" alt=\"Einstellen des Ausf&uuml;hrungsmodus, hier Debug\" width=\"700\" height=\"115,716\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einstellen des Ausf&uuml;hrungsmodus, hier Debug<\/span><\/b><\/p>\n<p>Um die Anwendung nun im Debugging-Modus zu starten, bet&auml;tigen Sie entweder die Taste <b>F5<\/b>, klicken auf die Schaltfl&auml;che mit dem gr&uuml;nen Pfeil und dem Text <b>Starten <\/b>oder w&auml;hlen den Men&uuml;-Eintrag <b>Debuggen|Debuggen starten<\/b>.<\/p>\n<p><b>Zum Debuggen anhalten<\/b><\/p>\n<p>Um eine Anwendung zu debuggen, muss der laufende Code angehalten werden. Dazu gibt es verschiedene M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Es tritt eine Ausnahme auf, also ein Fehler im Code, der eine weitere Ausf&uuml;hrung des Codes verhindert. Ein Beispiel sehen Sie in Bild 2.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_002.png\" alt=\"Debuggen wird durch Laufzeitfehler erm&ouml;glicht\" width=\"499,6607\" height=\"354,428\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Debuggen wird durch Laufzeitfehler erm&ouml;glicht<\/span><\/b><\/p>\n<li>Sie legen einen Haltepunkt im Code fest, damit der Code auch ohne einen Laufzeitfehler an der gew&uuml;nschten Stelle angehalten und untersucht werden kann.<\/li>\n<li>Sie f&uuml;gen der Anwendung an der gew&uuml;nschten Stelle die Methode <b>Break <\/b>der Klasse <b>Debugger <\/b>hinzu. Dies entspricht der <b>Stop<\/b>-Anweisung, die Sie vielleicht von Access\/VBA kennen. Der Code wird genau an dieser Stelle angehalten.<\/li>\n<\/ul>\n<p><b>Haltepunkt setzen<\/b><\/p>\n<p>Einen Haltepunkt im Code setzen Sie, indem Sie im Codefenster in der Zeile, in der die Ausf&uuml;hrung angehalten werden soll, in den linken, grauen Bereich klicken, sodass dort ein roter Punkt erscheint (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_003.png\" alt=\"Haltepunkt\" width=\"349,7625\" height=\"242,0117\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Haltepunkt<\/span><\/b><\/p>\n<p>Eine alternative M&ouml;glichkeit zum Hinzuf&uuml;gen von Haltepunkten ist die Taste <b>F9<\/b>. Bewegen Sie die Einf&uuml;gemarke in die gew&uuml;nschte Zeile und bet&auml;tigen Sie diese Taste, um einen Haltepunkt hinzuzuf&uuml;gen oder diesen wieder zu entfernen.<\/p>\n<p>Sie k&ouml;nnen alle ausf&uuml;hrbaren Zeilen mit einem Haltepunkt versehen, was alle Zeilen mit Ausnahme der Deklarationszeilen umfasst.<\/p>\n<p>Wenn die Ausf&uuml;hrung an der markierten Zeile stoppt, bedeutet das &uuml;brigens, dass die markierte Zeile noch nicht ausgef&uuml;hrt wurde. Wenn Sie also Variablen in einer Zeile nach der Ausf&uuml;hrung (etwa der Zuweisung eines Wertes an eine Variable) untersuchen m&ouml;chten, k&ouml;nnen Sie den Haltepunkt auch gleich auf die folgende Zeile verschieben.<\/p>\n<p><b>Haltepunkte per Code<\/b><\/p>\n<p>Eine weitere M&ouml;glichkeit, einen Haltepunkt zu setzen, bietet die Klasse Debugger. Diese stellt die Methode <b>Break <\/b>zur Verf&uuml;gung, die beim Erreichen den Code unterbricht (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_004.png\" alt=\"Programmierter Stop\" width=\"349,7625\" height=\"272,144\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Programmierter Stop<\/span><\/b><\/p>\n<p>Warum sollte man diese Methode nutzen, statt einfach einen Haltepunkt zu setzen Unter Access und dem VBA-Editor wurden Haltepunkte gel&ouml;scht, wenn man die Anwendung geschlossen und erneut ge&ouml;ffnet hat. Das war unter Access der Grund, die <b>Stop<\/b>-Anweisung zu verwenden &#8211; wenn die Anwendung abgest&uuml;rzt ist, war diese nach dem Neustart wieder vorhanden, die Haltepunkte aber nicht. Unter Visual Studio sind die Haltepunkte allerdings nach dem Schlie&szlig;en und erneuten &Ouml;ffnen des Projekts noch vorhanden &#8211; eigentlich braucht man <b>Debugger.Break <\/b>also nicht.<\/p>\n<p><b>Beim Erreichen eines Haltepunktes<\/b><\/p>\n<p>Wenn Sie beim Debuggen einen Haltepunkt erreichen, k&ouml;nnen Sie verschiedene Aktionen durchf&uuml;hren. Die erste ist, Informationen &uuml;ber die aktuelle Situation zu ermitteln. Dazu k&ouml;nnen Sie beispielsweise &uuml;ber den Namen einer Variablen fahren, um ihren aktuellen Wert zu ermitteln (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_005.png\" alt=\"Auslesen von Variableninhalten\" width=\"399,7285\" height=\"316,4879\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Auslesen von Variableninhalten<\/span><\/b><\/p>\n<p><b>Weiter im Code<\/b><\/p>\n<p>Wenn Sie einen Haltepunkt erreicht haben und das Debuggen nun fortsetzen wollen, gibt es dazu folgende M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Sie bet&auml;tigen erneut die Taste <b>F5 <\/b>und der Code l&auml;uft weiter bis zum Schluss oder bis er durch einen weiteren Haltepunkt oder einen Fehler angehalten wird.<\/li>\n<li>Sie bet&auml;tigen die Taste <b>F11<\/b>, um jeweils eine Zeile auszuf&uuml;hren.<\/li>\n<\/ul>\n<p>Letztere M&ouml;glichkeit ist interessant, wenn Sie im Detail die einzelnen Zeilen des Codes durchlaufen wollen.<\/p>\n<p><b>Laufzeitfehler untersuchen<\/b><\/p>\n<p>Wenn Sie beim Debuggen auf einen Laufzeitfehler sto&szlig;en, der nicht behandelt wird, k&ouml;nnen Sie damit einige Informationen erhalten, die f&uuml;r eine Behandlung des Fehlers im Code n&uuml;tzlich sind.<\/p>\n<p>Wie die Fehlermeldung einer unbehandelten Ausnahme aussieht, haben wir bereits weiter oben betrachtet. Hier finden wir noch einige weiterf&uuml;hrende M&ouml;glichkeiten. Die wichtigste ist der Link <b>Details anzeigen<\/b>, mit dem Sie ein Fenster wie in Bild 6 &ouml;ffnen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_007.png\" alt=\"Fehlerdetails beim Auftreten einer Ausnahme\" width=\"649,559\" height=\"458,3223\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Fehlerdetails beim Auftreten einer Ausnahme<\/span><\/b><\/p>\n<p>Hier finden Sie detaillierte Informationen zu der Ausnahme. In vielen F&auml;llen k&ouml;nnen Sie unter <b>InnerException<\/b> noch weitere Informationen anzeigen, wie es in der Abbildung der Fall ist.<\/p>\n<p><b>Code w&auml;hrend des Debugging bearbeiten<\/b><\/p>\n<p>Eine wichtige Funktion ist das Bearbeiten des Codes w&auml;hrend des Debuggings. Damit dies funktioniert, aktivieren Sie die Optionen aus Bild 8 im Bereich <b>Debugging <\/b>des Optionen-Dialogs, den Sie mit dem Men&uuml;befehl <b>Extras|Optionen <\/b>&ouml;ffnen &#8211; und die normalerweise bereits aktiviert sind..<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_008.png\" alt=\"Aktivieren des Bearbeitens von Code w&auml;hrend des Debuggens\" width=\"649,559\" height=\"378,9093\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Aktivieren des Bearbeitens von Code w&auml;hrend des Debuggens<\/span><\/b><\/p>\n<p>Es werden allerdings nicht alle &Auml;nderungen unterst&uuml;tzt. Unter folgendem Link finden Sie eine Liste der unterst&uuml;tzten und nicht unterst&uuml;tzten &Auml;nderungen:<\/p>\n<pre>https:\/\/github.com\/dotnet\/roslyn\/blob\/master\/docs\/wiki\/EnC-Supported-Edits.md<\/pre>\n<p><b>Debugging steuern<\/b><\/p>\n<p>Neben dem Starten und Fortsetzen des Debuggings mit <b>F5 <\/b>und dem Durchf&uuml;hren von Einzelschritten mit <b>F11 <\/b>gibt es noch weitere Optionen, die Sie auch im Men&uuml;punkt <b>Debuggen <\/b>finden (siehe Bild 7). Wenn Sie einmal die Tastenkombination f&uuml;r einen der Befehle suchen, k&ouml;nnen Sie diese auch in diesem Men&uuml; einsehen. Die Befehle im Einzelnen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_006.png\" alt=\"Kontextmen&uuml;-Befehle zum Debuggen\" width=\"374,7455\" height=\"624,576\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Kontextmen&uuml;-Befehle zum Debuggen<\/span><\/b><\/p>\n<ul>\n<li><b>Weiter <\/b>(<b>F5<\/b>): Setzt den Code bis zum n&auml;chsten Haltepunkt oder Fehler beziehungsweise bis zum Ende des Codes durch.<\/li>\n<li><b>Alle unterbrechen <\/b>(<b>Strg + Alt + Pause<\/b>): Unterbricht an der aktuell ausgef&uuml;hrten Codezeile.<\/li>\n<li><b>Debuggen beenden <\/b>(<b>Umschalt + F5<\/b>): Beendet das Debuggen.<\/li>\n<li><b>Neu starten <\/b>(<b>Strg + Umschalt + F5<\/b>): Beendet das Debugging und startet es erneut.<\/li>\n<li><b>Prozedurschritt <\/b>(<b>F10<\/b>): F&uuml;hrt die Anweisungen der aktuellen Methode im Einzelschrittmodus aus, aber springt nicht in andere, von dieser Methode aus aufgerufene Methoden.<\/li>\n<li><b>Ausf&uuml;hren bis R&uuml;cksprung <\/b>(<b>Umschalt + F11<\/b>): Springt von der aktuellen Methode direkt zur aufrufenden Methode, wenn &uuml;berhaupt ein Aufruf von einer anderen Methode erfolgt ist.<\/li>\n<\/ul>\n<p>Damit erhalten wir recht exakt die gleichen Funktionen und Tastenkombinationen wie im VBA-Editor von Access &#8211; mit dem Unterschied, dass statt der Taste <b>F8 <\/b>die Taste <b>F11 <\/b>zum Einsatz kommt.<\/p>\n<p>Es gibt noch weitere Befehle, die allerdings erst bei laufendem Debugging durch einen Mausklick mit der rechten Maustaste in das Codefenster auftauchen (siehe Bild 9). Interessant sind hier die folgenden Befehle:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_228_009.png\" alt=\"Weitere Debugging-Befehle\" width=\"599,593\" height=\"684,864\" \/><\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000228\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000228?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000228\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"b14c72894d\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn eine Anwendung sich nicht so verh&auml;lt wie gew&uuml;nscht oder diese sogar Ausnahmen ausl&ouml;st, wollen wir herausfinden, warum das so ist. Wurde ein Wert nicht oder falsch gesetzt, konnte ein Objekt nicht gef&uuml;llt werden oder was ist die Ursache f&uuml;r das Problem Hier kommen die Debugging-Techniken von Visual Studio ins Spiel. Der vorliegende Artikel stellt die g&auml;ngigsten Techniken zum Debuggen von Code unter Visual Studio vor.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662020,66042020,44000027,44000013],"tags":[],"yst_prominent_words":[],"class_list":["post-55000228","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-Excel_programmieren","category-Visual_Studio_nutzen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000228"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000228\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000228"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}