it-swarm.com.de

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

Mögliches Duplikat Debuggen von Visual Studio Release in .NET

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

105
Cornel

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 auf niedriger Ebene an Ihrem Code vornehmen kann. Dies kann dazu führen, dass einige Codezeilen überhaupt keine Anweisungen mehr enthalten oder dass einige durcheinander geraten. Ein schrittweises Debuggen wäre unmöglich. Außerdem werden lokale Variablen häufig auf mysteriöse Weise optimiert, sodass Uhren und Schnelluhren häufig nicht funktionieren, weil die Variable "wegoptimiert" ist. Und es gibt eine Vielzahl weiterer Optimierungen. Versuchen Sie, irgendwann optimierten .NET-Code zu debuggen, und Sie werden sehen.

Ein weiterer wesentlicher Unterschied besteht darin, dass sich die Standard-Release-Einstellungen aus diesem Grund nicht darum kümmern, umfangreiche Debug-Symbolinformationen zu generieren. Das ist die .PDB-Datei, die Sie vielleicht bemerkt haben und die es dem Debugger ermöglicht, herauszufinden, welche Assembly-Anweisungen zu welcher Codezeile passen usw.

107
Vilx-

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

Im "Debug" -Modus haben Sie normalerweise Folgendes:

  • Programm-Debug-Datenbankdateien, mit denen Sie die Ausführung des Programms in der Quelle zur Laufzeit ziemlich genau verfolgen können.
  • Alle Optimierungen sind deaktiviert. Auf diese Weise können Sie den Wert von Variablen überprüfen und Funktionen nachverfolgen, die ansonsten möglicherweise optimiert oder inline dargestellt worden wären
  • Eine _DEBUG-Präprozessordefinition, mit der Sie Code schreiben können, der im Debug-Modus anders als im Release-Modus funktioniert, z. B. um ASSERTs zu instrumentieren, die nur beim Debuggen verwendet werden sollen
  • Verknüpfen mit Bibliotheken, die ebenfalls mit aktivierten 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 werden Sie die PDB-Dateien trotzdem generieren wollen, da es sehr nützlich ist, im Release-Modus "debuggen" zu können, wenn die Dinge schneller laufen.

48

Meist enthält Debug eine Menge zusätzlicher Informationen, die beim Debuggen hilfreich sind. Im Release-Modus wird dies alles abgeschnitten und gegen Leistung gehandelt.

8
Rik

Wenn Sie die Projektkompilierungsoptionen durchgehen und vergleichen, werden Sie feststellen, wo die Unterschiede liegen.

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

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

7
NeARAZ

Es ist wahrscheinlich erwähnenswert, dass Build-Flags unterschiedliche Logik zulassen, die sollte nur zum Ändern der Protokollierung und des "Konsolen" -Messagings verwendet werden, kann jedoch missbraucht und dramatisch geändert werden kann nicht nur die niedrigen Ebenen, sondern die eigentliche Geschäftslogik.

6
annakata

Beachten Sie auch, dass bei der Verwendung von MFC die Verknüpfung von Debug-Projekten mit nicht weitervertreibbaren DLL Versionen wie MFC90D.DLL while release baut einen Link gegen weiterverteilbare Versionen wie MFC90.DLL. Dies ist wahrscheinlich bei anderen Frameworks ähnlich.

Aus diesem Grund können Sie Debug-Build-Anwendungen wahrscheinlich nicht auf Nicht-Entwicklungscomputern ausführen.

6
foraidt

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

6
Matt Jacobsen

Der offensichtliche Unterschied ist die Größe der Binärdatei. Debugbuild erzeugt eine größere Binärdatei als Releasebuild.

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

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

3
fasih.rana

Ich war 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, was erforderlich ist, um diese Build-Konfiguration mit dem Namen ReleaseMyBuild zu erstellen, die aus einer Release-Konfiguration kopiert wurde (und daher alle Einstellungen für Release-Optimierungen haben sollte ), um plötzlich die Teams 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 eine Build-Konfiguration mit dem Namen "FOO" als optimiertes release Build haben kann.

Hier ein kleiner Einblick: Ich habe aus der leeren Projektvorlage von VS2010 ein neues VCXPROJ erstellt. Ich habe es dann kopiert und beide bearbeitet, das erste, um den Debug-Inhalt beizubehalten und das zweite, um den Release-Inhalt beizubehalten. Hier ist der Unterschied, der sich auf die relevanten Unterschiede konzentriert ... Empty VCXPROJs Debug vs Release diff

[~ # ~] Release [~ # ~]

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

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

[~ # ~] Debug [~ # ~]

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

<ClCompile>
    <Optimization>Disabled</Optimization>

Interessanterweise haben beide im Link-Bereich GenerateDebugInformation auf true gesetzt.

3
jxramos