gpt4 book ai didi

unit-testing - 程序崩溃时如何终止程序? (这应该只是通过单元测试而不是永远卡住)

转载 作者:行者123 更新时间:2023-12-03 14:30:28 24 4
gpt4 key购买 nike

我们的单元测试会触发子进程,有时这些子进程会崩溃。发生这种情况时,会弹出一个 Windows 错误报告对话框,并且该进程保持事件状态,直到被手动解除。这当然可以防止单元测试永远终止。

如何避免这种情况?

这是 Win7 中的示例对话框,具有通常的设置:

alt text

如果我禁用 AeDebug 注册表项,JIT 调试选项消失:

alt text

如果我禁用检查解决方案(我似乎可以通过控制面板控制的唯一事情),它看起来像这样,但仍然出现并且仍然阻止程序死亡,直到用户按下某些东西。 WerAddExcludedApplication被记录为也有这种效果。

alt text

最佳答案

jdehaan 和 Eric Brown 以及 this question 的答案摘要(另见 this question):

注: 这些解决方案也可能影响其他错误报告,例如无法加载 DLL 或打开文件。

选项 1:全局禁用

在整个用户帐户或机器上全局工作,这既是优点也是缺点。

设置 [HKLM|HKCU]\Software\Microsoft\Windows\Windows Error Reporting\DontShowUI为 1。
更多信息:WER settings .

选项 2:禁用应用程序

需要修改崩溃程序,在文档中描述为最佳实践,不适合库函数。

调用 SetErrorMode : SetErrorMode(SetErrorMode(0) | SEM_NOGPFAULTERRORBOX); (或使用 SEM_FAILCRITICALERRORS )。更多信息:Disabling the program crash dialog (解释了电话的奇怪安排)。

选项 2a:禁用功能 :

需要修改崩溃程序,需要 Windows 7/2008 R2(仅限桌面应用程序)或更高版本,在文档中描述为优先于 SetErrorMode ,适用于线程安全的库函数。

调用并重置SetThreadErrorMode :

DWORD OldThreadErrorMode = 0;
SetThreadErrorMode(SEM_FAILCRITICALERRORS,& OldThreadErrorMode);

SetThreadErrorMode (z_OldThreadErrorMode, NULL);

更多信息:可用的不多?

选项 3:指定处理程序

需要修改崩溃程序。

使用 SetUnhandledExceptionFilter 设置您自己的结构化异常处理程序,该处理程序简单地退出,可能带有报告并可能尝试清理。

选项 4:作为异常(exception)捕获

需要修改崩溃程序。仅适用于 .NET 应用程序。

将所有代码包装到全局 try/catch block 中。指定 HandleProcessCorruptedStateExceptionsAttribute 可能还有 SecurityCriticalAttribute 关于捕获异常的方法。更多信息: Handling corrupted state exceptions

备注 : 这可能无法捕获由 Managed Debugging Assistants 引起的崩溃;如果是这样,这些也需要在应用程序中禁用。

选项 5:停止报告进程

在整个用户帐户上全局工作,但仅限于受控的持续时间。

每当它出现时终止 Windows 错误报告进程:
var werKiller = new Thread(() =>
{
while (true)
{
foreach (var proc in Process.GetProcessesByName("WerFault"))
proc.Kill();
Thread.Sleep(3000);
}
});
werKiller.IsBackground = true;
werKiller.Start();

不过,这仍然不是完全安全的,因为控制台应用程序可能会通过不同的错误消息崩溃,显然是由一个名为 NtRaiseHardError 的内部函数显示的。 :

alt text

关于unit-testing - 程序崩溃时如何终止程序? (这应该只是通过单元测试而不是永远卡住),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3561545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com