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

Antworten:

114

Das Wichtigste ist, dass es im Debug-Modus keine Optimierungen gibt, während es im Release-Modus Optimierungen gibt. Dies ist wichtig, da der Compiler sehr fortgeschritten ist und einige ziemlich knifflige Verbesserungen Ihres Codes auf niedriger Ebene durchführen kann. Infolgedessen bleiben einige Zeilen Ihres Codes möglicherweise ohne Anweisungen, oder einige werden durcheinander gebracht. Ein schrittweises Debuggen wäre unmöglich. Außerdem werden lokale Variablen häufig auf mysteriöse Weise optimiert, sodass Uhren und QuickWatches häufig nicht funktionieren, da die Variable "wegoptimiert" ist. Und es gibt auch eine Vielzahl anderer Optimierungen. Versuchen Sie, irgendwann optimierten .NET-Code zu debuggen, und Sie werden sehen.

Ein weiterer wesentlicher Unterschied besteht darin, dass die Standard-Release-Einstellungen aus diesem Grund keine umfangreichen Debug-Symbolinformationen generieren. Dies ist die .PDB-Datei, die Sie möglicherweise bemerkt haben, und die es dem Debugger ermöglicht, herauszufinden, welche Montageanweisungen welcher Codezeile usw. entsprechen.

Vilx-
quelle
1
"Infolgedessen bleiben einige Zeilen Ihres Codes möglicherweise ohne Anweisungen, oder einige werden durcheinander gebracht." YUP, habe dies mit Stack-Frames nicht verstanden, um den Namen der aktuellen Methode / Eigenschaft zu erhalten - und viele der Eigenschaften wurden in der Veröffentlichung
eingefügt
4
"Das Wichtigste ist, dass es im Debug-Modus keine Optimierungen gibt" - das ist fraglich. Das Wichtigste ist, dass es Debug-Informationen gibt, mit denen Sie debuggen können. obwohl das auch in der Veröffentlichung existieren kann.
Shoosh
Ich weiß nicht, welcher Standardmodus (Debug / Release) ist. Nach meiner Erfahrung befinden sich alle Projekte im Debug-Modus, und das Installations-Team wird sich um diese Version kümmern, um PDF-Dateien zu vermeiden und die Optimierung einzuführen. Aber heute bin ich auf eine Situation gestoßen, in der der Modus auf Release geändert wurde und ich den Code nicht mit dem Haltepunkt brechen kann. Ich habe eine lange Stunde lang versucht, viele Dinge zu tun, und schließlich stelle ich fest, dass dies auf das Problem mit dem aktuellen Kompilierungsmodus zurückzuführen ist. @ Vlix- Danke für deine Antwort.
kbvishnu
1
Dies hat mir tatsächlich geholfen, das Problem "Der Name 'Variable' existiert im aktuellen Kontext nicht" zu lösen, das beim Versuch aufgetreten ist, ein Symbol im unmittelbaren Fenster zu analysieren, während eine Anwendung debuggt wurde, die der Standard-Release-Konfiguration entspricht. Vielen Dank!
M463
1) Was ist mit den folgenden Problemen? In einem ASP.NET MVC-Projekt gibt es drei Konfigurationen: base (web), debug (web.debug), release (web.release). Angenommen, wir setzen die Debug- und Release-Verbindungszeichenfolge durch Umwandlung in die entsprechende Konfiguration (Debug und Release). Bei der Veröffentlichung können wir entsprechend unserer Auswahl im Veröffentlichungsdialog veröffentlichen. Aber wenn ich eine Anwendung ausführe, obwohl sie Debug auswählt, wird die Release-Konfiguration verwendet (weil ich die Debug-Konfiguration in der Basis- und Debug-Konfiguration festgelegt habe). Ist das normal?
Jason
52

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

Im "Debug" -Modus haben Sie normalerweise Folgendes:

  • Programm-Debug-Datenbankdateien, mit denen Sie die Ausführung des Programms zur Laufzeit in der Quelle genau verfolgen können.
  • Alle Optimierungen sind deaktiviert, sodass Sie den Wert von Variablen überprüfen und in Funktionen verfolgen können, die ansonsten möglicherweise wegoptimiert oder integriert worden wären
  • Eine _DEBUG-Präprozessordefinition, mit der Sie Code schreiben können, der sich im Debug-Modus anders verhält als im Release, z. B. für ASSERTs, die nur beim Debuggen verwendet werden sollen
  • Verknüpfen mit Bibliotheken, die ebenfalls mit Debugging-Optionen kompiliert wurden und normalerweise nicht für tatsächliche Kunden bereitgestellt werden (aus Gründen der Größe und Sicherheit)

