views:

1803

answers:

3

Hi all. I am creating my first Timer Job and want to debug it. I have installed the timer job through a feature, and added it to a webapplication's JobDefinitions collection, and added a SPMinuteSchedule to run every 5 minutes (for testing purposes).

Then, in Visual Studio I've tried attaching the debugger to the WebApplication's Process, the Central Admin process and the OWSTIMER.exe process, but it will not debug into the Execute Method of the TimerJob. What am I missing here.

P.S. The timer job status says succeeded, so it is running. Weird...

+2  A: 

Most common reasons:

  1. Did you do a debug build?
  2. Did you place the .pdb file in the same folder as the assembly? (A simple search should explain how - eg. Debugging Timer Jobs)
  3. Also read Debugging Custom Timer Jobs on MSDN for some tips.
  4. Perform the 3 R's: Re-build & Re-deploy assembly & Reset the Timer Service before trying to attach again.
mundeep
Added the Debug.Assert = false, restarted my machine, but OWSTimer is not loading my pdb (I even copied it to the c:\windows\assemly\GAC_MSIL\<assemblyname>\<version> folder????
Colin
Rebuilt the project, removed the assebly manually with windows explorer, then copied the file manually also with the explorer, then copied pdb again, and debug does hook into process....
Colin
Apologies forgot to mention the usual rebuild/redoploy/restart process, will edit answer :)
mundeep
+3  A: 

When I'm debugging TimerJobs I insert a Assertion at the very first begin of the Execute method, which will always fail. This results in a pop up every time the Execute method is called so you can be sure that the TimerJob was started and have enough time to attach the debugger. Of course you have to remove the Assertion before you go live.

System.Diagnostics.Trace.Assert(false);

One more important thing is that you restart the Timer Service after you deployed a new DLL. Otherwise the Timer Service will run the TimerJob from the old DLL.

Flo
It seems to be kinda working now... CLeaned solution and restarted timer, debugger is working...
Colin
Great! Debugging TimerJobs caused me some headache too.
Flo
Interesting idea to through the assertion... also if you use Debug.Assert instead of Trace.Assert then any release build you do won't have that code (though at somepoint in your debug build you would want to comment it out anyway).
mundeep
Just a side note: System.Diagnostics.Debugger.Break() should work aswell, its designed to pause the application and ask the user to attach the debugger.
JMD
Thanks for these info. You might be right, that Trace.Assert isn't the best solution.
Flo
What do you know... System.Diagnostics.Debugger.Break(); works for web parts to. No more figuring out which w3wp is the correct one.
Luc
+2  A: 

Debugger.Launch()

salgo60