767

I am trying to write a message to the output window for debugging purposes. I searched for a function like Java's system.out.println(""). I tried Debug.Write, Console.Write, and Trace.Write. It does not give an error, but it does not print anything either.

"Define DEBUG constant" and "Define TRACE constant" options are checked.

Menu ToolsOptionsDebugging"Redirect all Output Window text to the Immediate Window" option is not checked.

Configuration: Active (Debug)

Note: I created a project with the wizard as "Windows Forms Application" if relevant. I have no idea where to look.

5
  • 12
    Since this is an older post, I'll add this as a comment for those who stumble across the question. Instead of actually changing code, you can also use special breakpoints called tracepoints. See MSDN documentation Commented Mar 22, 2013 at 15:15
  • 16
    Just a reminder that Debug.WriteLine() will only work when running in Debug. That means running it with F5 and not CTRL-F5. This is easy to miss. Commented Jul 15, 2013 at 14:38
  • 4
    That's true, but a handy tool is DebugView which shows all output to the debug stream when running outside of the debugger Commented Aug 23, 2013 at 13:39
  • 2
    If you are trying to write output from a unit test running under the Visual Studio test framework the rules are a little different, see this answer for details.
    – yoyo
    Commented Mar 8, 2016 at 19:54
  • 1
    Just to add on the comment @kirk.burleson made; if you use Debug.Write in a library, and you build the library in release mode (which is often the case with nuget packages), then it won't log even if you run your tests/application in debug mode. I would suggest Trace.Write as an alternative
    – Rob
    Commented Jan 21, 2019 at 13:19

12 Answers 12

929

Add the System.Diagnostics namespace, and then you can use Debug.WriteLine() to quickly print a message to the output window of the IDE. For more details, please refer to these:

5
  • 3
    Thank you. I assume there is no way to write to output if i start without debugging (ctrl-f5) right? Commented Feb 27, 2012 at 14:59
  • 1
    I guess you're looking for this: stackoverflow.com/questions/562590/…
    – Bhargav
    Commented Feb 27, 2012 at 15:04
  • Thanks again but that is not worked for me. Trace does not print in without debuging mode even if TRACE constant defined. Commented Feb 27, 2012 at 15:18
  • Just ran a small app here, works fine for me. Perhaps there is a small glitch in your environment?
    – Bhargav
    Commented Feb 27, 2012 at 15:41
  • 1
    This is my test code; pastebin.com/b7P0bYEa It is pretty simple but still nothing. I will try it on another system. Commented Feb 27, 2012 at 16:24
196

This will write to the debug output window:

using System.Diagnostics;

Debug.WriteLine("Send to debug output.");
3
  • 9
    For me this "outputs" to the Immediate window
    – nuander
    Commented Mar 10, 2015 at 22:28
  • I tried this on a set of unit tests. I debugged the selected test, but there was nothing of what I tried to print out in the debug window.
    – Frank H.
    Commented Apr 22, 2015 at 16:13
  • This does output to the Debug window, however, only after I close the web page. I would like an immediate display when I execute the code. Wait a minute - I found that the output window is hidden while the code is executing. If I display the window, my output is there.
    – Joe Cotton
    Commented Nov 10, 2016 at 19:37
84
Debug.WriteLine

is what you're looking for.

If not, try doing this:

Menu ToolsOptionsDebugging → uncheck Send Output to Immediate.

4
  • 1
    Possibly Debug.Write() is not inserting the carriage return, so messages are getting buffered up? Commented Feb 27, 2012 at 14:44
  • 2
    I was not seeing the Debug.WriteLine("String") until after I did what Micah said. Tools|Options|Debugging uncheck Send Output to Immediate Commented Sep 25, 2013 at 18:29
  • 6
    I think in the later versions the check box is "Redirect all Output Window text to Immediate Window" Commented Feb 12, 2015 at 21:05
  • 13
    in VS 2015 it's called: "Redirect all Output Window text to the Immediate Window", just in case, some had to look for 5 mins to find the appropriate setting :) - I was scrolling up and down to find an optiona starting with "Send..." :)
    – dba
    Commented Jun 1, 2016 at 8:49
33

For me, only the Trace namespace and not the Debug one worked:

System.Diagnostics.Trace.WriteLine("message");

I'm working in a C# project under Visual Studio 2010.

1
  • 2
    I'm using VS 2013 Professional and attempting to get output from a unit test using the Visual Studio unit test framework. It appears the test harness captures and redirects Debug.WriteLine but not Trace.WriteLine. And you won't see Trace output either unless you debug the tests (not just run them).
    – yoyo
    Commented Mar 7, 2016 at 23:27
17

You may be looking for

MessageBox.Show("A message")

or

