[Mono-list] Diagnostic Messages

Jonathan Pryor jonpryor@vt.edu
26 May 2002 13:39:33 -0400

Comments inline.

On Sun, 2002-05-26 at 13:02, Miguel de Icaza wrote:
    > > --diagnostics=[trace | debug | all]
    > The debug switch shouldn't be on mono/mint, but on mcs instead.
    > A tracing switch should be on both mono/mint and mcs.
    This is very interesting.  I did not know about this feature.

Perhaps I'm mis-understanding you, but the feature doesn't exist.  The
current effort is to determine if it *should* exist.  Paul Trunley
raised an interesting alternative of using `syslog' instead.
    > By default mcs shouldn't emit code for calls to methods Assert, Fail,
    > Indent, Unindent and the various Write methods on both the Debug and Trace
    > classes. The Debug methods should only be emitted into IL code when you add
    > #define DEBUG to your sourcecode or provide the --define DEBUG switch to
    > mcs. Similarly, the Trace methods should only be emitted into IL code when
    > you add #define TRACE to your sourcecode or provide the --define TRACE
    > switch to mcs. When tracing methods are called from the IL code, by default
    > they'll show their output. Via the application configuration file you can
    > set the trace level or disable tracing completely.
    Where can I find these details?  I am very interested in implementing
    these features.

See the System.Diagnostics.ConditionalAttribute documentation:

(Beware line-splitting.)

In short, calls to methods that are marked [Conditional("symbol")] are
only present if the "symbol" is defined.  Thus, if you disassemble the
following program (assuming you compiled it with `csc.exe'):

	using System.Diagnostics;
	public class twl {
		public static void Main () {
			Trace.WriteLine ("Hello, world!");

You'll notice that `System.Diagnostics.Trace' is not referenced in the
generated executable, as it is conditional on TRACE.  The only way to
make it present is to `#define' it in the source code, or pass
`/define:symbol' to `csc.exe'.

Thus, [Conditional("symbol")] is equivalent to the following common C

	#ifdef symbol
		#define MACRO(args) /* do something... */
		#define MACRO(args) /* do nothing */

Try it, it's cool.

The application configuration file is another matter that I need to take
a closer look at.

 - Jon