2013-08-28 46 views
0

我有一个用C#编写的针对.NET Framework 4.0的生产Windows服务,它每天大约会间歇性崩溃一次。运行服务的远程站点上的系统管理员在最近发生崩溃时提取转储文件。分析在windbg中揭示的螺纹的一个抛出SEHException:使用SEHException分析Windows服务的崩溃转储

         PreEmptive GC Alloc    Lock 
     ID OSID ThreadOBJ State GC   Context  Domain Count APT Exception 
    22 c cdc 051c2600 1009220 Enabled 0f6af244:0f6b04d4 0054b9e0  0 MTA (Threadpool Worker) System.Runtime.InteropServices.SEHException (0f43a964) 

从该线程堆栈如下:

ChildEBP RetAddr 
091ee930 71fb28ca clr!JIT_Dbl2IntSSE2+0x6 
091ee954 71fb239a mscorlib_ni+0x2728ca 
091ee9ac 71fb2299 mscorlib_ni+0x27239a 
091ee9c4 738e21db mscorlib_ni+0x272299 
091ee9d4 73904a2a clr!CallDescrWorker+0x33 
091eea50 73904bcc clr!CallDescrWorkerWithHandler+0x8e 
091eeb94 73904c01 clr!MethodDesc::CallDescr+0x194 
091eebb0 73969c29 clr!MethodDesc::CallTargetWorker+0x21 
091eec90 73995c05 clr!QueueUserWorkItemManagedCallback+0x4b 
091eeca4 73995c87 clr!Thread::DoExtraWorkForFinalizer+0x114 
091eed54 73995d42 clr!Thread::ShouldChangeAbortToUnload+0x101 
091eedb4 73995dd9 clr!Thread::ShouldChangeAbortToUnload+0x399 
091eedd8 73a656d5 clr!Thread::ShouldChangeAbortToUnload+0x43a 
091eedf0 73969b67 clr!ManagedThreadBase::ThreadPool+0x15 
091eeebc 73a6525f clr!ManagedPerAppDomainTPCount::DispatchWorkItem+0xe6 
091eef2c 73a66ac5 clr!ThreadpoolMgr::NewWorkerThreadStart+0x20b 
091eef94 73995a08 clr!ThreadpoolMgr::WorkerThreadStart+0x3d1 
091efab8 7679eccb clr!Thread::intermediateThreadProc+0x4b 
091efac4 7715d24d kernel32!BaseThreadInitThunk+0xe 
091efb04 7715d45f ntdll!__RtlUserThreadStart+0x23 
091efb1c 00000000 ntdll!_RtlUserThreadStart+0x1b 

嵌入SEHException内的数据如下:

ClassName: System.Runtime.InteropServices.SEHException 
    Message: External component has thrown an exception. 
    HResult: -2147467259 
ErrorCode: -1073741132 

有什么想法可能会导致这种情况或可以做什么额外的分析?

+0

你有非托管代码中改变浮动过程处理器的控制寄存器。 –

回答

0

当你得到这样的错误,转换代码以十六进制格式,这是

HRESULT 80004005 
Error Code C00002B4 

谷歌搜索要好得多呢。

80004005是E_FAIL,一个非常通用的错误

C00002B4似乎EXCEPTION_FLOAT_MULTIPLE_FAULTS

如果您使用的是C++组件,并指定/计划生育:严格/FP:除编译器开关,这与.NET不再兼容。请参阅Microsoft的Specify Floating Point behavior。 .NET喜欢浮点异常被屏蔽。

您可以尝试通过声明

[DllImport("msvcr110.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int _controlfp(int n, int mask) 

和重置浮点行为,你所谓的C++代码之后修复此:

CallMyCppCodeHere(); 
_controlfp(0x9001f, 0xfffff); 
+0

我还记得,这种情况下有一个MDA,但我现在还弄不清它的名字。 –