Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何禁用Visual C++;Web服务器中的运行时错误?_C#_Wcf_Web Services_Error Handling_Windows Server 2003 - Fatal编程技术网

C# 如何禁用Visual C++;Web服务器中的运行时错误?

C# 如何禁用Visual C++;Web服务器中的运行时错误?,c#,wcf,web-services,error-handling,windows-server-2003,C#,Wcf,Web Services,Error Handling,Windows Server 2003,在Windows Server 2003计算机上运行WCF的生产web服务没有响应。我捕获了一个内存转储文件,以便在中进行分析 DebugDiag显示线程遇到OutOfMemoryException。通常,我们尝试捕获所有异常,将它们打印到事件日志中,然后将它们作为WCF故障返回 此OutOfMeMyExeExchange意外地未被捕获并导致C++错误。我承认.NET运行时无法处理此错误。当你没有记忆时,你就没有了记忆 分析表明,线程中的一个试图显示VisualC++运行时错误: 微软Visua

在Windows Server 2003计算机上运行WCF的生产web服务没有响应。我捕获了一个内存转储文件,以便在中进行分析

DebugDiag显示线程遇到OutOfMemoryException。通常,我们尝试捕获所有异常,将它们打印到事件日志中,然后将它们作为WCF故障返回

此OutOfMeMyExeExchange意外地未被捕获并导致C++错误。我承认.NET运行时无法处理此错误。当你没有记忆时,你就没有了记忆

分析表明,线程中的一个试图显示VisualC++运行时错误:

微软Visual C++运行库运行时错误!程序:C:\windows\system32\inetsrv”

堆栈跟踪如下所示:

ntdll!KiFastSystemCallRet    
ntdll!ZwRaiseHardError+c    
user32!ServiceMessageBox+145    
user32!MessageBoxWorker+13e    
user32!MessageBoxTimeoutW+7a    
user32!MessageBoxTimeoutA+9c    
user32!MessageBoxExA+1b    
user32!MessageBoxA+45    
msvcr71!__crtMessageBoxA+f4   f:\vs70builds\3052\vc\crtbld\crt\src\crtmbox.c @ 118 + 10 
msvcr71!_NMSG_WRITE+12e  f:\vs70builds\3052\vc\crtbld\crt\src\crt0msg.c @ 240 + 10 
msvcr71!abort+7   f:\vs70builds\3052\vc\crtbld\crt\src\abort.c @ 48 
kernel32!UnhandledExceptionFilter+12a    
kernel32!BaseThreadStart+4a    
kernel32!_except_handler3+61    
ntdll!ExecuteHandler2+26    
ntdll!ExecuteHandler+24    
ntdll!RtlRaiseException+3d    
kernel32!RaiseException+53    
msvcr80!_CxxThrowException+46    
mscorwks!ThrowOutOfMemory+24 
文件说明:

在基于Windows的单线程或多线程应用程序中,中止调用 Windows MessageBox函数用于创建消息框以显示 带有“确定”按钮的消息。当用户单击“确定”时,程序中止 立即。可以通过调用 用适当的论据

此消息框挂起了服务器。一个线程触发了GC,但此线程已禁用抢占式GC。其余大多数线程在等待GC完成时会阻塞

如何为web服务器提供支持?

--编辑--

OutOfMemoryException在处理大型数据集的一个线程中引发。一旦引发,就会引发跨上下文异常。这导致WinDbg中出现以下堆栈跟踪:

1c54eee8 78158e89 e06d7363 00000001 00000003 kernel32!RaiseException+0x53 (FPO: [Non-Fpo])
1c54ef20 7a14fd18 1c54ef30 7a37d92c 7a3c4aa8 **msvcr80**!_CxxThrowException+0x46 (FPO: [Non-Fpo])
1c54ef34 7a1082db f74a69a8 79f38888 1c54f108 mscorwks!ThrowOutOfMemory+0x24 (FPO: [Non-Fpo])
1c54f060 7a10a245 00000000 1c54f098 1c54f108 mscorwks!Thread::RaiseCrossContextException+0x408 (FPO: [Non-Fpo])
1c54f114 79fd882b 00000002 79fd87f6 1c54f20c mscorwks!Thread::DoADCallBack+0x2a2 (FPO: [Non-Fpo])
1c54f130 79e9846b 1c54f20c 1c54f1b8 79f7762b mscorwks!Thread::DoADCallBack+0x310 (FPO: [Non-Fpo])
1c54f1c4 79e98391 1c54f20c f74a6bc8 23e78e00 mscorwks!Thread::ShouldChangeAbortToUnload+0xe3 (FPO: [Non-Fpo])
1c54f200 79e9851d 1c54f20c 00000002 00000000 mscorwks!Thread::ShouldChangeAbortToUnload+0x30a (FPO: [Non-Fpo])
1c54f228 79fd8f6c 00000002 7a0b68a2 1c54f264 mscorwks!Thread::ShouldChangeAbortToUnload+0x33e (FPO: [Non-Fpo])
1c54f240 7a0b6b5b 00000002 7a0b68a2 1c54f264 mscorwks!ManagedThreadBase::ThreadPool+0x13 (FPO: [Non-Fpo])
1c54f294 7a0b6b8d 00000000 00000000 04a47fe0 mscorwks!BindIoCompletionCallbackStubEx+0x95 (FPO: [Non-Fpo])
1c54f2ac 79f3e605 00000000 00000000 04a47fe0 mscorwks!BindIoCompletionCallbackStub+0x13 (FPO: [Non-Fpo])
1c54f314 79f920a5 00000000 00000000 7ffdc000 mscorwks!ThreadpoolMgr::CompletionPortThreadStart+0x430 (FPO: [Non-Fpo])
1c54ffb8 77e64829 23e29018 00000000 00000000 mscorwks!Thread::intermediateThreadProc+0x49 (FPO: [Non-Fpo])
1c54ffec 00000000 79f9205f 23e29018 00000000 kernel32!BaseThreadStart+0x34 (FPO: [Non-Fpo])
该异常导致调用运行时以显示以下消息:

