Mögliches doppeltes Debuggen von Visual Studio Release in .NET
Was ist der Unterschied zwischen Debug und Release in Visual Studio?
quelle
Mögliches doppeltes Debuggen von Visual Studio Release in .NET
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, 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.
"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:
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.
quelle
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.
quelle
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).
quelle
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 .
quelle
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.
quelle
Beachten Sie auch, dass bei Verwendung von MFC beispielsweise Debug-Projekte mit nicht weiterverteilbaren DLL-Versionen
MFC90D.DLL
verknüpft sind, während Release-Links mit verteilbaren Versionen verknüpft sindMFC90.DLL
. Dies ähnelt wahrscheinlich anderen Frameworks.Daher können Sie wahrscheinlich keine Debug-Build-Anwendungen auf Nicht-Entwicklungscomputern ausführen.
quelle
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 ...
FREISETZUNG
DEBUGGEN
Es ist interessant, dass beide im Link-Bereich
GenerateDebugInformation
auf true gesetzt haben.quelle
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 .
quelle
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.
quelle