当Windows服务崩溃时,是否可以创建一个完整的内存转储?显然,有一些众所周知的死后调试器,可以收集失败进程的内存转储。但Windows服务的问题在于,它们是在系统上下文中运行的,而不是在用户上下文中运行。有人能帮我吗?
到目前为止,我用WinDbg:尝试过
- 我通过执行WinDbg-I将WinDbg设置为默认的死后调试器
- 我验证了在注册表的两个位置(HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug和HKLM\SOFSOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion \AeDebbug)中存在两个条目Auto和Debugger
- 我通过将调试器条目更改为"Path\WinDbg.exe"-p%ld–c".dump/ma/u D:\CrashDump.dmp"-e%ld–g,将WinDbg配置为在启动时自动写入内存转储
- 我验证了WinDbg对内存转储文件的目标位置具有管理权限和不具有管理权限
但它不起作用(
如果我编写的是一个正常的用户模式应用程序,它在启动后故意崩溃,WinDbg会弹出并自动将.dmp文件写入目标位置。但如果我的服务崩溃,它不会。在任务管理器中,我可以看到WinDbg在我的服务崩溃后启动,但两者都保留在列表中,没有任何转储文件。
确保AeDebug键的Auto设置为1。同时将windbg命令行更改为:"PathWinDbg.exe" -p %ld –c ".dump /ma /u D:CrashDump.dmp;qd" -e %ld –G
如果不从被调试对象分离,调试器将等待进一步的命令。此外,-G选项将在进程结束后立即关闭调试器。sysinternals中的procdump配置简单,可能更适合此类场景——它还可以创建全内存转储,并使用:procdump -ma -i D:crashdump
命令进行安装。