1c54e340 7c82775b 773d7a4b 50000018 00000004 ntdll!KiFastSystemCallRet
1c54e344 773d7a4b 50000018 00000004 00000003 ntdll!NtRaiseHardError+0xc
1c54e3a0 773b8377 1d05ff70 1d052e48 00012010 user32!ServiceMessageBox+0x145
1c54e4fc 7739eec9 1c54e508 00000028 00000000 user32!MessageBoxWorker+0x13e
1c54e554 773d7d0d 00000000 1d05ff70 1d052e48 user32!MessageBoxTimeoutW+0x7a
1c54e588 773c42c8 00000000 1c54e62c 7c37f480 user32!MessageBoxTimeoutA+0x9c
1c54e5a8 773c42a4 00000000 1c54e62c 7c37f480 user32!MessageBoxExA+0x1b
1c54e5c4 7c34c224 00000000 1c54e62c 7c37f480 user32!MessageBoxA+0x45
1c54e5f8 7c348e6c 1c54e62c 7c37f480 00212010 msvcr71!__crtMessageBoxA+0xf4 [f:\vs70builds\3052\vc\crtbld\crt\src\crtmbox.c @ 118]
1c54e81c 7c34cf83 0000000a 00000000 1c54ead4 msvcr71!_NMSG_WRITE+0x12e [f:\vs70builds\3052\vc\crtbld\crt\src\crt0msg.c @ 240]
1c54e854 77e761b7 1c54ead4 00000000 00000000 msvcr71!abort+0x7 [f:\vs70builds\3052\vc\crtbld\crt\src\abort.c @ 48]
1c54eaac 77e792a3 1c54ead4 77e61ac1 1c54eadc kernel32!UnhandledExceptionFilter+0x12a
1c54eab4 77e61ac1 1c54eadc 00000000 1c54eadc kernel32!BaseThreadStart+0x4a
1c54eadc 7c828752 1c54ee98 1c54ffdc 1c54ebb8 kernel32!_except_handler3+0x61
1c54eb00 7c828723 1c54ee98 1c54ffdc 1c54ebb8 ntdll!ExecuteHandler2+0x26
1c54eba8 7c82863c 1c549000 1c54ebb8 00010007 ntdll!ExecuteHandler+0x24
1c54ee88 77e4bee7 1c54ee98 00000002 e06d7363 ntdll!RtlRaiseException+0x3d
1c54eee8 78158e89 e06d7363 00000001 00000003 kernel32!RaiseException+0x53

我不确定为什么堆栈上有两个版本的Visual Studio运行时库。这是不寻常的。我看不到堆栈上有其他第三方DLL的证据。

您必须在程序集中调用Win32 set abort行为。您可以使用p/invoke来执行此操作

下面是一篇关于类似问题的有趣文章


他们建议这是一个尚未解决的已知问题,因此建议使用“设置”中止行为将其关闭。

这是堆栈的顶部吗?谁在调用
mscorwks!ThrowOutOfMemory
?听起来可能您调用的是一些不打算在服务应用程序中使用的代码。不,这是调用堆栈OutOfMeMyExtExeExchange生成了一个C++运行时异常。OutOfMeMyExeExchange的源是几个非常大的数据集加载到内存中。这是一个独立的问题。我想防止Web服务挂起这样的错误。您是说有一个.NETSoal.OutOfMeMyExeExchange?为什么会生成C++运行时EXC?是一个C++应用程序吗?这是一个.NET WCF应用程序,它试图把一个大数据集加载到内存中并返回给客户端。(我们使用WCF流,但这不是因为某种原因而使用的。)数据集导致了.NET OutOfMeMyExtExpRead被抛出。不知何故,这个OutOfMeMyExExchange被抛出作为C++错误。如果你是我,我会找出C++异常的来源。为什么C++运行时会出现?我相信这是正确的答案。我不确定把这个调用放在哪里——也许是在静态构造函数中。我还发现我们可以重写C++的系统行为。是这样的:。我向客户推荐他们现在在web服务器上设置ErrorMode=2。@Paul Williams您能确认注册表项设置对您的所有案例都有效吗?这是一个很好的发现。在我的案例中,注册表项设置不起作用。我们的w3wp过程仍然按照问题描述的方式挂起。