我们的单元测试会触发子进程,有时这些子进程会崩溃.发生这种情况时,会弹出一个Windows错误报告对话框,并且该过程保持活动状态,直到手动关闭该过程.这当然可以防止单元测试终止.
如何避免这种情况?
这是Win7中的一个示例对话框,其中包含常用设置:

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

如果我禁用检查解决方案(我似乎只能通过控制面板控制),它看起来像这样,但仍然出现并仍然停止程序死亡直到用户按下某些东西.记录WerAddExcludedApplication也具有此效果.

问题: 我需要禁用控制台应用程序的崩溃调试提示.
背景: 我们有一个应用程序可以与第三方同步信息,因为第三方在一天中的某些时间因连接问题而崩溃.我们无权访问源代码以正确捕获错误,因此我只需要应用程序失败并再试一次.我有另一个应用程序监视我们的同步工具,以确保它正在运行.
当同步应用程序崩溃时,会出现需要用户交互的调试提示.因为它停留在屏幕上,所以应用程序永远不会停止运行.结果,"健康检查"从未知道失败.
我大约2年前做过这个,但对于我的生活,我无法记住文章或所需的注册表路径.
谢谢,Brian
操作系统: Windows 2003 Server 应用程序类型: .NET 3.5控制台应用程序
FIX:发现者:John Knoeller
删除以下键
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger
我知道这可能乍一看看起来像你之前看到过的一个问题: 知道外部进程的窗口何时显示
但这有点不同.
我有一个C#asp.net Web应用程序,用于帮助人们为他们的程序创建安装程序.(这里的开发人员大多是机械工程师在一些计算工具中编写脚本方程式,他们不是软件人员,所以我们不希望他们花时间学习wix,调试安装程序,维护版本之间的GUID等等.)
服务器端将运行控制台应用程序"heat.exe"(wix工具附带的工具),以获取有关如何注册dll等的信息,当且仅当他们的存储库中有dll时...
我是这样做的:
public int runHeat(string filePath, string outputFile, ref string response)
{
response += "run heat.exe to harvest file data" + '\r' + '\n';
string args = "file " + '"' + filePath + '"' + " -srd -out" + '"' + outputFile + '"';
string command = Path.Combine(WixBinariesPath, "heat.exe");
string workPath = Path.GetDirectoryName(filePath);
StringBuilder outputBuilder;
ProcessStartInfo processStartInfo;
Process process;
outputBuilder = new StringBuilder();
processStartInfo = new ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.RedirectStandardOutput …Run Code Online (Sandbox Code Playgroud) 我的应用程序创建子进程.通常,这些过程运行和终止没有任何问题.然而,有时,他们会崩溃.
我目前正在使用python 子进程模块来创建这些子进程.我通过调用Popen.poll()方法检查子进程是否崩溃.不幸的是,由于我的调试器在崩溃时被激活,因此轮询不会返回预期的输出.
我希望能够看到调试窗口(不终止它),并且仍然能够检测进程是否在python代码中崩溃.
有没有办法做到这一点?
我想编写一个守护程序管理器来管理所有守护程序正在运行,就像这样(简化的伪代码):
void watchMe(filename)
{
while (true)
{
system(filename); //freezes as long as filename runs
//oh, filename must be crashed. Nevermind, will be restarted
}
}
int main()
{
_beginThread(watchMe, "foo.exe");
_beginThread(watchMe, "bar.exe");
}
Run Code Online (Sandbox Code Playgroud)
这部分已经工作 - 但是现在我面临的问题是,当观察到的应用程序 - 比如说foo.exe - 崩溃时,相应的系统调用会冻结,直到我确认这个漂亮的消息框:

这使守护进程无用.
我认为可能是一个解决方案是使观察到的程序(我控制)的main()"不可擦除",这样他们就可以优雅地关闭而不显示这个丑陋的消息框.
像这样:
try
{
char *p = NULL;
*p = 123; //nice null pointer exception
}
catch (...)
{
cout << "Caught Exception. Terminating gracefully" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它仍然会产生此错误消息:

("未经处理的异常...写入访问冲突......")
我已经尝试了SetUnhandledExceptionFilter和所有其他东西,但没有效果.
任何帮助将受到高度赞赏.
电贺
c# ×1
c++ ×1
debugging ×1
popen ×1
python ×1
registry ×1
subprocess ×1
unit-testing ×1
windows-7 ×1
wix ×1