Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugging a C# executable that crashes on launch

I'm trying to remotely debug a C# program. Connecting to the host is not problem and I can see all the processes on running on that machine, and can connect to the msvsmon.exe.

However, the program I want to debug crashes immediately on launch giving me no time to attach myself to it. Also launching the debug executable in question through a remote location does nothing. How can I attach a debugger before the crash?

like image 548
wonea Avatar asked Nov 09 '10 11:11

wonea


People also ask

What is debugging in C?

Debugging is a methodical process of finding and reducing the number of bugs (or defects) in a computer program, thus making it behave as originally expected. There are two main types of errors that need debugging: ▶ Compile-time: These occur due to misuse of language constructs, such as syntax errors.

Is there a debugger for C?

Execute the C program in gdb debugger You can start running the program using the run command in the gdb debugger. You can also give command line arguments to the program via run args. The example program we used here does not requires any command line arguments so let us give run, and start the program execution.


2 Answers

One of my favorite tricks for attaching a debugger at program launch is using Image File Execution Options. It's a registry facility which allows you, amongst other things, attach a debugger to an application before its execution. Same trick allows, for example, replacing your Windows Task Manager with Process Explorer, or Notepad.exe with Notepad2.

You can read all about it here.

Here's how you set it up:

  • Run regedit.exe
  • Go to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  • Create a new key named as your exe (example: yourprogram.exe)
  • Create a new string value under your exe. The name of the string value is Debugger, and the value is vsjitdebugger.exe

When you run the executable, you will see the Just In Time prompt asking you to select a debugger:

vsjitdebugger

While this dialog is open, attach remotely to your process, and press No on the dialog.

Hope that helps.

like image 199
Igal Tabachnik Avatar answered Sep 18 '22 16:09

Igal Tabachnik


Crashing at launch might be due to a missing dependency. Run fuslogvw.exe before starting your application and see whether any of the binding operations fail.

If that doesn't help, it is generally a good practice to have diagnostic logging in place. You can use a dedicated logging library, e.g. log4net, or at least you should be using the simplest form of logging via System.Diagnostics.Trace. You can listen to the trace messages by either configuring a trace listener in the app.config or using third-party tools like a debugger or DebugView from Sysinternals.

If you actually want to attach a debugger you can insert a breakpoint programmatically:

System.Diagnostics.Debugger.Break();

I haven't checked how this works with a remote debugger, but as a last resort you can have your application sleep long enough to allow you to attach a debugger:

System.Threading.Thread.Sleep(30000);
like image 37
Dirk Vollmar Avatar answered Sep 21 '22 16:09

Dirk Vollmar