Re: Why does service die immiately after ::Sleep or ::accept?
Call SetServiceStatus with a long hint before that, 5 minutes for
example, before your sleep. Otherwise the SCM considers your
service unresponsive and terminates it.
Alternatively, consider using gflags to attach a debugger automatically
when you start the service.
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"Siegfried Heintze" <siegfried@heintze.com> wrote in message
news:ui1AlJN%23HHA.5164@TK2MSFTNGP05.phx.gbl...
I'm having a heck of a time debugging my client's C++ ATL service. The
source code appears to have been generated by the VS/ATL service wizard.
It was working Friday morning and stopped Friday afternoon for no apparent
reason. It seems to be working fine for all of my collegues.
I want to run this program as a service and single step thru it with the
debugger so I can diagnose a problem. I have done this many times
previously. However, it always dies before I get to the problem I am
trying to diagnose.
When I use F5 to run it as a normal desktop program and I try single
stepping with the VS debugger, everything seems fine until I get to the VS
generated code:
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER |
CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);
which returns 0x80004015 which means "The class is configured to run as a
security id differnt from the caller". Hmmm... No big surprise!
So this tells me I have to run it as a service.
So in _tWinMain I insert "::Sleep(2*60*1000);" and recompile and register
the service. I then attach the debugger and set a break point after the
call to sleep. Then VS reports that the program exited with exit code 0!
It never hit my break point!
Hmmm... So I start the service again and attach using the VS debugger
again. This time, I click the break all button and unwind the stack. Ah
good! I say. I'm in the sleep function. I hit F5 and the same thing
happens: program exits with exit code 0 and never gets to my break point.
I try recompiling with a hard break point after the call to sleep but this
does not help: same symptoms! I repeat the procedure again except use F10
instead of F5. No luck: same symptoms.
So I figure there is something wrong with calling Sleep so I replace the
call to sleep and insert the code to read from a synchronous socket. I run
the service, attach with the debugger, break all and yes: I am blocking on
the socket. So then I point the web browser at it to release it (so it can
hit my break point) and again it dies as before: "program exited with exit
code 0."
Now mind you: I have placed the calls to sleep and the socket code in
WinMain after it parses the command line. It gets considerably further
than this when I use F5 in VS to run it as a normal desktop program.
So why does it die immedatly after the call to sleep or ::accept only when
it is run as a service and runs much further as a normal windows program?
Siegfried