相比通过输出日志来跟踪程序运行状态,我更倾向使用调试器。虽然我早知调试服务很麻烦,总不会比调试驱动还麻烦吧?基于这个想法,我尝试了在win7上使用windbg调试服务并记录于此。
windows上服务程序可分为两部分:服务安装程序和后台服务程序本身。服务安装程序路数比较固定,几乎不会出错,所以本文仅记录了调试后台服务程序的过程。我在服务管理器中创建了一个显示名为test的服务,ImagePath为:C:\Users\Administrator\Desktop\svr\Debug\srv.exe。
1.设置srv.exe,使其启动时自动启动windbg,这么设置的原因是为了方便调试服务的入口函数ServiceMain。用管理员权限开启windbg目录下的gflags.exe,在"Image File"标签页中填写Image名字(不用写全路径,当exe启动时,加载器会搜索注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution options下的项,如果有同名项,就为其加载Debugee)和调试器的路径。
2.设置test服务的属性,允许服务以交互式启动。
(一般情况下,这样设置就可以在服务管理器中右键启动服务。但是有些机器可能会失败,这可能是注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\NoInteractiveServices被置1----禁止服务交互)
3.设置结束后,即可在服务管理器中右键启动服务。启动时,Win7会弹出"Interactive Services Detection"对话框,选"View the message"即可以windbg调试的方式启动服务。
4.刚进入服务时,程序其实停留在main函数的StartServiceCtrlDispatcher函数内,尚未调用服务入口函数ServiceMain。这时需要尽快恢复程序执行让它今早执行完StartServiceCtrlDispatcher函数,否则服务管理器会因为长时间收不到来自服务的消息而终止服务的运行。(参见<深入解析Windows操作系统>4.2 服务启动 一节)。为了能使windbg在ServiceMain处中断,可以在服务入口加 int 3断点。之后,我们就可以慢慢的设置调试符号/下断点等。
5.另外,除了这种调试方式,还有Attach进程的调试方式。这种方式适合在确定ServiceMain没有问题后,调试服务创建的子线程。
标签:服务程序,管理器,windbg,启动,服务,调试 From: https://blog.51cto.com/u_13927568/5831326