2009-03-11 4 views
4

Wenn die Release-Version. Pdb-Dateien erzeugt und Sie können in jede Zeile setzen, setzen Sie Haltepunkte etc. Warum dann jemals eine "Debug" Version meiner Komponenten zu bauen?C# - Gibt es wirklich einen Bedarf für Debug-Build in. NET

Ich verwende C# für meine Projekte und ich hatte kein Problem Debug-Release-Versionen. In C++ hatte ich Probleme, optimierten Code zu debuggen, aber in C# funktioniert es gut. Ich spreche nicht über dumme Code-Blöcke wie if(false) ...

Antwort

7

Ein Grund ist Attach vs. Start.

Wenn Sie einen Retail-Prozess in .Net starten, ist das Debuggen fast so gut wie das Starten eines Debug-Prozesses. Sie werden wahrscheinlich keinen Unterschied in Ihrer Debugging-Erfahrung bemerken.

Attach ist ein völlig anderes Ballspiel. Sowohl C# als auch VB wird das Flag/optimize + für Einzelhandels-Builds übergeben. Das wird die DebuggableAttribute auf der Assembly-Ebene ohne das DebuggingMode.DisableOptimizations-Flag einbetten. Während eines Prozessstarts kommuniziert VS/CLR, um diese Tatsache im Wesentlichen zu ignorieren und JIT-Optimierungen zu deaktivieren, die sich auf das Debugging auswirken. Während des Anbringens passiert kein solcher Gegenstand und der JIT/CLR wird nach Herzenslust optimiert. Ich garantiere Ihnen, die Debug-Erfahrung ist in diesem Fall viel schlimmer.

Sie können

  • Schalter Build in VS mit diesem Experiment
  • STRG + F5, ohne das Debuggen
  • an den Prozess anhängen starten Release.
+0

Meinen Sie eher Release als Retail ...? – Matt

+0

@Matt, yeah, VS verwendet Release – JaredPar

8

Die Release-Builds sind optimiert, z. Beim Debuggen von Release-Builds ärgert es mich, dass die Werte der lokalen Variablen verschwinden, wenn ihre Werte nicht von der Laufzeit verwendet werden.

5

In (C#) winforms Sie nicht bearbeiten können & weiterhin in Version baut ..

0

Veröffentlichung baut zusätzliche Optimierungen durchführen als Debug-Builds, aber ein Debug-Build auch leicht, das Verhalten des GC ändert, dass Sie, um sicherzustellen, Erhalte kein Objekt, das während einer Debugsitzung unter dir gesammelt wurde. Debug-Builds verhindern auch, dass bestimmte Optimierungen während JIT auftreten, die sich negativ auf Ihre Debug-Sitzung auswirken.

+0

Ist das nicht eine Funktion des JIT-Compilers und nicht der GC? –

2

Es gibt ein paar Gründe:

  • standardmäßig ein Release-Build enthält nicht so viele Debug-Informationen in der PDB-Datei. Ich glaube, dass die Option dafür mehr hervorstechend war - sie ist jetzt in den "Erweiterten Einstellungen" unter Ausgabe, mit möglichen Werten von "keine", "voll" (Standard für Debug-Builds) und "nur pdb" (Standard für Release) baut).
  • Standardmäßig ist ein Release-Build optimiert: Obwohl dies in C# nicht so viel Unterschied macht wie in anderen Sprachen (z. B. C++), da das JIT die meiste Arbeit verrichtet, kann es durchaus einige Unterschiede geben was es schwieriger macht, einen Release-Build zu debuggen.
  • Standardmäßig definiert das Release-Build nicht das DEBUG-Symbol, sodass alle Aufrufe von Debug.Assert usw. entfernt werden.

Eine Menge davon kann natürlich in der Build-Konfiguration geändert werden.Ein ziemlich verbreiteter Ansatz besteht darin, die Standardeinstellungen mit Ausnahme von für das Einbinden weiterer Debugging-Informationen in einem Release-Build beizubehalten, was Ihnen nützlichere Stack-Traces gibt (und eine bessere Debugging-Erfahrung ermöglicht, wenn Sie den Debugger verwenden).

+0

Ich glaube, Sie sind auf den ersten Punkt falsch. PDBs sind in der Standardkonfiguration von VS für den Release-Build enthalten (überprüft mit der Konsolen-App). Es wäre unmöglich, den Einheimischen während des Debuggens Informationen zu geben. – JaredPar

+0

Ooh ... jetzt überprüfen. –

+0

Hmm ... seltsam. Ich frage mich, woher ich diese Idee habe. Bearbeitung. –

3

Neben den anderen Antworten, verwende ich die automatisch generierte #define DEBUG Verhalten zu ändern, wenn eine nicht abgefangene Ausnahme auftritt:

  • Wenn Laufen in Release-Modus, zeigen eine nette Nachricht an den Benutzer und optional das Fehlerprotokoll,
  • Wenn im Debug-Modus ausgeführt wird, tun nichts (was einen Bruch mit dem Debugger verursacht)
0

ich mit Lennaert zustimmen - ich neige dazu, zwischen der Builds Umgang mit anderen Fehlern zu tun. Zum Beispiel bin ich für einige der Apps super im Debug-Build. Vor- und Nachbedingungen, Assertions, Exceptions usw. Ich versuche grundsätzlich, den Entwickler zu zwingen, meine Bibliothek korrekt zu benutzen. In der Release-Version entspanne ich dagegen die Bedingungen, um die Leistung zu verbessern.

0

Wenn Sie Design by Contract verwenden, ist es wichtig, zwei Builds zu haben - die Freigabe ein, die nicht Voraussetzungen überprüft, Nachbedingungen und Klasseninvarianten und die Debug ein, die sie überprüft (über Zusicherungen).

In einigen Situationen können Vorbedingungsprüfungen im Freigabemodus aktiv bleiben (suchen Sie nach verwandten Fragen), aber das ändert nichts an der ganzen Geschichte. In der Entwicklungsphase überprüfen Sie alle Ihre Vertragsannahmen, und wenn Sie sie freigeben, überprüfen Sie sie nicht mehr - Sie wissen, dass Sie den Code getestet haben und es funktioniert, so dass Sie auf Ihre vorherigen Annahmen verlassen - Darum waren sie ursprünglich gedacht.

Verwandte Themen