Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / BCLDebug.cs / 1305376 / BCLDebug.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: BCLDebug ** ** ** Purpose: Debugging Macros for use in the Base Class Libraries ** ** ============================================================*/ namespace System { using System.IO; using System.Text; using System.Runtime.Remoting; using System.Diagnostics; using Microsoft.Win32; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security.Permissions; using System.Security; using System.Diagnostics.Contracts; [Serializable] internal enum LogLevel { Trace = 0, Status = 20, Warning= 40, Error = 50, Panic = 100, } internal struct SwitchStructure { internal String name; internal int value; internal SwitchStructure (String n, int v) { name = n; value = v; } } // Only statics, does not need to be marked with the serializable attribute [System.Security.SecuritySafeCritical] // auto-generated internal static class BCLDebug { internal static bool m_registryChecked=false; internal static bool m_loggingNotEnabled = false; internal static bool m_perfWarnings; internal static bool m_correctnessWarnings; internal static bool m_safeHandleStackTraces; #if _DEBUG internal static bool m_domainUnloadAdded; #endif internal static PermissionSet m_MakeConsoleErrorLoggingWork; static readonly SwitchStructure[] switches = { new SwitchStructure("NLS", 0x00000001), new SwitchStructure("SER", 0x00000002), new SwitchStructure("DYNIL",0x00000004), new SwitchStructure("REMOTE",0x00000008), new SwitchStructure("BINARY",0x00000010), //Binary Formatter new SwitchStructure("SOAP",0x00000020), // Soap Formatter new SwitchStructure("REMOTINGCHANNELS",0x00000040), new SwitchStructure("CACHE",0x00000080), new SwitchStructure("RESMGRFILEFORMAT", 0x00000100), // .resources files new SwitchStructure("PERF", 0x00000200), new SwitchStructure("CORRECTNESS", 0x00000400), new SwitchStructure("MEMORYFAILPOINT", 0x00000800), new SwitchStructure("DATETIME", 0x00001000), // System.DateTime managed tracing }; static readonly LogLevel[] levelConversions = { LogLevel.Panic, LogLevel.Error, LogLevel.Error, LogLevel.Warning, LogLevel.Warning, LogLevel.Status, LogLevel.Status, LogLevel.Trace, LogLevel.Trace, LogLevel.Trace, LogLevel.Trace }; #if _DEBUG internal static void WaitForFinalizers(Object sender, EventArgs e) { if (!m_registryChecked) { CheckRegistry(); } if (m_correctnessWarnings) { GC.GetTotalMemory(true); GC.WaitForPendingFinalizers(); } } #endif [Conditional("_DEBUG")] [ResourceExposure(ResourceScope.None)] static public void Assert(bool condition, String message) { #if _DEBUG // Speed up debug builds marginally by avoiding the garbage from // concatinating "BCL Assert: " and the message. if (!condition) System.Diagnostics.Assert.Check(condition, "BCL Assert", message); #endif } [Pure] [Conditional("_LOGGING")] [ResourceExposure(ResourceScope.None)] static public void Log(String message) { if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize()) return; if (!m_registryChecked) { CheckRegistry(); } System.Diagnostics.Log.Trace(message); System.Diagnostics.Log.Trace(Environment.NewLine); } [Pure] [Conditional("_LOGGING")] [ResourceExposure(ResourceScope.None)] static public void Log(String switchName, String message) { if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize()) return; if (!m_registryChecked) { CheckRegistry(); } try { LogSwitch ls; ls = LogSwitch.GetSwitch(switchName); if (ls!=null) { System.Diagnostics.Log.Trace(ls,message); System.Diagnostics.Log.Trace(ls,Environment.NewLine); } } catch { System.Diagnostics.Log.Trace("Exception thrown in logging." + Environment.NewLine); System.Diagnostics.Log.Trace("Switch was: " + ((switchName==null)?"":switchName) + Environment.NewLine); System.Diagnostics.Log.Trace("Message was: " + ((message==null)?" ":message) + Environment.NewLine); } } // // This code gets called during security startup, so we can't go through Marshal to get the values. This is // just a small helper in native code instead of that. // [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern static int GetRegistryLoggingValues(out bool loggingEnabled, out bool logToConsole, out int logLevel, out bool perfWarnings, out bool correctnessWarnings, out bool safeHandleStackTraces); private static void CheckRegistry() { if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize()) return; if (m_registryChecked) { return; } m_registryChecked = true; bool loggingEnabled; bool logToConsole; int logLevel; int facilityValue; facilityValue = GetRegistryLoggingValues(out loggingEnabled, out logToConsole, out logLevel, out m_perfWarnings, out m_correctnessWarnings, out m_safeHandleStackTraces); // Note we can get into some recursive situations where we call // ourseves recursively through the .cctor. That's why we have the // check for levelConversions == null. if (!loggingEnabled) { m_loggingNotEnabled = true; } if (loggingEnabled && levelConversions!=null) { try { //The values returned for the logging levels in the registry don't map nicely onto the //values which we support internally (which are an approximation of the ones that //the System.Diagnostics namespace uses) so we have a quick map. Assert(logLevel>=0 && logLevel<=10, "logLevel>=0 && logLevel<=10"); logLevel = (int)levelConversions[logLevel]; if (facilityValue>0) { for (int i=0; i ":switchName) + Environment.NewLine); System.Diagnostics.Log.Trace("Message was: " + ((message==null)?" ":message) + Environment.NewLine); } } // // This code gets called during security startup, so we can't go through Marshal to get the values. This is // just a small helper in native code instead of that. // [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern static int GetRegistryLoggingValues(out bool loggingEnabled, out bool logToConsole, out int logLevel, out bool perfWarnings, out bool correctnessWarnings, out bool safeHandleStackTraces); private static void CheckRegistry() { if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize()) return; if (m_registryChecked) { return; } m_registryChecked = true; bool loggingEnabled; bool logToConsole; int logLevel; int facilityValue; facilityValue = GetRegistryLoggingValues(out loggingEnabled, out logToConsole, out logLevel, out m_perfWarnings, out m_correctnessWarnings, out m_safeHandleStackTraces); // Note we can get into some recursive situations where we call // ourseves recursively through the .cctor. That's why we have the // check for levelConversions == null. if (!loggingEnabled) { m_loggingNotEnabled = true; } if (loggingEnabled && levelConversions!=null) { try { //The values returned for the logging levels in the registry don't map nicely onto the //values which we support internally (which are an approximation of the ones that //the System.Diagnostics namespace uses) so we have a quick map. Assert(logLevel>=0 && logLevel<=10, "logLevel>=0 && logLevel<=10"); logLevel = (int)levelConversions[logLevel]; if (facilityValue>0) { for (int i=0; i
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Operand.cs
- AutomationPatternInfo.cs
- XmlSerializerAssemblyAttribute.cs
- VScrollProperties.cs
- TargetInvocationException.cs
- SemaphoreSecurity.cs
- GeneralTransform3DGroup.cs
- CellIdBoolean.cs
- InputBindingCollection.cs
- PageAdapter.cs
- CharacterShapingProperties.cs
- OutputCacheProfileCollection.cs
- Configuration.cs
- SimpleHandlerBuildProvider.cs
- Registry.cs
- CryptographicAttribute.cs
- WhereQueryOperator.cs
- Configuration.cs
- RootAction.cs
- PositiveTimeSpanValidatorAttribute.cs
- InkCanvasSelectionAdorner.cs
- OleDbDataReader.cs
- UnsafeNativeMethodsTablet.cs
- PriorityQueue.cs
- ForeignConstraint.cs
- OleDbCommand.cs
- WinCategoryAttribute.cs
- SplashScreenNativeMethods.cs
- EmptyQuery.cs
- FormatterConverter.cs
- OutputCacheSettings.cs
- HiddenField.cs
- SimpleApplicationHost.cs
- CaseCqlBlock.cs
- AnnotationStore.cs
- safemediahandle.cs
- DelayedRegex.cs
- ContextMenuStrip.cs
- FilteredDataSetHelper.cs
- XDeferredAxisSource.cs
- WebPartConnectionsCancelVerb.cs
- CalendarDesigner.cs
- LoadWorkflowAsyncResult.cs
- XmlSerializationReader.cs
- URLAttribute.cs
- HScrollBar.cs
- TrackingCondition.cs
- SamlSubjectStatement.cs
- PolyLineSegment.cs
- CellParagraph.cs
- SmtpNegotiateAuthenticationModule.cs
- Panel.cs
- GetIndexBinder.cs
- ToolBarOverflowPanel.cs
- WrappedKeySecurityTokenParameters.cs
- IconConverter.cs
- RadialGradientBrush.cs
- AsyncOperationContext.cs
- ObjectHelper.cs
- XsltInput.cs
- Wizard.cs
- CompatibleIComparer.cs
- SqlUserDefinedAggregateAttribute.cs
- NamespaceQuery.cs
- PathSegmentCollection.cs
- MtomMessageEncodingBindingElement.cs
- WebPartConnectionsCloseVerb.cs
- ShellProvider.cs
- dataprotectionpermissionattribute.cs
- ServiceOperationInvoker.cs
- PhysicalOps.cs
- NetworkStream.cs
- GroupBox.cs
- EventsTab.cs
- ErrorTableItemStyle.cs
- MgmtConfigurationRecord.cs
- StyleHelper.cs
- Activation.cs
- DataControlCommands.cs
- COM2AboutBoxPropertyDescriptor.cs
- DropShadowEffect.cs
- SecurityContext.cs
- XhtmlBasicObjectListAdapter.cs
- XmlUnspecifiedAttribute.cs
- DataGridViewCell.cs
- RoleGroup.cs
- TextServicesDisplayAttribute.cs
- XmlAttributeOverrides.cs
- CommonObjectSecurity.cs
- ConstraintManager.cs
- EnlistmentTraceIdentifier.cs
- SQLCharsStorage.cs
- TemplateControl.cs
- DoubleKeyFrameCollection.cs
- ScriptingJsonSerializationSection.cs
- Light.cs
- FactoryGenerator.cs
- CommaDelimitedStringAttributeCollectionConverter.cs
- SendKeys.cs
- StateDesigner.TransitionInfo.cs