Debug.WriteLine("A message")
5
  • 11
    MessageBox.Show() can be very annoying when you want to write multiple values for debugging purposes. Commented Jul 13, 2015 at 14:25
  • 5
    The Question was "Writing to output window of Visual Studio?" not to a message box. Commented Jul 31, 2016 at 11:47
  • @AmirTwito A message box is an output window.
    – ProfK
    Commented Aug 21, 2016 at 12:36
  • 4
    Yes you right, but the question was "Writing to output window of Visual Studio?" and not to a simple message box using this code: MessageBox.Show() Commented Aug 29, 2016 at 5:57
  • 5
    @ProfK The Visual Studio Output Window is a very specific GUI element of the specific program, and MessageBox.Show does not write to it.
    – jpmc26
    Commented Mar 10, 2019 at 17:04
14

The call

System.Diagnostics.Debug.WriteLine("message");

fails when working with .NET Core (V 1.0 or 1.1).

We are supposed to create and use a logger from Microsoft.Extensions.Logging, but that log only appears in the dotnet.exe popup console window, not in Visual Studio's Output window.

1
  • So Debug.WriteLine(), Console.WriteLine() and Trace.WriteLine() are not outputting anything in Output for .Net Core? Any way to use some sort of simple logging without having to write a Logclass? Have searched in Tools > Options > Debugging and checked the "Show output from:" for possible solutions. Commented Mar 8, 2018 at 8:00
8

For debugging purposes, the System.Diagnostics.Debug.WriteLine() command will not be compiled into the release version of your code unless you have debug listeners. It writes to all trace listeners which includes the VS output window when running in Debug mode.

For a Console application. Console.WriteLine() would work but the output would still be generated in the release version of your binary.

Debug output should also appear in the normal output window when debugging tests; whereas, console.writeline output does not (but can be found in the test output window.)

0
5

This requires a third party framework, namely Serilog, but I've nonetheless found it to be a very smooth experience with getting output to some place I can see it.

You first need to install Serilog's Trace sink. Once installed, you need to set up the logger like this:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .CreateLogger();

(You can set a different minimum level or set it to a config value or any of the normal Serilog functionality. You can also set the Trace logger to a specific level to override configs, or however you want to do this.)

Then you just log messages normally and they show up in your Output window:

Logger.Information("Did stuff!");

This doesn't seem like such a big deal, so let me explain some additional advantages. The biggest one for me was that I could simultaneously log to both the Output window and the console:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
    .CreateLogger();

This gave me great flexibility in terms of how I consumed output, without having to duplicate all my calls to Console.Write with Debug.Write. When writing the code, I could run my command line tool in Visual Studio without fear of losing my output when it exited. When I had deployed it and needed to debug something (and didn't have Visual Studio available), the console output was readily available for my consumption. The same messages can also be logged to a file (or any other kind of sink) when it's running as a scheduled task.

The bottom line is that using Serilog to do this made it really easy to dump messages to a multitude of destinations, ensuring I could always readily access the output regardless of how I ran it.

It also requires very minimal set up and code.

3
  • 1
    Serilog now also has a "debug" sink at github.com/serilog/serilog-sinks-debug that functions in a similar way, but has slightly nicer formatting :-) HTH! Commented Oct 4, 2017 at 22:22
  • Why not make a .net public(may be static) method and put there everything you need like Console.Write or Debug.Write etc and use it everywhere?
    – Saulius
    Commented Feb 21, 2019 at 10:34
  • @Saulius "The same messages can also be logged to a file (or any other kind of sink) when it's running as a scheduled task. The bottom line is that using Serilog to do this made it really easy to dump messages to a multitude of destinations, ensuring I could always readily access the output regardless of how I ran it."
    – jpmc26
    Commented Feb 21, 2019 at 10:58
3
Debug.Print("text here")

or

Console.WriteLine("text here")
2

This is not an answer to the original question. But since I found this question when searching for a means of interactively dumping object data, I figured others may benefit from mentioning this very useful alternative.

I ultimately used the Command Window and entered the Debug.Print command, as shown below. This printed a memory object in a format that can be copied as text, which is all I really needed.

> Debug.Print <item>

  id: 1
  idt: null
  igad: 99
  igbd: 99
  gl_desc: "New #20"
  te_num: "1-001-001-020"
1
  • Yep. Or when you want to get the JSON from a model to supply to a colleague System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(response));
    – rob_james
    Commented Jan 15, 2021 at 9:14
0

The following worked for me in Visual Studio 2015:

OutputDebugStringW(L"Write this to Output window in VS14.");

Read the documentation for OutputDebugStringW here.

enter image description here Note that this method only works if you are debugging your code (debug mode)

2
  • 17
    Is that C++? The question is tagged c#.
    – jpmc26
    Commented Oct 4, 2017 at 22:39
  • 1/ The example is C++, yes, but the Win32 API that is mentioned is not C++, it's plain C. 2/ In theory we should be able to call it from any language, but I tried importing it with /*using System.Runtime.InteropServices;*/ [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] static extern void OutputDebugStringW(string lpOutputString); and sadly, it did not work as intended (it did not print in the Debug output window of the C# project like System.Diagnostics.Debug.WriteLine() would).
    – numdig
    Commented Jun 17, 2021 at 16:51
0

For anyone using NCrunch, Debug output is redirected to the NCrunch 'Trace Output' window.

Not the answer you're looking for? Browse other questions tagged or ask your own question.