我有以下场景:
- Windows 2008
- 使用特定用户凭据(即不是系统帐户)运行的服务。
- 该服务启动子进程
- 子进程启动,一秒钟后得到一个异常并崩溃
我正在尝试将调试器附加到子进程并在它崩溃之前调试它
我试图使用gflags并设置调试器。问题是服务在会话0中运行,因此Windbg是不可见的。我不能将服务设置为"允许与桌面交互",因为服务不能使用本地系统帐户,而是必须使用特定用户的凭据。
我不确定它是否打算这样工作,但我也试图使用windbg -pe从另一个windbg实例连接到会话0中的那个windbg(所以我会有两个windbg运行)。但是它不起作用——第二个实例似乎无法停止进程并查看它的调用堆栈。
任何想法如何附加调试器到子进程之前,它崩溃调试它?
您可以使用命令行调试器cdb。使用附加的cdb启动您的服务,并作为调试服务器启动。您可以添加以下命令
"c:program filesdebugging tools for windowscdbtcp:port=5500 -g -g
到注册表值的调试器(类型字符串)的注册表项
HKLMSoftwareMicrosoftWindows NTCurrentVersionImage File执行选项 YourApplication.Exe
然后使用windbg用
连接调试服务器windbg -remote tcp:server=localhost,port=5500
还有一个选项:
当WinDbg自动启动时,你确实看不到它。但是,您可以将ntsd配置为jit调试器,并启用远程调试。然后,您可以将您的WinDbg连接到ntsd并远程调试该进程。
为什么不从崩溃转储开始呢?http://www.codeproject.com/KB/debug/automemorydump.aspx
将Sleep(30000)
添加到子进程入口点。这将给您足够的时间连接调试器。