【发布时间】:2014-08-10 18:22:39
【问题描述】:
我正在尝试在启动时启动的 Windows 服务中设置断点。由于我的不幸错误,该服务强制机器进入重新启动循环:这意味着我无法进入可以部署修复程序的稳定状态,显然我无法尝试调试服务在更方便的时间。
我可以在内核模式下使用windbg。当服务达到wmain 函数时,我非常想中断,但我遇到了问题。
到目前为止,我发现使用以下命令可以在加载图像时停止:
!gflag +ksl
sxe ld MyServiceExecutable.exe
问题是一旦中断,我发现自己处于一个空进程中,显然我无法在其中设置断点。 bm MyServiceExecutable!wmain 说它找不到符号并且断点将被“延迟”,但实际上它从未设置或到达。在KERNEL32!BaseThreadInitThunk 上设置断点似乎在所有正在运行的进程中或多或少地随机工作,到目前为止我没有太多运气停止我的服务。
【问题讨论】:
-
你不能简单地从命令行启动进程并在那里调试(如果你设计它以这种方式工作)。阻止启动通常意味着 ServiceInit 永远不会返回,这应该很容易调试。
-
@AloisKraus,在这个特定的例子中,我确切地知道错误是什么以及如何修复它,问题是机器无法进入我可以部署修复的状态。基本上,我的选择是“以你的方式进入功能状态”或“擦除机器”。
-
如果启动挂起,您不能强制蓝屏并调试创建的内存转储吗? msdn.microsoft.com/en-us/library/windows/hardware/…
-
@AloisKraus,在内核模式下使用 WinDbg 暂停系统是最简单的事情,只需按 Ctrl+Break 即可。我不是试图诊断问题,而是试图在不擦拭机器的情况下解决问题。
-
!gflag 显然不是 !gflags。