Im "Release" -Modus sind Optimierungen aktiviert (obwohl mehrere Optionen verfügbar sind) und die _DEBUG-Präprozessordefinition ist nicht definiert. Normalerweise möchten Sie die PDB-Dateien dennoch generieren, da es sehr nützlich ist, im Release-Modus "debuggen" zu können, wenn die Dinge schneller laufen.

Joris Timmermans
quelle
5
"nur zwei Labels" - mit Visual Studio können Sie sogar mehr erstellen ! Dies kann beim Testen eines Programms besonders nützlich sein. Zum Beispiel habe ich kürzlich ein Programm für meinen Job geschrieben, das Dateinamen von der Kommandozeile akzeptiert. Ich habe meine Befehlszeilenanalyse getestet, aber als das erledigt war, wollte ich mich nicht jeden Tag mit CMD und Listen von Dateinamen herumschlagen. Ich habe eine Konfiguration erstellt, mit der ich die bedingte Kompilierung verwenden kann, um Dummy-Befehlszeilenwerte bereitzustellen und die Geschäftslogik des Programms zu testen, wodurch ich einen viel schnelleren Iterationszyklus für die Programmentwicklung erhalten habe.
Brian S
9

Meistens enthält das Debuggen viele zusätzliche Informationen, die beim Debuggen nützlich sind. Im Release-Modus wird dies alles gekürzt und gegen Leistung eingetauscht.

Rik
quelle
1) Was ist mit den folgenden Problemen? In einem ASP.NET MVC-Projekt gibt es drei Konfigurationen: base (web), debug (web.debug), release (web.release). Angenommen, wir setzen die Debug- und Release-Verbindungszeichenfolge durch Umwandlung in die entsprechende Konfiguration (Debug und Release). Bei der Veröffentlichung können wir entsprechend unserer Auswahl im Veröffentlichungsdialog veröffentlichen. Aber wenn ich eine Anwendung ausführe, obwohl sie Debug auswählt, wird die Release-Konfiguration verwendet (weil ich die Debug-Konfiguration in der Basis- und Debug-Konfiguration festgelegt habe). Ist das normal?
Jason
2) Verwendet VS beim Ausführen der Anwendung im Debug- oder Release-Modus die Basis-Webkonfiguration oder die entsprechende Webkonfiguration (web.debug.confg oder web.release.config)?
Jason
7

Wenn Sie die Projektkompilierungsoptionen durchgehen und vergleichen, werden Sie die Unterschiede erkennen.

Angenommen, die Frage bezieht sich auf nativen / C ++ - Code (aus der Formulierung geht nicht ganz hervor):

Grundsätzlich sind beim Debuggen alle Optimierungen der Codegenerierung deaktiviert. Einige Bibliotheken (z. B. STL ) verwenden standardmäßig strengere Fehlerprüfungen (z. B. Debug-Iteratoren). Weitere Debugging-Informationen werden generiert (z. B. für "Bearbeiten und fortfahren"). Im Code werden weitere Dinge generiert, um Fehler abzufangen (lokale Variablenwerte werden auf ein nicht initialisiertes Muster gesetzt, und der Debug-Heap wird verwendet).

NeARAZ
quelle
2
@Vilx: Als ich antwortete, gab es noch kein .net-Tag, nur Visualstudio. Also nahm ich an, dass es C ++ ist.
NeARAZ
6

Außerdem werden im Debug-Modus anscheinend viele zusätzliche Threads erstellt, um das Debuggen zu erleichtern. Diese bleiben während der gesamten Laufzeit des Prozesses aktiv, unabhängig davon, ob Sie einen Debugger anhängen oder nicht. Siehe meine verwandte Frage hier .

Matt Jacobsen
quelle
Aber nur für .NET (nicht C ++)?
Peter Mortensen
6

Es ist wahrscheinlich lohnt sich, die sehr offensichtlich zu erwähnen, dass die Build - Flags für andere Logik ermöglichen , die sollten nur Änderungen Protokollierung verwendet werden und „Konsole“ Messaging, aber es kann dazu missbraucht werden und dramatisch verändern nicht nur die Low-Level, aber die eigentliche Business - Logik.

Annakata
quelle
"... dramatisch ändern ... die eigentliche Geschäftslogik" - klingt für mich wie ein Fehler! Wir haben viel bedingten Code und es macht es wirklich schwer zu verstehen. Außerdem ist jede Kombination von bedingten Code-Flags im Wesentlichen eine andere Version Ihrer Software, die getestet werden sollte, um Korrektheit und grundlegende Integrität sicherzustellen. Laut "Code Complete", meiner Bibel zur Softwarekonstruktion, ist unsere "Prime Directive" das Management von Komplexität. (Es ist unser Hauptproblem zu lösen). Überlegen Sie lange und gründlich, bevor Sie wahllos weitere bedingte Flags hinzufügen!
MicroservicesOnDDD
Mein obiger Kommentar war nicht auf diese Antwort gerichtet, insbesondere was den letzten Satz betrifft ... das war nur eine zusätzliche Sache, die ich dachte, dass Leser, die hierher kommen, lesen sollten.
MicroservicesOnDDD
6

