我有一个长时间运行的I / O重载(网络/磁盘)多线程c#桌面应用程序,它偶尔会崩溃,并显示“堆栈cookie工具代码检测到基于堆栈的缓冲区溢出”。
崩溃线程的典型堆栈跟踪如下所示。
该程序运行30分钟到6个小时之间的任何时间,通常会因类似的堆栈而崩溃。
在崩溃期间,我检查了其他应用程序线程的堆栈跟踪,但没有注意到任何模式。
我考虑过可能是硬件问题,但是计算机上有很多活动,没有其他损坏迹象(应用程序崩溃,事件日志错误等)。
据我所确定,C#应用程序不使用任何unsafe块,也没有使用这些unsafe块的库。
两个问题:
我的系统是i5-4790k(未超频),Windows 2012R2,目标是完全修补的.net 4.6 x64。
已完全修补的Visual Studio 2015。
运行Debug构建。
clr.dll!__report_gsfailure() Unknown
clr.dll!SafeHandle::Release(bool) Unknown
clr.dll!SafeHandle::Dispose(void) Unknown
clr.dll!SafeHandle::DisposeNative(class SafeHandle *) Unknown
System.ni.dll!00007ffa765ddc4b() Unknown
System.ni.dll!00007ffa765dda8a() Unknown
System.ni.dll!00007ffa765e7e0e() Unknown
System.ni.dll!00007ffa765c420f() Unknown
System.ni.dll!00007ffa765c41d4() Unknown
mscorlib.ni.dll!00007ffa7740f18a() Unknown
System.ni.dll!00007ffa76b19bbf() Unknown
System.ni.dll!00007ffa765e0d0b() Unknown
System.ni.dll!00007ffa7657ac4f() Unknown
System.ni.dll!00007ffa765e0508() Unknown
System.ni.dll!00007ffa765e0319() Unknown
System.ni.dll!00007ffa765e714d() Unknown
System.ni.dll!00007ffa765e6cdd() Unknown
System.ni.dll!00007ffa765e0157() Unknown
System.ni.dll!00007ffa765dfe48() Unknown
System.ni.dll!00007ffa765dfdb5() Unknown
System.ni.dll!00007ffa765dfa0d() Unknown
System.ni.dll!00007ffa765de83d() Unknown
System.ni.dll!00007ffa765de401() Unknown
System.ni.dll!00007ffa765de2e0() Unknown
System.ni.dll!00007ffa765dacac() Unknown
System.ni.dll!00007ffa765da9f0() Unknown
System.ni.dll!00007ffa765da22e() Unknown
System.ni.dll!00007ffa765d7fc7() Unknown
System.ni.dll!00007ffa765d743d() Unknown
System.ni.dll!00007ffa76579af6() Unknown
00007ffa19832eb7() Unknown
00007ffa1978eb0f() Unknown
00007ffa19844cfa() Unknown
00007ffa199e83d7() Unknown
00007ffa1978ce48() Unknown
00007ffa1978ccb5() Unknown
00007ffa199e810f() Unknown
mscorlib.ni.dll!00007ffa77d37116() Unknown
mscorlib.ni.dll!00007ffa77d22a90() Unknown
mscorlib.ni.dll!00007ffa77dfa795() Unknown
mscorlib.ni.dll!00007ffa773d2c97() Unknown
mscorlib.ni.dll!00007ffa773fa77e() Unknown
mscorlib.ni.dll!00007ffa773fa617() Unknown
mscorlib.ni.dll!00007ffa773d2f3d() Unknown
mscorlib.ni.dll!00007ffa773d2608() Unknown
mscorlib.ni.dll!00007ffa77386b50() Unknown
clr.dll!CallDescrWorkerInternal() Unknown
clr.dll!CallDescrWorkerWithHandler(struct CallDescrData *,int) Unknown
clr.dll!MethodDescCallSite::CallTargetWorker(unsigned __int64 const *) Unknown
clr.dll!QueueUserWorkItemManagedCallback(void *) Unknown
clr.dll!Frame::Push(void) Unknown
clr.dll!Frame::Push(void) Unknown
clr.dll!Frame::Push(void) Unknown
clr.dll!ManagedPerAppDomainTPCount::DispatchWorkItem(bool *,bool *) Unknown
clr.dll!ManagedPerAppDomainTPCount::DispatchWorkItem(bool *,bool *) Unknown
clr.dll!ThreadpoolMgr::ExecuteWorkRequest(bool *,bool *) Unknown
clr.dll!ThreadpoolMgr::WorkerThreadStart(void *) Unknown
clr.dll!Thread::intermediateThreadProc(void *) Unknown
kernel32.dll!BaseThreadInitThunk() Unknown
ntdll.dll!RtlUserThreadStart() Unknown
Run Code Online (Sandbox Code Playgroud)
我也遇到过类似的行为。我认为这是 RyuJIT 编译器中的一个错误。为了避免这种情况,您需要<useLegacyJit enabled="1" />在 app.config 中使用 JIT64。像这样:
<runtime>
<useLegacyJit enabled="1" />
</runtime>
Run Code Online (Sandbox Code Playgroud)