当应用程序在Windows上崩溃并且安装了Visual Studio等调试程序时,将显示以下模式对话框:
[标题:Microsoft Windows]
X已停止工作
一个问题导致程序停止正常工作.Windows将关闭程序并在解决方案可用时通知您.
[调试] [关闭申请]
有没有办法禁用此对话框?也就是说,让程序崩溃并无声地刻录?
我的情况是我想运行几个自动化测试,其中一些将因测试中的应用程序中的错误而崩溃.我不希望这些对话框停止自动化运行.
搜索我认为我已经找到了在Windows XP上禁用此功能的解决方案,这是修改此注册表项:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
但是,这在Windows Vista上不起作用.
要强制Windows错误报告(WER)进行故障转储并关闭应用程序,而不是提示您调试程序,您可以设置这些注册表项:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting] "ForceQueue"=dword:00000001 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent] "DefaultConsent"=dword:00000001
设置完成后,当您的应用程序崩溃时,您应该看到*.hdmp和*.mdmp文件:
%ALLUSERSPROFILE%\Microsoft\Windows\WER\
看这里:
http://msdn.microsoft.com/en-us/library/bb513638.aspx
注册表编辑器
DWORD HKLM或HKCU\Software\Microsoft\Windows\Windows错误报告\ DontShowUI ="1"
会让WER默默地报道.然后你可以设置
DWORD HKLM或HKCU\Software\Microsoft\Windows\Windows错误报告\禁用="1"
阻止它与MS交谈.
我不确定这是否指的是完全相同的对话框,但这是Raymond Chen的另一种方法:
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX); SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
我不得不禁用这个用于Firefox的Windows 64位的发布自动化工作,我做了以下事情:
输入gpedit.msc
计算机配置 - >管理模板
Windows组件 - > Windows错误报告
将"防止显示关键错误的用户界面"设置为"已启用"
它类似于客户体验报告所完成的内容:http: //www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm
在我的上下文中,我只想抑制单元测试的弹出窗口,而不是整个系统.我发现需要一组函数来抑制这些错误,例如捕获未处理的异常,抑制运行时检查(例如堆栈指针的有效性)和错误模式标志.这是我用过的一些成功:
#include#include int exception_handler(LPEXCEPTION_POINTERS p) { printf("Exception detected during the unit tests!\n"); exit(1); } int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...) { printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName); exit(1); } int main() { DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX); SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX); SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler); _RTC_SetErrorFunc(&runtime_check_handler); // Run your tests here return 0; }
在WPF应用程序中
[DllImport("kernel32.dll", SetLastError = true)] static extern int SetErrorMode(int wMode); [DllImport("kernel32.dll")] static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter); public delegate bool FilterDelegate(Exception ex); public static void DisableChashReport() { FilterDelegate fd = delegate(Exception ex) { return true; }; SetUnhandledExceptionFilter(fd); SetErrorMode(SetErrorMode(0) | 0x0002 ); }