views:

2101

answers:

5

Today I ran into a problem were I needed to remote-debug a program. The program was launched from another system, so I really don't have an opportunity to interact with it on the command line. I could change its source easily though.

What I needed to happen was for the program to start normally, and then wait for me to attach to it with a debugger. I couldn't come up with a way to do it that made me happy. I did find the bug, but without the help of the debugger.

while(true) { }

Kept the process alive, and then I could "set next statement" with the debugger, but it seemed awkward and rude.

Console.ReadLine();

Seemed odd to type since there wasn't actually a Console for me to press enter at. (It didn't work, either. Set next statement and then run takes you back into the ReadLine() wait.)

So what kind of code can I insert into a .NET/CLR/C# program that says "wait here until I can attach with a debugger"?

+3  A: 

I don't know, since I've never tried it but I wonder if you could use System.Diagnostics.Debugger.Break() in order to have it hit a breakpoint and then wait for a debugger to attach. I assume a remote debugger would work, but I do not know for sure and currently do not have access to my home environment where I could easily mock it up and test my theory. There's an MSDN article talking about using it in an ASP.Net application so I imagine it would work.

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.break.aspx

Steven Behnke
+1  A: 

Set a timeout that gives you time to attach the debugger.

Thread.Sleep(30000);

Arron
+2  A: 
Debug.Assert(true);

should also work I guess. By the way, I also face this proble at times and I do

MessageBox.Show()

:P :P

+12  A: 

You can use the System.Diagnostics.Debugger.IsAttached property to check if a debugger is attached to the process. This application will wait until a debugger has been attached:

using System;
using System.Diagnostics;
using System.Threading;

namespace DebugApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Waiting for debugger to attach");
            while (!Debugger.IsAttached)
            {
                Thread.Sleep(100);
            }
            Console.WriteLine("Debugger attached");
        }
    }
}
Daniel Richardson
Thanks for this answer. I knew there had to be a way to check from code if a debugger was attached, and this was the first/best hit I got from searching.
David Hay
+2  A: 

This sounds like exactly what you need:

Debugger.Launch();

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx

"Launches and attaches a debugger to the process."

Martin Sherburn
This is absolutely the answer you want if you're not doing remote debugging. So long as the code you want to debug is on the local machine, this line of code will open a pop-up that lets you debug it with Visual Studio.(If you deploy this code to a test or production box though, the window will appear there, and your application might appear to hang)
kbaribeau