大家
我想知道如何debuggingC中的Windows服务启动代码。有几个像这样的问题,但在C#中,但他们不是我所需要的。 到目前为止,我只能附加到进程debugging。现在我想debuggingmain()函数,该怎么做? 越详细越好。
非常感谢。
我的代码如下。
主function:
void main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MemoryStatus"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; //ServiceMain ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); }
ServiceMainfunction:
void ServiceMain(int argc, char** argv) { //...some codes.... hStatus = RegisterServiceCtrlHandler("MemoryStatus",(LPHANDLER_FUNCTION)ControlHandler); //...some codes.... //the worker loop of a service while(ServiceStatus.dwCurrentState == SERVICE_RUNNING) { char buffer[10]; sprintf(buffer,"login..."); int result = WriteToLog(buffer); if (result) { ReportStatus(SERVICE_STOPPED,-1); return; } Sleep(SLEEP_TIME); } return; }
和控制手柄function:
void ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_STOP: WriteToLog("Monitoring stopped."); //...Report Status to SCM code.... return; case SERVICE_CONTROL_SHUTDOWN: WriteToLog("Monitoring stopped."); //...Report Status to SCM code.... return; default: break; } //...Report Status to SCM code.... return; }
从一开始就有两种不同的方式来调试Windows服务。 这两个在这里描述。
我最喜欢的一个是使用以服务启动的远程调试器会话(您可以使用Windows调试工具中的ntsd
)。 Windows中有一个特殊的机制,使您能够根据映像名称劫持进程(映像文件执行选项)。 在下面你可以找到一个.reg文件的内容,它将为你设置这个调试器(把路径改成你安装了调试工具的路径):
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\svchost.exe] "Debugger"="\"C:\\tools\\debugging\\Debugging Tools for Windows (x64)\\ntsd.exe\" -server npipe:pipe=svcpipe -noio"
下一步是使用用户模式调试器附加到这个会话:
windbg -remote "npipe:pipe=svcpipe,server=localhost"
并准备好进行调试。 请记住在重新启动机器之前删除注册表设置,否则Windows将挂起黑屏:)
好的,有两种方法:首先,我们可以在代码的开始处睡眠服务进程。 喜欢这个:
main() { sleep(10); ..... }
然后附加到服务进程,调试器将停止在断点的位置,因为我们有10秒钟的等待时间。
其次,我们可以在代码的开头使用_ASSERT(FALSE)
或者DebugBreak()
函数。