Was ist der Unterschied zwischen Debug und Release in Visual Studio?

Mögliches Duplikat Debug Visual Studio Release in .NET

Was ist der Unterschied zwischen Debug und Release in Visual Studio?

Solutions Collecting From Web of "Was ist der Unterschied zwischen Debug und Release in Visual Studio?"

Das Wichtigste ist, dass es im Debug-Modus keine Optimierungen gibt, während es im Release-Modus Optimierungen gibt. Dies ist wichtig, weil der Compiler sehr fortgeschritten ist und einige ziemlich knifflige Low-Level-Verbesserungen Ihres Codes durchführen kann. Das hat zur Folge, dass einige Zeilen Ihres Codes möglicherweise ohne statementen verloren gehen oder dass einige davon durcheinander geraten. Schritt für Schritt Debugging wäre unmöglich. Außerdem werden lokale Variablen oft auf mysteriöse Weise optimiert, so dass Watches und QuickWatches oft nicht funktionieren, weil die Variable “wegoptimiert” ist. Und es gibt viele andere Optimierungen. Versuchen Sie, den optimierten .NET-Code zu debuggen, und Sie werden sehen.

Ein weiterer wichtiger Unterschied besteht darin, dass die Standard-Release-Einstellungen keine umfangreichen Debug-Symbolinformationen generieren. Das ist die .PDB-Datei, die Sie vielleicht bemerkt haben und die es dem Debugger ermöglicht, herauszufinden, welche assemblyanweisungen zu welcher Codezeile usw. passen.

“Debuggen” und “Release” sind eigentlich nur zwei Bezeichnungen für eine ganze Reihe von Einstellungen, die sich auf Ihr Build und Debugging auswirken können.

Im “Debug” -Modus haben Sie normalerweise folgendes:

  • Programm Debug-database-Dateien, mit denen Sie die Ausführung des Programms während der Laufzeit ziemlich genau in der Quelle verfolgen können.
  • Alle Optimierungen sind deaktiviert, sodass Sie den Wert von Variablen überprüfen und in functionen verfolgen können, die andernfalls möglicherweise entfernt oder eingegrenzt wurden
  • Eine _DEBUG-Präprozessordefinition, mit der Sie Code schreiben können, der sich im Debug-Modus anders verhält als bei der Veröffentlichung, z. B. für ASSERT-Geräte, die nur während des Debuggens verwendet werden sollten
  • Verknüpfung mit Bibliotheken, die auch mit Debugging-Optionen kompiliert wurden, die aus Gründen der Größe und Sicherheit in der Regel nicht für den tatsächlichen Kunden bereitgestellt werden

Im Modus “Release” sind Optimierungen aktiviert (obwohl mehrere Optionen verfügbar sind) und die Präprozessordefinition _DEBUG ist nicht definiert. In der Regel werden Sie die PDB-Dateien trotzdem generieren wollen, da es sehr nützlich ist, im Freigabe-Modus “Debuggen” zu können, wenn die Dinge schneller laufen.

Meistens enthält das Debugging eine Menge zusätzlicher Informationen, die beim Debuggen nützlich sind. Im Release-Modus wird alles auf performance geschnitten und gehandelt.

Wenn Sie die Kompilierungsoptionen des Projekts durchlaufen und vergleichen, sehen Sie, welche Unterschiede bestehen.

Angenommen, die Frage bezieht sich auf nativen / C ++ – Code (aus der Formulierung ist nicht ganz klar):

Grundsätzlich sind in Debug alle Codegenerierungsoptimierungen deaktiviert. Einige Bibliotheken (z. B. STL) verwenden standardmäßig eine strengere Fehlerprüfung (z. B. Debug-Iteratoren). Weitere Debug-Informationen werden generiert (zB für “Edit and Continue”). Es werden mehr Dinge im Code generiert, um Fehler zu finden (lokale Variablenwerte werden auf nicht initialisiertes Muster gesetzt, Debug-Heap wird verwendet).

