在Windows环境(XP和Win 7)中:
我有一个应用程序托管一些不稳定的第三方代码,我无法在外部进程中控制,以保护我的主应用程序免受它所展示的令人讨厌的错误.我的父进程正在监视另一个进程,并在失败时执行"正确的事情(tm)".
我遇到的问题是,Watson博士仍在检测隔离进程中的崩溃,并在下行过程中附加到进程以进行崩溃转储.这有两个问题:1.显着减慢我检测故障所需的时间,因为在进行故障转储时进程保持活动状态.2.向用户显示恼人的弹出窗口,询问他们是否要将错误报告提交给Microsoft.
显然,我更愿意修复子进程中的错误,但鉴于它不是一个选项,我希望能够有选择地禁用Dr. Watson(以及Vista +中的Windows错误报告).
我在流程中运行了一些自己的代码,然后再转到不受信任的位,所以如果有一个我可以调用的API会影响当前进程,那就没问题了.
我知道:http://support.microsoft.com/default.aspx/kb/188296会禁用Dr.Watson整个机器.我不想这样做,因为它会让我成为一个糟糕的公民,无法在机器范围内进行设置.
我也知道Vista +中的WerSetFlags选项似乎会禁用当前进程的Windows错误报告,但我需要一些能够在早期操作系统版本上禁用Dr.Watson的东西.
我们的应用程序一直在抛出未处理的异常。DW20.exe像这样的测试案例记录这些:
EventType clr20r3, P1 clr20r3.exe, P2 1.0.0.0, P3 4af175d6, P4 clr20r3, P5 1.0.0.0, P6 4af175d6, P7 1, P8 a, P9 system.applicationexception, P10 NIL.
Run Code Online (Sandbox Code Playgroud)
P9是异常的名称。如果异常名称的长度超过32个字符,则DW20.exe对该名称进行哈希处理(并推测对哈希进行编码)。例如,异常“ LongExceptionWithNameThatIsOver32”记录为:
EventType clr20r3, P1 aspnet_wp.exe, P2 2.0.50727.3082, P3 492b8702, P4 app_web_bmcy0pha, P5 0.0.0.0, P6 4af86274, P7 59, P8 5, P9 3e3rjg2ow1fkknn0eqptakfytpvxew1k, P10 NIL.
Run Code Online (Sandbox Code Playgroud)
如您所见,P9不再是异常名称,而是名称的哈希。
我可以一次在我们的应用程序中抛出异常,但是我更愿意将异常名称提供给实用程序,而不是获取哈希。我相当确定DW20.exe是执行哈希处理的程序(而不是.NET运行时)。我想知道dw20.exe使用什么哈希/编码算法,因此我可以构建一个实用程序,该程序将处理所有异常并产生相应的哈希/编码。
我尝试将windbg附加到测试程序,但随后未调用dw20.exe。我试过将windbg附加到dw20.exe,当它出现有关传输到microsoft的对话框时,但是那时它已经记录了异常。我无法在windbg.exe的控制下启动dw20.exe,这将是找出正在使用的内容的一种方法。
JR
我们曾经在我们的生产环境中使用Dr.Watson日志文件和转储进行崩溃分析,但Dr. Watson不再是服务器2k8的一部分,我们的基础架构团队在2008年运行它时遇到了问题.
是否有可以类似方式使用的替代品?特别是,我们需要故障模块和地址导致崩溃(我们使用它与PDB和映射信息回溯到故障位置),它将不得不使用Windows服务(包括那些作为本地系统运行的服务).
谢谢你的任何建议.