Reputation: 4969
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?
Upvotes: 9
Views: 5865
Reputation: 31548
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:
regedit.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
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:
While this dialog is open, attach remotely to your process, and press No
on the dialog.
Hope that helps.
Upvotes: 16
Reputation: 4969
Eventually after much digging around I realised WPF was the cause of the problem. Rudsen's blog reveals the answer.
In the application log would be the following error;
.NET Runtime 4.0 Error Reporting
EventType clr20r3, P1 eobfrontend.exe, P2 1.0.0.0, P3 4cd95cc7, P4 presentationframework, P5 4.0.0.0, P6 4ba1f8db, P7 78ff, P8 0, P9 system.windows.markup.xamlparse, P10 NIL.
Realised as Rudsen remarked "that the error means there was a runtime error parsing the xaml code". I follow the steps outlined "Open Debug > Exceptions and activate the checkbox in the "thrown" column for "Common Language Runtime Exceptions". Done so, Visual Studio will halt on all exceptions."
Upvotes: 0
Reputation: 176159
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);
Upvotes: 11