2008-10-07 7 views
49

Es scheint, dass dieTrace vs Debug in .NET BCL

weitgehend die gleichen sind, mit der bemerkenswerten Ausnahme, dass Debug Nutzung aus kompiliert in einer Release-Konfiguration.

Wann würden Sie das eine und nicht das andere verwenden? Die einzige Antwort, die ich bis jetzt ausgegraben habe, ist nur, dass Sie die Klasse Debug verwenden, um eine Ausgabe zu erzeugen, die Sie nur in der Debug-Konfiguration sehen, und Trace bleibt in einer Release-Konfiguration, aber das ist nicht wirklich Beantworte die Frage in meinem Kopf.

Wenn Sie Ihren Code Instrument fahren, warum sollten Sie jemals Debug, verwenden, da Trace kann ohne erneute Kompilierung ausgeschaltet werden?

Antwort

48

Der Hauptunterschied ist der, den Sie angeben: Debug ist nicht in Release enthalten, während Trace ist. Der beabsichtigte Unterschied, so wie ich es verstehe, besteht darin, dass Entwicklerteams möglicherweise Debug verwenden, um aussagekräftige beschreibende Nachrichten zu senden, die sich für den/die Verbraucher eines Produkts als zu detailliert (oder entlarvend) herausstellen, während Trace beabsichtigt ist senden die Arten von Nachrichten, die speziell auf das Instrumentieren einer Anwendung ausgerichtet sind.

Um Ihre letzte Frage zu beantworten, kann ich keinen Grund finden, Debug zu verwenden, um ein Stück Code zu instrumentieren, das ich veröffentlichen wollte.

Hoffe, das hilft.

+6

Ich stimme nicht vollständig mit dieser Antwort. Trace ist eine niedrigere Ebene als Debug und sollte niemals in der Produktion verwendet werden. Nach meiner Erfahrung wird Trace am Anfang von Methoden verwendet oder "verfolgt" ein Stück Arbeit, während es einen Workflow durchläuft und in gewisser Weise den Aufruf-Stack zeigt. Alles über und mit Info sollte die einzigen Ebenen sein, die in der Produktion verwendet werden. Das sind Info, Warnung, Fehler, Fatal. –

+0

Ich denke, ein weiterer Unterschied ist, dass Sie [Trace-Listener] (http://msdn.microsoft.com/en-us/library/4y5y10s7 (v = vs.110) .aspx) in Ihrer Anwendung konfigurieren und die Ausgabe routen können der Spur entsprechend. Der standardmäßige Ablaufverfolgungslistener in Visual Studio leitet die Ablaufverfolgungsmeldungen an den Debug-Ausgabestream weiter. – orad

+6

Tracing ist etwas, ** was ** sollte in der Produktion verwendet werden. Es ist so wichtig, dass ** jedes ** Subsystem von Windows Tracing-Code enthält. Jede Festplattensuche, jede Speicherzuordnung, jeder Interrupt, jede CPU-Kontextumschaltung, jeder Thread-Zeitplan hat einen eingeblendeten Verfolgungscode. Die Event Tracing für Windows-Plattform (ETW) ist ein außerordentlich einfaches Verfolgungssystem, das jeder jederzeit aktivieren kann Windows PC. Die [System.Diagnostics.Tracing.EventSource] (https://msdn.microsoft.com/en-us/library/system.diagnostics.tracing.eventsource.aspx) ist die verwaltete Möglichkeit, Ablaufverfolgungsereignisse an ETW zu senden. –

3

Ich würde log4net für die Ablaufverfolgung verwenden, da seine Funktionen viel flexibler und robuster sind.

Aber für echte Debug-Nachrichten, die ich nie für jemand anderes als mich oder einen internen Tester zu sehen beabsichtige, würde ich wahrscheinlich mit Debug bleiben.

+0

Die Frage, welches Logger-Framework vorzuziehen ist, zeigt, dass log4net nicht flexibler oder robuster ist als andere. http://stackoverflow.com/questions/4775194/when-should-i-use-tracing-vs-logger-net-enterprise-library-log4net-or-ukadc-di – sam

1

Sie haben Ihre eigene Frage beantwortet. Wenn Debug-Nachrichten nicht angezeigt wurden, konnten die Benutzer sie sehen. Nehmen wir zum Beispiel an:

 
Debug.WriteLine("Connecting to DB with username: blah and PW: pass"); 

Jeder, der Ihren Code dekompiliert, kann das sehen. Aber das kann etwas sein, das Sie während des Tests wissen sollten.

Spur ist anders. Wenn Sie Trace verwenden, würde ich wahrscheinlich nur log4net verwenden.

2

Bei hochleistungssensitiven Codeblöcken kann das Zurücklassen von Trace kompiliert, aber deaktiviert einen Leistungsunterschied verursachen.

3

Der einzige Unterschied zwischen Trace und Debug ist, dass Trace-Anweisungen standardmäßig im Programm enthalten sind, wenn es in einen Release-Build kompiliert wird, während das Debug-Statement nicht ist.

Daher wird die Debug-Klasse hauptsächlich für das Debugging in der Entwicklungsphase verwendet, während die Trace für Testen und Optimieren verwendet werden kann, nachdem die Anwendung kompiliert und freigegeben wurde.

+2

Dies hängt vollständig von der TRACE-Kompilierungskonstante ab, die vorhanden ist. Dies ist die Standardeinstellung für Debug und Release. –

5

Debuggen wird zu reinen Debugging-Zwecken verwendet. Es sendet umfangreiche Nachrichten in der Debug-Ausführung (Debug-Modus).

Trace hilft beim Debuggen, Bugfixing und Profiling von Anwendungen (nach der Veröffentlichung).

Die Debug-Klasse ist im Freigabemodus nicht von Nutzen.

+1

Dies hängt vollständig von den Kompilierungskonstanten TRACE und DEBUG ab. –

+0

@VincePanuccio Die Standard-Build-Einstellungen sind, was sie sind, weil Debug und Trace verwendet werden sollen, wie diese Antwort angibt. Ja, Sie können die TRACE- und DEBUG-Konstanten ändern, um ein anderes Verhalten zu erhalten, aber es ist nicht so, wie die beiden Klassen aussehen. – Darryl