Debugging 为Windows服务设置后期调试程序

Debugging 为Windows服务设置后期调试程序,debugging,windbg,postmortem-debugging,Debugging,Windbg,Postmortem Debugging,当Windows服务崩溃时,是否可以创建完整的内存转储?显然,有一些众所周知的事后调试器,可以收集失败进程的内存转储。但是Windows服务的问题是它们在系统上下文中运行,而不是在用户上下文中运行。 有人能帮我吗 到目前为止,我一直在使用WinDbg: 我通过执行WinDbg-I将WinDbg设置为默认的后期调试程序 我验证了在注册表的两个位置(HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug和HKLM\SOFTWARE\Wow6

当Windows服务崩溃时,是否可以创建完整的内存转储?显然,有一些众所周知的事后调试器,可以收集失败进程的内存转储。但是Windows服务的问题是它们在系统上下文中运行,而不是在用户上下文中运行。 有人能帮我吗

到目前为止,我一直在使用WinDbg:

  • 我通过执行WinDbg-I将WinDbg设置为默认的后期调试程序
  • 我验证了在注册表的两个位置(HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug和HKLM\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\AeDebug)中存在自动和调试器两个条目
  • 我将WinDbg配置为在启动时自动写入内存转储,方法是将调试器条目更改为“Path\WinDbg.exe”-p%ld–c.dump/ma/u D:\CrashDump.dmp”-e%ld–g
  • 我验证了WinDbg对内存转储文件的目标位置具有权限,无论是否具有管理权限
但它不起作用(

如果我编写了一个正常的用户模式应用程序,该应用程序在启动后故意崩溃,WinDbg会弹出并自动将.dmp文件写入目标位置。但如果我的服务崩溃,它不会。
在任务管理器中,我可以看到WinDbg在我的服务进程崩溃后启动,但两者都保留在列表中,没有任何转储文件。

确保AeDebug键的自动设置为1。同时将WinDbg命令行更改为:
“Path\WinDbg.exe”-p%ld–c“.dump/ma/ud:\CrashDump.dmp;qd”-e%ld–G


如果不从调试对象分离,调试器将等待进一步的命令。此外,-G选项将在进程结束后立即关闭调试器。配置简单且可能更适合这种情况的是来自系统内部的procdump-它还可以创建完整内存转储,您可以使用:
procdu安装它mp-ma-id:\crashdump
命令。

我猜你是对的。但是如果我尝试这个命令,procdump会说:“没有与指定名称匹配的进程正在运行。”嗯,这很奇怪。我会在家里检查它,但即使在他们的页面上,他们也有相同的调用示例()。确保d:\crashdump文件夹存在。啊,很抱歉。该文件夹是否已存在并不重要,但注册为实时调试器的功能似乎是ProcDump的新添加功能。在我当前安装的SysInternalsSite中,我有ProcDump v4.0。感谢您的链接,我下载了独立的可执行文件,即v6.0。N调用如何工作。谢谢。@lowleveldesign“-accepteula”选项可以与“-i”选项一起使用吗?procdump文档说,在使用“-i”选项时,只允许使用“-ma”、“-mp”和“-d”选项。否则,他的服务第一次崩溃时,procdump将阻止等待他接受EULA(作为服务帐户)但他不会看到它,因为它正在会话0中运行。看起来像
procdump-i
adds“-accepteula”,请参见