Es ist wahrscheinlich erwähnenswert, dass Build-Flags unterschiedliche Logiken ermöglichen, die nur zur Änderung der Logging- und “Konsolen” -Benachrichtigung verwendet werden sollten, aber missbraucht werden können und nicht nur die Low-Level, sondern die eigentliche Geschäftslogik dramatisch verändern.

Beachten Sie außerdem, dass Debug-Projekte bei der Verwendung von MFC beispielsweise mit nicht weitervertreibbaren DLL-Versionen wie MFC90D.DLL während die Version Links für die weitervertreibbaren Versionen wie MFC90.DLL . Dies ist wahrscheinlich bei anderen Frameworks ähnlich.

Daher werden Sie wahrscheinlich keine Debug-Build-Anwendungen auf Nicht-Entwicklungsmaschinen ausführen können.

Offensichtlich erzeugt der Debug-Modus auch eine Menge zusätzlicher Threads, um das Debuggen zu erleichtern. Diese bleiben während der gesamten Lebensdauer des processes aktiv, unabhängig davon, ob Sie einen Debugger anhängen oder nicht. Siehe meine Frage hier .

Der offensichtliche Unterschied, den Sie sehen können, ist die Größe der Binärdatei. Debug-Build erzeugt eine größere Binärdatei als Release-Build.

Beim Kompilieren in Debug wird die Symboltabelle zu dem kompilierten Objekt der Codedatei hinzugefügt, das es ermöglicht, dass Debug-Programme diese Binärdateien anzapfen und die Werte von Objekten und Variablen bewerten.

Ein weiterer beobachtbarer Unterschied besteht darin, dass die Binärdatei im Freigabe-Modus bei einem schwerwiegenden Fehler im Debug-Modus einfach abstürzt. Wenn Sie die Anwendung in Visual Studio debuggen, können Sie den Aufruf-Stack überprüfen, der die genaue Position der errorshaften statement angibt .

Ich war auch neugierig auf diese Frage, als ich eine Anwendung entwickelt hatte, die von einer bestehenden Release-Build-Konfiguration kopiert wurde. Ich habe einen Entwickler, der interessant ist, diese Anwendung im Debug-Modus zu verwenden, also fragte ich mich, was es wohl machen würde, diese Build-Konfiguration mit einem ReleaseMyBuild-Namen aus einer Release-Konfiguration zu erstellen (und damit alle Einstellungen auf Release-Optimierungen ausgerichtet zu haben) ) um plötzlich Teams zu wechseln und ein Debug-Build zu werden, trotz des verwirrenden Build-Konfigurationsnamens. Ich nahm an, dass die Projektkonfiguration nur ein Name und eine bequeme Art war, die “ganze Reihe von Einstellungen” auszuwählen, wie Joris Timmermans erwähnt. Ich wollte wissen, was genau diese Einstellungen sind, die eine Build-Konfiguration namens “FOO” als optimierten Release- Build funktionieren lassen.

Hier ein kleiner Einblick: Ich habe einen neuen VCXPROJ aus der leeren Projektvorlage von VS2010 erstellt. Ich habe es dann kopiert und beide bearbeitet, die erste, um den Debug-Inhalt zu behalten und die zweite den Release-Inhalt. Hier ist das Diff auf die relevanten Unterschiede konzentriert … Leer VCXPROJs Debug vs Release diff

FREISETZUNG

  true  MaxSpeed true true  true true 

DEBUGGEN

  true`  Disabled 

Interessant, dass beide in der Link-Sektion GenerateDebugInformation auf true gesetzt haben.

Ich weiß nicht, was die genauen Unterschiede sind, weil es tatsächlich keine leicht verfügbaren Informationen darüber gibt.

Aber der Hauptunterschied ist, dass die Release-Version manchmal die resultierende DLL-Datei beschädigt und somit Ihre Anwendung unbrauchbar macht.

Leider müssen Sie Debug-Build in Produktion setzen. Und ja, um zu veröffentlichen muss man guten alten FTP benutzen.