堆栈cookie检测代码检测到一个基于堆栈的缓冲区溢出

本文关键字:堆栈 检测 于堆栈 溢出 缓冲区 cookie 代码 一个 | 更新日期: 2023-09-27 18:18:01

我有一个长时间运行的I/o繁重(网络/磁盘)多线程c#桌面应用程序,它偶尔会因为"堆栈cookie检测代码检测到基于堆栈的缓冲区溢出"而崩溃。

崩溃线程的典型堆栈跟踪如下所示。

程序在运行30分钟到6小时之间,然后通常会因为类似的堆栈而崩溃。

我已经检查了崩溃期间其他应用程序线程的堆栈跟踪,没有注意到任何模式。

我考虑过可能是硬件问题,但是机器上有很多活动,没有其他损坏的迹象(应用程序崩溃,事件日志错误等)。

c#应用程序没有使用unsafe块,也没有使用unsafe块的库。

两个问题:

  • 是否有可能在下面的跟踪中获得System.ni.dll调用的符号?
  • 我怎样才能确定坠机的原因?(我最怀疑的是框架bug)

我的系统是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

堆栈cookie检测代码检测到一个基于堆栈的缓冲区溢出

我遇到了类似的行为。我想这是一个bug在RyuJIT编译器。为了避免这种情况,您需要在app.config中使用<useLegacyJit enabled="1" />回退到JIT64。这样的:

<runtime>
  <useLegacyJit enabled="1" />
</runtime>