如何debugging在启动时启动的进程?

我正在尝试将一个断点设置为在启动时启动的Windows服务。 由于我的一个不幸的错误,该服务强制机器进入重启循环:这意味着我不能达到一个稳定的状态,我可以部署一个修复程序,显然我不能尝试debugging服务在一个更方便的时间。

我可以在内核模式下使用windbg。 当服务碰到wmain函数的时候,我非常想打破它,但是我遇到了问题。

到目前为止,我发现我可以通过使用下面的命令加载图像时停止:

 !gflag +ksl sxe ld MyServiceExecutable.exe 

问题是,一旦中断,我发现自己处于一个空虚的过程,在这个过程中,我显然无法设置断点。 bm MyServiceExecutable!wmain说,它找不到符号,断点将被“延迟”,但它从来没有设置或达到。 在KERNEL32!BaseThreadInitThunk上设置一个断点KERNEL32!BaseThreadInitThunk似乎在运行的所有进程中或多或less的工作,我没有很多运气来停止在我的服务到目前为止。

Solutions Collecting From Web of "如何debugging在启动时启动的进程?"

好吧,这可能不是最好的办法,但它的工作。 MSFTs,请纠正我,如果我做一些愚蠢的事情!

第一部分是好的:

 kd> !gflag +ksl New NtGlobalFlag contents: 0x00440000 ksl - Enable loading of kernel debugger symbols ece - Enable close exception kd> sxe ld MyServiceExecutable.exe kd> g 

在内核模式下, sxe ld将仅在第一次加载可执行文件停止。

当调试器再次停止时,我们在新创建的进程中。 我们不再需要gflag了:

 kd> !gflag -ksl New NtGlobalFlag contents: 0x00400000 ece - Enable close exception 

虽然我们将需要EPROCESS指针:

 kd> .process Implicit process is now 00112233`44556677 

从这个角度来说,可以在nt符号上设置断点,所以我们使用NtMapViewOfSection ,因为每个dll都会调用它。

 kd> bp /p 0011223344556677 nt!NtMapViewOfSection kd> g 

在下一站ntdll应该被加载(如果需要的话,检查kn是否在堆栈中, .reload /user如果需要的话),所以你可以在RtlUserThreadStart上设置一个断点。 另外,我们要出来NtMapViewOfSection ,因为我们不再需要它,这将是一个麻烦。

 kd> bp /p 0011223344556677 ntdll!RtlUserThreadStart kd> bc 0 kd> g 

所有的符号应该在第一个用户线程开始的时候加载,所以你可以自由地设置你的断点,无论你想要的。

 kd> .reload /user kd> bp /p 0011223344556677 MyServiceExecutable!wmain kd> g 

使用MS描述的技术来调试winlogon,它涉及到使用内核模式和用户模式调试器。 请参阅“Debugging Tools for Windows”下载的debugger.chm文件中的“调试WinLogon”。