Beachten Sie auch, dass bei Verwendung von MFC beispielsweise Debug-Projekte mit nicht weiterverteilbaren DLL-Versionen MFC90D.DLLverknüpft sind, während Release-Links mit verteilbaren Versionen verknüpft sind MFC90.DLL. Dies ähnelt wahrscheinlich anderen Frameworks.

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

foraidt
quelle
sehr richtig. Ich bin einmal bei einem Kunden davon betroffen. Funktioniert auf meiner Maschine (TM).
Matt Jacobsen
Sie können sie verteilen .. (wissen nicht, ob Sie dürfen). Sie müssen sich in einem Unterordner mit angemessenen Namen Ihrer Anwendung befinden.
Andreas Reiff
@Andreas In meinem Beispiel bedeutet "nicht weiterverteilbar", dass Microsoft die Verteilung nicht zulässt .
Foraidt
4

Ich wurde auch neugierig auf diese Frage, als ich eine Anwendung entwickelt hatte, die aus einer vorhandenen Release-Build-Konfiguration kopiert wurde.

Ich habe einen Entwickler, der daran interessiert ist, diese Anwendung im Debug-Modus zu verwenden. Daher habe ich mich gefragt, wie diese Build-Konfiguration mit dem Namen ReleaseMyBuild aus einer Release-Konfiguration kopiert werden kann (und daher alle Einstellungen auf Release-Optimierungen ausrichten sollte) ), um plötzlich das Team zu wechseln und trotz des verwirrenden Build-Konfigurationsnamens ein Debug-Build zu werden.

Ich dachte, die Projektkonfiguration sei nur ein Name und eine bequeme Möglichkeit, die "ganze Reihe von Einstellungen" auszuwählen, die Joris Timmermans erwähnt. Ich wollte genau wissen, welche Einstellungen diese Build-Konfiguration mit dem Namen "FOO" als optimierte Version verwenden können Build verwenden können.

Hier ist ein Blick hinein. Ich habe aus der leeren Projektvorlage von Visual Studio 2010 ein neues VCXPROJ erstellt. Anschließend habe ich es kopiert und beide bearbeitet, wobei das erste den Debug-Inhalt und das zweite den Release-Inhalt beibehält. Hier ist der Unterschied, der sich auf die relevanten Unterschiede konzentriert ...

Leere VCXPROJs Debug vs Release diff

FREISETZUNG

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

DEBUGGEN

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

Es ist interessant, dass beide im Link-Bereich GenerateDebugInformationauf true gesetzt haben.

jxramos
quelle
3

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

Beim Kompilieren in Debug wird die Symboltabelle zum kompilierten Objekt der Codedatei hinzugefügt, sodass Debugging-Programme auf diese Binärdateien zugreifen und auf die Werte von Objekten und Variablen zugreifen können.

Ein weiterer beobachtbarer Unterschied besteht darin, dass im Release-Modus die Binärdatei bei einem schwerwiegenden Fehler im Debug-Modus einfach abstürzt. Wenn Sie mit dem Debuggen der Anwendung in Visual Studio beginnen, können Sie den Aufrufstapel überprüfen, der Ihnen den genauen Speicherort der fehlerhaften Anweisung angibt .

fasih.rana
quelle
-15

Ich weiß nicht, was die genauen Unterschiede sind, da es dazu eigentlich keine leicht verfügbaren Informationen gibt.

Der hauptsächliche beobachtete Unterschied besteht jedoch darin, dass die Release-Version manchmal die resultierende DLL-Datei beschädigt und somit Ihre Anwendung und Webanwendung unbrauchbar macht.

Leider müssen Sie Debug Build in die Produktion setzen. Und ja, um zu veröffentlichen, müssen Sie gutes altes FTP verwenden.

f470071
quelle
6
Wie beantwortet dies die Frage? Und bitte achten Sie beim Tippen darauf.
mmking
Ich hatte ein ähnliches Problem, Code funktioniert im Debug-Modus, hat aber Probleme im Release-Modus. Es stellt sich heraus, dass das Problem in meinem Code liegt. Es gibt einen großartigen Artikel über häufige Probleme in der Release-Version. Ich hoffe, dies kann auch anderen helfen.
Weihui Guo