Start Debugger in Code

C#Visual Studio-2010Debugging

C# Problem Overview


I need to debug an application that is started from a one-click install. (VS 2010, Excel VSTO with Office 7). Based on login credentials supplied to the one-click installer application, the user should see one of two splash pages. This all works fine on my machine, but when deployed, changing from the default to the second splash page results in an error.

For the life of me, I can't figure out how to debug the process from within VS2010. I can attach to the login before entering the credentials, but I can't attach to Excel because it isn't launched until I click the OK button.

So, is there some way to have Excel, or rather, my code call the debugger as it is instantiated so I can figure out why my image resource isn't available in the deployed application?

Thanks.

Randy

C# Solutions


Solution 1 - C#

System.Diagnostics.Debugger.Launch();

Solution 2 - C#

Most simple

To force a breakpoint from code use:

if (System.Diagnostics.Debugger.IsAttached)
    System.Diagnostics.Debugger.Break();

When application wasn't started inside Visual Studio (including remote debugging)

Sometimes the application can't be started from Visual Studio but must be debugged. I use this code to check form inside the application if the Visual Studio is running and offer the possibility to attach it to the Visual Studio.

using System.Diagnostics;

....

// get debugger processes
Process[] procName1 = Process.GetProcessesByName("devenv");

// get remote debugging processes
Process[] procName2 = Process.GetProcessesByName("msvsmon"); 

// If Visual Studio or remote debug are running halt the application by showing a MessageBox and give opportunity to attach the debugger
if (procName1.Length > 0 || procName2.Length > 0)
{
	if (MessageBox.Show(Application.Current.MainWindow, "Force breakpoint?", "Wait for debugger attach", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
	{
		// Force a breakpoint when the debugger became attached
		if (System.Diagnostics.Debugger.IsAttached)
			System.Diagnostics.Debugger.Break(); // force a breakpoint
	}
}

Today I needed a solution for a console app. Here it is:

using System.Diagnostics;

....

// Wait for debugger attach and force breakpoint
// for a console app
//
if (!System.Diagnostics.Debugger.IsAttached) // not needed when debugger is already attached
{
	/// for "eternal" wait (~ 68 years) use: 
	///     int waitTimeout = int.MaxValue 
	int waitTimeout = 60; 

	// get debugger processes
	Process[] procName1 = Process.GetProcessesByName("devenv");

	// get remote debugging processes
	Process[] procName2 = Process.GetProcessesByName("msvsmon");

	// If Visual Studio or remote debug are running halt the application by showing an message and give opportunity to attach the debugger
	if (procName1.Length > 0 || procName2.Length > 0)
	{
		while (true)
		{
			Console.WriteLine("Visual studio is running | Force breakpoint? (Attach the debugger before pressing any key!)");
			Console.WriteLine("[Y]es, [No]");

			DateTime beginWait = DateTime.Now;
			while (!Console.KeyAvailable && DateTime.Now.Subtract(beginWait).TotalSeconds < waitTimeout)
			{
				Thread.Sleep(250); // sleep 1/4 second
			}

			if (!Console.KeyAvailable)
			{
				break; // timeout elapsed without any kepress
				//<----------
			}

			var key = Console.ReadKey(false);
			if (key.Key == ConsoleKey.Y)
			{
				if (System.Diagnostics.Debugger.IsAttached)
				{
					System.Diagnostics.Debugger.Break(); // force a breakpoint
					break; // leave the while(true)
					//<----------
				}
				else
				{
					Console.WriteLine("No debugger attached");
					Console.WriteLine("");
				}
			}
			else if (key.Key == ConsoleKey.N)
			{
				break; // leave the while(true)
				//<----------
			}
			Console.WriteLine("");
		}
	}
}

Solution 3 - C#

Juan's answer is the best if you have Visual Studio Installed. but if the target machne does not have it you may need to put in some kind of pause (I normally will put a dialog box as the first thing in main that makes it wait for me to attach) then use a remote debugger to attach to it on your machine

Solution 4 - C#

you could attach to Excel if it was running long enough but seriously I doubt the error is there.

you could attach to running applications/processes and if symbols are available (debug build) you can really debug, but the application has to live long enough for you to select it for attaching.

I think, from what you are saying, that what you need is proper exception and error logging, anything like Log4Net or NLog which stores everything (stack trace, exception details...) at every exception, so you would clearly identify what the real issue is.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEoRaptor013View Question on Stackoverflow
Solution 1 - C#Juan AyalaView Answer on Stackoverflow
Solution 2 - C#marsh-wiggleView Answer on Stackoverflow
Solution 3 - C#Scott ChamberlainView Answer on Stackoverflow
Solution 4 - C#Davide PirasView Answer on Stackoverflow